diff --git a/.gitignore b/.gitignore index 39a0d76c168..d60de4860ca 100644 --- a/.gitignore +++ b/.gitignore @@ -91,6 +91,7 @@ Mage.Verify/AllCards.json.zip Mage.Verify/AllSets.json.zip Mage.Verify/AllCards.json Mage.Verify/AllSets.json +/db releases Utils/author.txt diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/table/MageCardComparator.java b/Mage.Client/src/main/java/mage/client/deckeditor/table/MageCardComparator.java index 1570c99aa7a..11a8a9d24b7 100644 --- a/Mage.Client/src/main/java/mage/client/deckeditor/table/MageCardComparator.java +++ b/Mage.Client/src/main/java/mage/client/deckeditor/table/MageCardComparator.java @@ -27,6 +27,7 @@ package mage.client.deckeditor.table; import java.util.Comparator; + import mage.cards.MageCard; import mage.view.CardView; @@ -94,8 +95,8 @@ public class MageCardComparator implements Comparator { break; // Rarity case 6: - aCom = a.getRarity().toString(); - bCom = b.getRarity().toString(); + aCom = a.getRarity().getSorting(); + bCom = b.getRarity().getSorting(); break; // Set name case 7: diff --git a/Mage.Client/src/main/java/mage/client/util/Config.java b/Mage.Client/src/main/java/mage/client/util/Config.java index 9eb8751fd17..466f2ad08c4 100644 --- a/Mage.Client/src/main/java/mage/client/util/Config.java +++ b/Mage.Client/src/main/java/mage/client/util/Config.java @@ -33,8 +33,8 @@ public final class Config { static { Properties p = new Properties(); - try { - p.load(new FileInputStream(new File("config/config.properties"))); + try(FileInputStream fis =new FileInputStream(new File("config/config.properties"))) { + p.load(fis); } catch (IOException ex) { logger.fatal("Config error ", ex); } diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSource.java index a69354ecf85..4cac40e221f 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSource.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSource.java @@ -1,14 +1,10 @@ package org.mage.plugins.card.dl.sources; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedHashSet; -import java.util.Locale; -import java.util.Map; -import java.util.Set; import mage.client.dialog.PreferencesDialog; import org.mage.plugins.card.images.CardDownloadData; +import java.util.*; + /** * @author Quercitron, JayDi85 */ @@ -129,7 +125,10 @@ public enum ScryfallImageSource implements CardImageSource { supportedSets.add("WWK"); supportedSets.add("DDE"); supportedSets.add("ROE"); + // duels of the planewalkers: supportedSets.add("DPA"); + supportedSets.add("DPAP"); + // supportedSets.add("ARC"); supportedSets.add("M11"); supportedSets.add("V10"); @@ -231,6 +230,13 @@ public enum ScryfallImageSource implements CardImageSource { supportedSets.add("M19"); supportedSets.add("GS1"); supportedSets.add("GRN"); + supportedSets.add("GK1"); + // + supportedSets.add("EURO"); + supportedSets.add("GPX"); + supportedSets.add("ATH"); + supportedSets.add("GRC"); + supportedSets.add("ANA"); } @Override @@ -245,6 +251,24 @@ public enum ScryfallImageSource implements CardImageSource { String baseUrl = null; String alternativeUrl = null; + // direct links to images (non localization) + if (baseUrl == null) { + + // set/card/number + String linkCode1 = card.getSet() + "/" + card.getName() + "/" + card.getCollectorId(); + if (directDownloadLinks.containsKey(linkCode1)) { + baseUrl = directDownloadLinks.get(linkCode1); + alternativeUrl = null; + } + + // set/card + String linkCode2 = card.getSet() + "/" + card.getName(); + if (directDownloadLinks.containsKey(linkCode2)) { + baseUrl = directDownloadLinks.get(linkCode2); + alternativeUrl = null; + } + } + // special card number like "103a" already compatible if (baseUrl == null && card.isCollectorIdWithStr()) { baseUrl = "https://img.scryfall.com/cards/large/" + localizedCode + "/" + formatSetName(card.getSet()) + "/" @@ -330,6 +354,108 @@ public enum ScryfallImageSource implements CardImageSource { put("MPS-AKH", "mp2"); put("MBP", "pmei"); put("WMCQ", "pwcq"); + put("EURO", "pelp"); + put("GPX", "pgpx"); + } + }; + + private static final Map directDownloadLinks = new HashMap() { + { + // direct links to download images for special cards + + // Duels of the Planeswalkers Promos -- xmage uses one set (DPAP), but scryfall store it by years + // 2009 - https://scryfall.com/sets/pdtp + put("DPAP/Garruk Wildspeaker", "https://img.scryfall.com/cards/large/en/pdtp/1.jpg"); + // 2010 - https://scryfall.com/sets/pdp10 + put("DPAP/Liliana Vess", "https://img.scryfall.com/cards/large/en/pdp10/1.jpg"); + put("DPAP/Nissa Revane", "https://img.scryfall.com/cards/large/en/pdp10/2.jpg"); + // 2011 - https://scryfall.com/sets/pdp11 + put("DPAP/Frost Titan", "https://img.scryfall.com/cards/large/en/pdp11/1.jpg"); + put("DPAP/Grave Titan", "https://img.scryfall.com/cards/large/en/pdp11/2.jpg"); + put("DPAP/Inferno Titan", "https://img.scryfall.com/cards/large/en/pdp11/3.jpg"); + // 2012 - https://scryfall.com/sets/pdp12 + put("DPAP/Primordial Hydra", "https://img.scryfall.com/cards/large/en/pdp12/1.jpg"); + put("DPAP/Serra Avatar", "https://img.scryfall.com/cards/large/en/pdp12/2.jpg"); + put("DPAP/Vampire Nocturnus", "https://img.scryfall.com/cards/large/en/pdp12/3.jpg"); + // 2013 - https://scryfall.com/sets/pdp13 + put("DPAP/Bonescythe Sliver", "https://img.scryfall.com/cards/large/en/pdp13/1.jpg"); + put("DPAP/Ogre Battledriver", "https://img.scryfall.com/cards/large/en/pdp13/2.jpg"); + put("DPAP/Scavenging Ooze", "https://img.scryfall.com/cards/large/en/pdp13/3.jpg"); + // 2014 - https://scryfall.com/sets/pdp14 + put("DPAP/Soul of Ravnica", "https://img.scryfall.com/cards/large/en/pdp14/1.jpg"); + put("DPAP/Soul of Zendikar", "https://img.scryfall.com/cards/large/en/pdp14/2.jpg"); + + // Gateway Promos -- xmage uses one set (GRC), but scryfall store it by years + // 2006 - https://scryfall.com/sets/pgtw + put("GRC/Fiery Temper", "https://img.scryfall.com/cards/large/en/pgtw/3.jpg"); + put("GRC/Icatian Javelineers", "https://img.scryfall.com/cards/large/en/pgtw/2.jpg"); + put("GRC/Wood Elves", "https://img.scryfall.com/cards/large/en/pgtw/1.jpg"); + // 2007 - https://scryfall.com/sets/pg07 + put("GRC/Boomerang", "https://img.scryfall.com/cards/large/en/pg07/4.jpg"); + put("GRC/Calciderm", "https://img.scryfall.com/cards/large/en/pg07/5.jpg"); + put("GRC/Dauntless Dourbark", "https://img.scryfall.com/cards/large/en/pg07/12.jpg"); + put("GRC/Llanowar Elves", "https://img.scryfall.com/cards/large/en/pg07/9.jpg"); + put("GRC/Mind Stone", "https://img.scryfall.com/cards/large/en/pg07/11.jpg"); + put("GRC/Mogg Fanatic", "https://img.scryfall.com/cards/large/en/pg07/10.jpg"); + put("GRC/Reckless Wurm", "https://img.scryfall.com/cards/large/en/pg07/6.jpg"); + put("GRC/Yixlid Jailer", "https://img.scryfall.com/cards/large/en/pg07/7.jpg"); + put("GRC/Zoetic Cavern", "https://img.scryfall.com/cards/large/en/pg07/8.jpg"); + // 2008a - https://scryfall.com/sets/pg08 + put("GRC/Boggart Ram-Gang", "https://img.scryfall.com/cards/large/en/pg08/17.jpg"); + put("GRC/Cenn's Tactician", "https://img.scryfall.com/cards/large/en/pg08/14.jpg"); + put("GRC/Duergar Hedge-Mage", "https://img.scryfall.com/cards/large/en/pg08/19.jpg"); + put("GRC/Gravedigger", "https://img.scryfall.com/cards/large/en/pg08/16.jpg"); + put("GRC/Lava Axe", "https://img.scryfall.com/cards/large/en/pg08/13.jpg"); + put("GRC/Oona's Blackguard", "https://img.scryfall.com/cards/large/en/pg08/15.jpg"); + put("GRC/Selkie Hedge-Mage", "https://img.scryfall.com/cards/large/en/pg08/20.jpg"); + put("GRC/Wilt-Leaf Cavaliers", "https://img.scryfall.com/cards/large/en/pg08/18.jpg"); + + // Wizards Play Network Promos -- xmage uses one set (GRC), but scryfall store it by years + // 2008b - https://scryfall.com/sets/pwpn + put("GRC/Sprouting Thrinax", "https://img.scryfall.com/cards/large/en/pwpn/21.jpg"); + put("GRC/Woolly Thoctar", "https://img.scryfall.com/cards/large/en/pwpn/22.jpg"); + // 2009 - https://scryfall.com/sets/pwp09 + put("GRC/Hellspark Elemental", "https://img.scryfall.com/cards/large/en/pwp09/25.jpg"); + put("GRC/Kor Duelist", "https://img.scryfall.com/cards/large/en/pwp09/32.jpg"); + put("GRC/Marisi's Twinclaws", "https://img.scryfall.com/cards/large/en/pwp09/26.jpg"); + put("GRC/Mind Control", "https://img.scryfall.com/cards/large/en/pwp09/30.jpg"); + put("GRC/Path to Exile", "https://img.scryfall.com/cards/large/en/pwp09/24.jpg"); + put("GRC/Rise from the Grave", "https://img.scryfall.com/cards/large/en/pwp09/31.jpg"); + put("GRC/Slave of Bolas", "https://img.scryfall.com/cards/large/en/pwp09/27.jpg"); + put("GRC/Vampire Nighthawk", "https://img.scryfall.com/cards/large/en/pwp09/33.jpg"); + // 2010 - https://scryfall.com/sets/pwp10 + put("GRC/Kor Firewalker", "https://img.scryfall.com/cards/large/en/pwp10/36.jpg"); + put("GRC/Leatherback Baloth", "https://img.scryfall.com/cards/large/en/pwp10/37.jpg"); + put("GRC/Syphon Mind", "https://img.scryfall.com/cards/large/en/pwp10/40.jpg"); + put("GRC/Pathrazer of Ulamog", "https://img.scryfall.com/cards/large/en/pwp10/46.jpg"); + put("GRC/Curse of Wizardry", "https://img.scryfall.com/cards/large/en/pwp10/47.jpg"); + put("GRC/Fling/50", "https://img.scryfall.com/cards/large/en/pwp10/50.jpg"); // same card but different year + put("GRC/Sylvan Ranger/51", "https://img.scryfall.com/cards/large/en/pwp10/51.jpg"); // same card but different year + put("GRC/Plague Stinger", "https://img.scryfall.com/cards/large/en/pwp10/59.jpg"); + put("GRC/Golem's Heart", "https://img.scryfall.com/cards/large/en/pwp10/60.jpg"); + put("GRC/Skinrender", "https://img.scryfall.com/cards/large/en/pwp10/63.jpg"); + // 2011 - https://scryfall.com/sets/pwp11 + put("GRC/Auramancer", "https://img.scryfall.com/cards/large/en/pwp11/77.jpg"); + put("GRC/Bloodcrazed Neonate", "https://img.scryfall.com/cards/large/en/pwp11/83.jpg"); + put("GRC/Boneyard Wurm", "https://img.scryfall.com/cards/large/en/pwp11/84.jpg"); + put("GRC/Circle of Flame", "https://img.scryfall.com/cards/large/en/pwp11/78.jpg"); + put("GRC/Curse of the Bloody Tome", "https://img.scryfall.com/cards/large/en/pwp11/80.jpg"); + put("GRC/Fling/69", "https://img.scryfall.com/cards/large/en/pwp11/69.jpg"); // same card but different year + put("GRC/Master's Call", "https://img.scryfall.com/cards/large/en/pwp11/64.jpg"); + put("GRC/Maul Splicer", "https://img.scryfall.com/cards/large/en/pwp11/72.jpg"); + put("GRC/Plague Myr", "https://img.scryfall.com/cards/large/en/pwp11/65.jpg"); + put("GRC/Shrine of Burning Rage", "https://img.scryfall.com/cards/large/en/pwp11/73.jpg"); + put("GRC/Signal Pest", "https://img.scryfall.com/cards/large/en/pwp11/66.jpg"); + put("GRC/Sylvan Ranger/70", "https://img.scryfall.com/cards/large/en/pwp11/70.jpg"); // same card but different year + put("GRC/Tormented Soul", "https://img.scryfall.com/cards/large/en/pwp11/76.jpg"); + put("GRC/Vault Skirge", "https://img.scryfall.com/cards/large/en/pwp11/71.jpg"); + // 2012 - https://scryfall.com/sets/pwp12 + put("GRC/Curse of Thirst", "https://img.scryfall.com/cards/large/en/pwp12/81.jpg"); + put("GRC/Gather the Townsfolk", "https://img.scryfall.com/cards/large/en/pwp12/79.jpg"); + put("GRC/Nearheath Stalker", "https://img.scryfall.com/cards/large/en/pwp12/82.jpg"); + + // TODO: remove Grand Prix fix after scryfall fix image's link (that's link must be work: https://img.scryfall.com/cards/large/en/pgpx/2016b.jpg ) + put("GPX/Sword of Feast and Famine", "https://img.scryfall.com/cards/large/en/pgpx/1%E2%98%85.jpg"); } }; 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 c482f17d4a2..5d39a943f6f 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 @@ -140,7 +140,7 @@ public enum WizardCardsImageSource implements CardImageSource { supportedSets.add("WWK"); supportedSets.add("DDE"); supportedSets.add("ROE"); - supportedSets.add("DPA"); + //supportedSets.add("DPA"); supportedSets.add("ARC"); supportedSets.add("M11"); supportedSets.add("V10"); diff --git a/Mage.Client/src/main/resources/card-pictures-tok.txt b/Mage.Client/src/main/resources/card-pictures-tok.txt index 05988555120..d6fb91a0d8c 100644 --- a/Mage.Client/src/main/resources/card-pictures-tok.txt +++ b/Mage.Client/src/main/resources/card-pictures-tok.txt @@ -105,6 +105,8 @@ |Generate|PLANE:PCA|Plane - Truga Jungle|||TrugaJunglePlane| |Generate|PLANE:PCA|Plane - Turri Island|||TurriIslandPlane| |Generate|PLANE:PCA|Plane - Undercity Reaches|||UndercityReachesPlane| +|Generate|TOK:ANA|Goblin|||GoblinToken| +|Generate|TOK:ANA|Spirit|||SpiritWhiteToken| |Generate|TOK:PCA|Eldrazi|||EldraziAnnihilatorToken| |Generate|TOK:10E|Ape|||PongifyApeToken| |Generate|TOK:10E|Dragon|||DragonToken2| diff --git a/Mage.Common/src/main/java/mage/remote/ActionData.java b/Mage.Common/src/main/java/mage/remote/ActionData.java index fb7c154186a..c546ba2d240 100644 --- a/Mage.Common/src/main/java/mage/remote/ActionData.java +++ b/Mage.Common/src/main/java/mage/remote/ActionData.java @@ -39,7 +39,7 @@ public class ActionData { this.gameId = gameId; } - public class CustomExclusionStrategy implements ExclusionStrategy { + static class CustomExclusionStrategy implements ExclusionStrategy { // FIXME: Very crude way of whitelisting, as it applies to all levels of the JSON tree. private final java.util.Set KEEP = new java.util.HashSet<>( diff --git a/Mage.Common/src/main/java/mage/utils/MageVersion.java b/Mage.Common/src/main/java/mage/utils/MageVersion.java index 48683734b53..4a0feb9728e 100644 --- a/Mage.Common/src/main/java/mage/utils/MageVersion.java +++ b/Mage.Common/src/main/java/mage/utils/MageVersion.java @@ -14,7 +14,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 = 31; - public final static String MAGE_VERSION_MINOR_PATCH = "V1"; + public final static String MAGE_VERSION_MINOR_PATCH = "V4"; public final static String MAGE_VERSION_INFO = ""; private final int major; diff --git a/Mage.Common/src/main/java/mage/utils/properties/PropertiesUtil.java b/Mage.Common/src/main/java/mage/utils/properties/PropertiesUtil.java index a3c40b52a3c..0a220e12fdf 100644 --- a/Mage.Common/src/main/java/mage/utils/properties/PropertiesUtil.java +++ b/Mage.Common/src/main/java/mage/utils/properties/PropertiesUtil.java @@ -2,6 +2,7 @@ package mage.utils.properties; import org.apache.log4j.Logger; +import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.Properties; @@ -19,39 +20,36 @@ public final class PropertiesUtil { private static Properties properties = new Properties(); static { - InputStream in = PropertiesUtil.class.getResourceAsStream("/xmage.properties"); - if (in != null) { - try { - properties.load(in); - } catch (IOException e) { - logger.error("Couldn't load properties", e); - } - } else { + try (InputStream in = PropertiesUtil.class.getResourceAsStream("/xmage.properties")) { + properties.load(in); + } catch (FileNotFoundException fnfe) { logger.warn("No xmage.properties were found on classpath"); - + } catch (IOException e) { + logger.error("Couldn't load properties"); + e.printStackTrace(); } } - /** - * Hide constructor - */ + /** + * Hide constructor + */ private PropertiesUtil() { - } - - public static String getDBLogUrl() { - String url = properties.getProperty(PropertyKeys.KEY_DB_LOG_URL, LOG_JDBC_URL); - if (url != null) { - return url.trim(); } - return null; - } - public static String getDBFeedbackUrl() { - String url = properties.getProperty(PropertyKeys.KEY_DB_FEEDBACK_URL, FEEDBACK_JDBC_URL); - if (url != null) { - return url.trim(); + public static String getDBLogUrl () { + String url = properties.getProperty(PropertyKeys.KEY_DB_LOG_URL, LOG_JDBC_URL); + if (url != null) { + return url.trim(); + } + return null; + } + + public static String getDBFeedbackUrl () { + String url = properties.getProperty(PropertyKeys.KEY_DB_FEEDBACK_URL, FEEDBACK_JDBC_URL); + if (url != null) { + return url.trim(); + } + return null; } - return null; } -} diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/AusHighlander.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/AusHighlander.java index 86a70116a24..112563f76d0 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/AusHighlander.java +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/AusHighlander.java @@ -76,8 +76,6 @@ public class AusHighlander extends Constructed { pointMap.put("True-Name Nemesis", 1); pointMap.put("Umezawa’s Jitte", 1); pointMap.put("Wasteland", 1); - pointMap.put("Wheel of Fortune", 1); - pointMap.put("Worldly Tutor", 1); pointMap.put("Yawgmoth’s Bargain", 1); } diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/CanadianHighlander.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/CanadianHighlander.java index 33a0714909e..23f5c57f2fd 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/CanadianHighlander.java +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/CanadianHighlander.java @@ -21,7 +21,7 @@ public class CanadianHighlander extends Constructed { pointMap.put("Balance", 1); pointMap.put("Birthing Pod", 3); pointMap.put("Black Lotus", 7); - pointMap.put("Demonic Tutor", 4); + pointMap.put("Demonic Tutor", 3); pointMap.put("Dig Through Time", 1); pointMap.put("Enlightened Tutor", 1); pointMap.put("Fastbond", 1); diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Standard.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Standard.java index 2e2098244a1..e5f19747e3f 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Standard.java +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Standard.java @@ -1,19 +1,13 @@ package mage.deck; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Collections; -import java.util.Comparator; -import java.util.Date; -import java.util.GregorianCalendar; -import java.util.List; import mage.cards.ExpansionSet; import mage.cards.Sets; import mage.cards.decks.Constructed; import mage.constants.SetType; +import java.util.*; + /** - * * @author BetaSteward_at_googlemail.com */ public class Standard extends Constructed { @@ -23,13 +17,7 @@ public class Standard extends Constructed { setCodes.addAll(makeLegalSets()); - banned.add("Attune with Aether"); // since 2018-01-15 - banned.add("Aetherworks Marvel"); - banned.add("Felidar Guardian"); banned.add("Rampaging Ferocidon"); // since 2018-01-15 - banned.add("Ramunap Ruins"); // since 2018-01-15 - banned.add("Rogue Refiner"); // since 2018-01-15 - banned.add("Smuggler's Copter"); } private static boolean isFallSet(ExpansionSet set) { diff --git a/Mage.Server/src/main/java/mage/server/MageServerImpl.java b/Mage.Server/src/main/java/mage/server/MageServerImpl.java index f6676754ef3..899f113519b 100644 --- a/Mage.Server/src/main/java/mage/server/MageServerImpl.java +++ b/Mage.Server/src/main/java/mage/server/MageServerImpl.java @@ -672,7 +672,7 @@ public class MageServerImpl implements MageServer { } catch (Exception ex) { handleException(ex); } - return null; + return Optional.empty(); } @Override diff --git a/Mage.Server/src/main/java/mage/server/Main.java b/Mage.Server/src/main/java/mage/server/Main.java index 49511c959b1..cd64c6086de 100644 --- a/Mage.Server/src/main/java/mage/server/Main.java +++ b/Mage.Server/src/main/java/mage/server/Main.java @@ -153,15 +153,15 @@ public final class Main { for (ExtensionPackage pkg : extensions) { Map draftCubes = pkg.getDraftCubes(); - for (String name : draftCubes.keySet()) { - logger.info("Loading extension: [" + name + "] " + draftCubes.get(name).toString()); - CubeFactory.instance.addDraftCube(name, draftCubes.get(name)); - } + draftCubes.forEach((name, draftCube) -> { + logger.info("Loading extension: [" + name + "] " + draftCube.toString()); + CubeFactory.instance.addDraftCube(name, draftCube); + }); Map deckTypes = pkg.getDeckTypes(); - for (String name : deckTypes.keySet()) { - logger.info("Loading extension: [" + name + "] " + deckTypes.get(name)); - DeckValidatorFactory.instance.addDeckType(name, deckTypes.get(name)); - } + deckTypes.forEach((name, deckType) -> { + logger.info("Loading extension: [" + name + "] " + deckType); + DeckValidatorFactory.instance.addDeckType(name, deckType); + }); } logger.info("Config - max seconds idle: " + config.getMaxSecondsIdle()); diff --git a/Mage.Server/src/main/java/mage/server/SessionManager.java b/Mage.Server/src/main/java/mage/server/SessionManager.java index 9b9a7fa07b7..66d9c7d8e14 100644 --- a/Mage.Server/src/main/java/mage/server/SessionManager.java +++ b/Mage.Server/src/main/java/mage/server/SessionManager.java @@ -26,7 +26,7 @@ public enum SessionManager { logger.trace("Session with sessionId " + sessionId + " is not found"); return Optional.empty(); } - if (session.getUserId() != null && UserManager.instance.getUser(session.getUserId()) == null) { + if (session.getUserId() != null && !UserManager.instance.getUser(session.getUserId()).isPresent()) { logger.error("User for session " + sessionId + " with userId " + session.getUserId() + " is missing. Session removed."); // can happen if user from same host signs in multiple time with multiple clients, after he disconnects with one client disconnect(sessionId, DisconnectReason.ConnectingOtherInstance); diff --git a/Mage.Server/src/main/java/mage/server/TableController.java b/Mage.Server/src/main/java/mage/server/TableController.java index 58a0b695b85..1f4d9808cd3 100644 --- a/Mage.Server/src/main/java/mage/server/TableController.java +++ b/Mage.Server/src/main/java/mage/server/TableController.java @@ -942,7 +942,7 @@ public class TableController { if (!(table.getState() == TableState.WAITING || table.getState() == TableState.STARTING || table.getState() == TableState.READY_TO_START)) { if (match == null) { logger.warn("- Match table with no match:"); - logger.warn("-- matchId:" + match.getId() + " [" + match.getName() + ']'); + logger.warn("-- matchId:" + match.getId() + " , table : " + table.getId()); // return false; } else if (match.isDoneSideboarding() && match.getGame() == null) { // no sideboarding and not active game -> match seems to hang (maybe the Draw bug) 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 a9593816c70..b3a1f6d7d15 100644 --- a/Mage.Server/src/main/java/mage/server/game/GameController.java +++ b/Mage.Server/src/main/java/mage/server/game/GameController.java @@ -266,13 +266,13 @@ public class GameController implements GameCallback { public void join(UUID userId) { UUID playerId = userPlayerMap.get(userId); - Optional user = UserManager.instance.getUser(userId); - if (userId == null || playerId == null) { + if (playerId == null) { logger.fatal("Join game failed!"); logger.fatal("- gameId: " + game.getId()); logger.fatal("- userId: " + userId); return; } + Optional user = UserManager.instance.getUser(userId); if (!user.isPresent()) { logger.fatal("User not found : " + userId); return; diff --git a/Mage.Server/src/main/java/mage/server/game/GameWorker.java b/Mage.Server/src/main/java/mage/server/game/GameWorker.java index de273e5cc12..e52f9d7cc8a 100644 --- a/Mage.Server/src/main/java/mage/server/game/GameWorker.java +++ b/Mage.Server/src/main/java/mage/server/game/GameWorker.java @@ -3,14 +3,14 @@ package mage.server.game; import java.util.UUID; import java.util.concurrent.Callable; + import mage.MageException; import mage.game.Game; import org.apache.log4j.Logger; /** - * - * @author BetaSteward_at_googlemail.com * @param + * @author BetaSteward_at_googlemail.com */ public class GameWorker implements Callable { @@ -40,12 +40,7 @@ public class GameWorker implements Callable { } catch (Exception e) { LOGGER.fatal("GameWorker general exception [" + game.getId() + "] " + e.getMessage(), e); if (e instanceof NullPointerException) { - if (e.getStackTrace() == null) { - LOGGER.info("Stack trace is null"); - } else { - LOGGER.info("Null-Pointer-Exception: Stack trace"); - LOGGER.info(e.getStackTrace()); - } + LOGGER.info(e.getStackTrace()); } } catch (Error err) { LOGGER.fatal("GameWorker general error [" + game.getId() + "] " + err, err); diff --git a/Mage.Sets/src/mage/cards/a/AbandonedSarcophagus.java b/Mage.Sets/src/mage/cards/a/AbandonedSarcophagus.java index 5d44aa8dd68..81a7e42baf5 100644 --- a/Mage.Sets/src/mage/cards/a/AbandonedSarcophagus.java +++ b/Mage.Sets/src/mage/cards/a/AbandonedSarcophagus.java @@ -1,4 +1,3 @@ - package mage.cards.a; import java.util.HashMap; @@ -7,18 +6,18 @@ import java.util.Map.Entry; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.AsThoughEffectImpl; import mage.abilities.effects.ReplacementEffectImpl; +import mage.abilities.effects.common.asthought.PlayFromNotOwnHandZoneAllEffect; import mage.abilities.keyword.CyclingAbility; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.cards.Cards; import mage.cards.CardsImpl; -import mage.constants.AsThoughEffectType; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; +import mage.constants.TargetController; import mage.constants.WatcherScope; import mage.constants.Zone; import mage.filter.FilterCard; @@ -42,7 +41,14 @@ public final class AbandonedSarcophagus extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}"); // You may cast nonland cards with cycling from your graveyard. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new AbandonedSarcophagusCastFromGraveyardEffect())); + FilterCard filter = new FilterCard("nonland cards with cycling"); + filter.add(Predicates.not(new CardTypePredicate(CardType.LAND))); + filter.add(new AbilityPredicate(CyclingAbility.class)); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, + new PlayFromNotOwnHandZoneAllEffect(filter, + Zone.GRAVEYARD, true, TargetController.YOU, Duration.WhileOnBattlefield) + .setText("You may cast nonland cards with cycling from your graveyard")) + ); // If a card with cycling would be put into your graveyard from anywhere and it wasn't cycled, exile it instead. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new AbandonedSarcophagusReplacementEffect()), new AbandonedSarcophagusWatcher()); @@ -59,46 +65,6 @@ public final class AbandonedSarcophagus extends CardImpl { } } -class AbandonedSarcophagusCastFromGraveyardEffect extends AsThoughEffectImpl { - - private static final FilterCard filter = new FilterCard("nonland cards with cycling"); - - static { - filter.add(Predicates.not(new CardTypePredicate(CardType.LAND))); - filter.add(new AbilityPredicate(CyclingAbility.class)); - } - - AbandonedSarcophagusCastFromGraveyardEffect() { - super(AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, Duration.WhileOnBattlefield, Outcome.Benefit); - staticText = "You may cast nonland cards with cycling from your graveyard"; - } - - AbandonedSarcophagusCastFromGraveyardEffect(final AbandonedSarcophagusCastFromGraveyardEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - return true; - } - - @Override - public AbandonedSarcophagusCastFromGraveyardEffect copy() { - return new AbandonedSarcophagusCastFromGraveyardEffect(this); - } - - @Override - public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) { - Card card = game.getCard(objectId); - if (card != null) { - return (affectedControllerId.equals(source.getControllerId()) - && filter.match(card, game) - && game.getState().getZone(card.getId()) == Zone.GRAVEYARD); - } - return false; - } -} - class AbandonedSarcophagusReplacementEffect extends ReplacementEffectImpl { boolean cardHasCycling; diff --git a/Mage.Sets/src/mage/cards/a/AbbotOfKeralKeep.java b/Mage.Sets/src/mage/cards/a/AbbotOfKeralKeep.java index c8a371940d5..0d85e9cf3ce 100644 --- a/Mage.Sets/src/mage/cards/a/AbbotOfKeralKeep.java +++ b/Mage.Sets/src/mage/cards/a/AbbotOfKeralKeep.java @@ -1,4 +1,3 @@ - package mage.cards.a; import java.util.UUID; @@ -8,6 +7,7 @@ import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.effects.AsThoughEffectImpl; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.asthought.PlayFromNotOwnHandZoneTargetEffect; import mage.abilities.keyword.ProwessAbility; import mage.cards.Card; import mage.cards.CardImpl; @@ -75,7 +75,7 @@ class AbbotOfKeralKeepExileEffect extends OneShotEffect { if (card != null) { String exileName = sourcePermanent.getIdName() + " "; controller.moveCardsToExile(card, source, game, true, source.getSourceId(), exileName); - ContinuousEffect effect = new AbbotOfKeralKeepCastFromExileEffect(); + ContinuousEffect effect = new PlayFromNotOwnHandZoneTargetEffect(Duration.EndOfTurn); effect.setTargetPointer(new FixedTarget(card.getId(), card.getZoneChangeCounter(game))); game.addEffect(effect, source); } diff --git a/Mage.Sets/src/mage/cards/a/AberrantResearcher.java b/Mage.Sets/src/mage/cards/a/AberrantResearcher.java index 5d78e0d59b3..54c1bd42d4d 100644 --- a/Mage.Sets/src/mage/cards/a/AberrantResearcher.java +++ b/Mage.Sets/src/mage/cards/a/AberrantResearcher.java @@ -2,6 +2,7 @@ package mage.cards.a; import java.util.UUID; + import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; @@ -12,26 +13,24 @@ import mage.abilities.keyword.TransformAbility; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.p.PerfectedForm; import mage.constants.*; import mage.game.Game; import mage.players.Player; /** - * * @author fireshoes */ public final class AberrantResearcher extends CardImpl { public AberrantResearcher(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.INSECT); this.power = new MageInt(3); this.toughness = new MageInt(2); this.transformable = true; - this.secondSideCardClazz = PerfectedForm.class; + this.secondSideCardClazz = mage.cards.p.PerfectedForm.class; // Flying this.addAbility(FlyingAbility.getInstance()); diff --git a/Mage.Sets/src/mage/cards/a/AccursedWitch.java b/Mage.Sets/src/mage/cards/a/AccursedWitch.java index e9848340da5..1cefa7ff16e 100644 --- a/Mage.Sets/src/mage/cards/a/AccursedWitch.java +++ b/Mage.Sets/src/mage/cards/a/AccursedWitch.java @@ -2,6 +2,7 @@ package mage.cards.a; import java.util.UUID; + import mage.MageInt; import mage.abilities.Ability; import mage.abilities.Mode; @@ -14,7 +15,6 @@ import mage.abilities.keyword.TransformAbility; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.i.InfectiousCurse; import mage.constants.*; import mage.game.Game; import mage.game.permanent.Permanent; @@ -23,7 +23,6 @@ import mage.target.Target; import mage.util.CardUtil; /** - * * @author halljared */ public final class AccursedWitch extends CardImpl { @@ -36,7 +35,7 @@ public final class AccursedWitch extends CardImpl { this.toughness = new MageInt(2); this.transformable = true; - this.secondSideCardClazz = InfectiousCurse.class; + this.secondSideCardClazz = mage.cards.i.InfectiousCurse.class; // Spells your opponents cast that target Accursed Witch cost {1} less to cast. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new AccursedWitchSpellsCostReductionEffect())); diff --git a/Mage.Sets/src/mage/cards/a/AchHansRun.java b/Mage.Sets/src/mage/cards/a/AchHansRun.java new file mode 100644 index 00000000000..14a0b6d2002 --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/AchHansRun.java @@ -0,0 +1,107 @@ + +package mage.cards.a; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.DelayedTriggeredAbility; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; +import mage.abilities.effects.ContinuousEffect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ExileTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.HasteAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.repository.CardRepository; +import mage.choices.ChoiceImpl; +import mage.constants.*; +import mage.filter.FilterCard; +import mage.filter.predicate.mageobject.NamePredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.common.TargetCardInLibrary; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author L_J + */ +public final class AchHansRun extends CardImpl { + + public AchHansRun(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{R}{R}{G}{G}"); + + // At the beginning of your upkeep, you may say "Ach! Hans, run! It’s the …" and the name of a creature card. If you do, search your library for a card with that name, put it onto the battlefield, then shuffle your library. That creature gains haste. Exile it at the beginning of the next end step. + this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new AchHansRunEffect(), TargetController.YOU, true)); + } + + public AchHansRun(final AchHansRun card) { + super(card); + } + + @Override + public AchHansRun copy() { + return new AchHansRun(this); + } +} + +class AchHansRunEffect extends OneShotEffect { + + public AchHansRunEffect() { + super(Outcome.PutCreatureInPlay); + this.staticText = "you may say \"Ach! Hans, run! It’s the …\" and the name of a creature card. If you do, search your library for a card with that name, put it onto the battlefield, then shuffle your library. That creature gains haste. Exile it at the beginning of the next end step"; + } + + public AchHansRunEffect(final AchHansRunEffect effect) { + super(effect); + } + + @Override + public AchHansRunEffect copy() { + return new AchHansRunEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + ChoiceImpl cardChoice = new ChoiceImpl(true); + cardChoice.setChoices(CardRepository.instance.getCreatureNames()); + cardChoice.setMessage("Choose a creature card name"); + if (controller.choose(Outcome.Detriment, cardChoice, game)) { + String cardName = cardChoice.getChoice(); + if (!game.isSimulation()) { + game.informPlayers(controller.getLogName() + ": \"Ach! Hans, run! It's the " + cardName + "!\""); + } + FilterCard nameFilter = new FilterCard(); + nameFilter.add(new NamePredicate(cardName)); + TargetCardInLibrary target = new TargetCardInLibrary(1, 1, nameFilter); + if (controller.searchLibrary(target, game)) { + Card card = controller.getLibrary().remove(target.getFirstTarget(), game); + if (card != null) { + if (card != null && controller.moveCards(card, Zone.BATTLEFIELD, source, game)) { + Permanent creature = game.getPermanent(card.getId()); + if (creature != null) { + // gains haste + ContinuousEffect effect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn); + effect.setTargetPointer(new FixedTarget(creature, game)); + game.addEffect(effect, source); + // Exile at begin of next end step + ExileTargetEffect exileEffect = new ExileTargetEffect(null, null, Zone.BATTLEFIELD); + exileEffect.setTargetPointer(new FixedTarget(creature, game)); + DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(exileEffect); + game.addDelayedTriggeredAbility(delayedAbility, source); + } + } + } + controller.shuffleLibrary(source, game); + } + return true; + } + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/a/ActOnImpulse.java b/Mage.Sets/src/mage/cards/a/ActOnImpulse.java index 11bc0aed5b5..a2f44ab166f 100644 --- a/Mage.Sets/src/mage/cards/a/ActOnImpulse.java +++ b/Mage.Sets/src/mage/cards/a/ActOnImpulse.java @@ -1,4 +1,3 @@ - package mage.cards.a; import java.util.HashSet; @@ -6,9 +5,9 @@ import java.util.Set; import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; -import mage.abilities.effects.AsThoughEffectImpl; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.asthought.PlayFromNotOwnHandZoneTargetEffect; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -44,7 +43,7 @@ class ActOnImpulseExileEffect extends OneShotEffect { public ActOnImpulseExileEffect() { super(Outcome.Benefit); - this.staticText = "Exile the top three cards of your library. Until end of turn, you may play cards exiled this way."; + this.staticText = "Exile the top three cards of your library. Until end of turn, you may play cards exiled this way"; } public ActOnImpulseExileEffect(final ActOnImpulseExileEffect effect) { @@ -71,7 +70,7 @@ class ActOnImpulseExileEffect extends OneShotEffect { } } if (!cards.isEmpty()) { - ContinuousEffect effect = new ActOnImpulseMayPlayExiledEffect(); + ContinuousEffect effect = new PlayFromNotOwnHandZoneTargetEffect(Zone.EXILED, Duration.EndOfTurn); effect.setTargetPointer(new FixedTargets(cards, game)); game.addEffect(effect, source); } @@ -82,31 +81,3 @@ class ActOnImpulseExileEffect extends OneShotEffect { } } - -class ActOnImpulseMayPlayExiledEffect extends AsThoughEffectImpl { - - public ActOnImpulseMayPlayExiledEffect() { - super(AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, Duration.EndOfTurn, Outcome.Benefit); - } - - public ActOnImpulseMayPlayExiledEffect(final ActOnImpulseMayPlayExiledEffect effect) { - super(effect); - } - - @Override - public ActOnImpulseMayPlayExiledEffect copy() { - return new ActOnImpulseMayPlayExiledEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - return true; - } - - @Override - public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) { - return affectedControllerId.equals(source.getControllerId()) - && getTargetPointer().getTargets(game, source).contains(objectId); - } - -} diff --git a/Mage.Sets/src/mage/cards/a/AerialCaravan.java b/Mage.Sets/src/mage/cards/a/AerialCaravan.java index 933595fcd9b..27524c47b47 100644 --- a/Mage.Sets/src/mage/cards/a/AerialCaravan.java +++ b/Mage.Sets/src/mage/cards/a/AerialCaravan.java @@ -1,4 +1,3 @@ - package mage.cards.a; import java.util.UUID; @@ -6,18 +5,18 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.AsThoughEffectImpl; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.asthought.PlayFromNotOwnHandZoneTargetEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.AsThoughEffectType; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.SubType; +import mage.constants.Zone; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Library; @@ -81,7 +80,7 @@ class AerialCaravanExileEffect extends OneShotEffect { if (card != null) { String exileName = sourcePermanent.getIdName() + " "; controller.moveCardsToExile(card, source, game, true, source.getSourceId(), exileName); - ContinuousEffect effect = new AerialCaravanCastFromExileEffect(); + ContinuousEffect effect = new PlayFromNotOwnHandZoneTargetEffect(Zone.EXILED, Duration.EndOfTurn); effect.setTargetPointer(new FixedTarget(card.getId(), card.getZoneChangeCounter(game))); game.addEffect(effect, source); } @@ -90,31 +89,3 @@ class AerialCaravanExileEffect extends OneShotEffect { return false; } } - -class AerialCaravanCastFromExileEffect extends AsThoughEffectImpl { - - public AerialCaravanCastFromExileEffect() { - super(AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, Duration.EndOfTurn, Outcome.Benefit); - staticText = "You may play the card from exile"; - } - - public AerialCaravanCastFromExileEffect(final AerialCaravanCastFromExileEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - return true; - } - - @Override - public AerialCaravanCastFromExileEffect copy() { - return new AerialCaravanCastFromExileEffect(this); - } - - @Override - public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) { - return source.isControlledBy(affectedControllerId) - && objectId.equals(getTargetPointer().getFirst(game, source)); - } -} diff --git a/Mage.Sets/src/mage/cards/a/AfflictedDeserter.java b/Mage.Sets/src/mage/cards/a/AfflictedDeserter.java index 3cbe3dbff4b..2b7b3d6b878 100644 --- a/Mage.Sets/src/mage/cards/a/AfflictedDeserter.java +++ b/Mage.Sets/src/mage/cards/a/AfflictedDeserter.java @@ -2,6 +2,7 @@ package mage.cards.a; import java.util.UUID; + import mage.MageInt; import mage.abilities.TriggeredAbility; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; @@ -11,24 +12,22 @@ import mage.abilities.effects.common.TransformSourceEffect; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.w.WerewolfRansacker; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.TargetController; /** - * * @author BetaSteward */ public final class AfflictedDeserter extends CardImpl { public AfflictedDeserter(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.WEREWOLF); this.transformable = true; - this.secondSideCardClazz = WerewolfRansacker.class; + this.secondSideCardClazz = mage.cards.w.WerewolfRansacker.class; this.power = new MageInt(3); this.toughness = new MageInt(2); diff --git a/Mage.Sets/src/mage/cards/a/AjaniAdversaryOfTyrants.java b/Mage.Sets/src/mage/cards/a/AjaniAdversaryOfTyrants.java index 2197d263dc3..2453e3bea9c 100644 --- a/Mage.Sets/src/mage/cards/a/AjaniAdversaryOfTyrants.java +++ b/Mage.Sets/src/mage/cards/a/AjaniAdversaryOfTyrants.java @@ -3,7 +3,7 @@ package mage.cards.a; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.common.GetEmblemEffect; import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; import mage.abilities.effects.common.counter.AddCountersTargetEffect; @@ -38,7 +38,7 @@ public final class AjaniAdversaryOfTyrants extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.AJANI); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(4)); // +1: Put a +1/+1 counter on each of up to two target creatures. Ability ability = new LoyaltyAbility(new AddCountersTargetEffect(CounterType.P1P1.createInstance()), 1); diff --git a/Mage.Sets/src/mage/cards/a/AjaniCallerOfThePride.java b/Mage.Sets/src/mage/cards/a/AjaniCallerOfThePride.java index 8fd7ad95e21..0dfdd6a8bf5 100644 --- a/Mage.Sets/src/mage/cards/a/AjaniCallerOfThePride.java +++ b/Mage.Sets/src/mage/cards/a/AjaniCallerOfThePride.java @@ -4,7 +4,7 @@ package mage.cards.a; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.dynamicvalue.common.ControllerLifeCount; import mage.abilities.effects.Effect; import mage.abilities.effects.Effects; @@ -34,7 +34,7 @@ public final class AjaniCallerOfThePride extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.AJANI); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(4)); // +1: Put a +1/+1 counter on up to one target creature. Effect effect = new AddCountersTargetEffect(CounterType.P1P1.createInstance()); effect.setText("Put a +1/+1 counter on up to one target creature"); diff --git a/Mage.Sets/src/mage/cards/a/AjaniGoldmane.java b/Mage.Sets/src/mage/cards/a/AjaniGoldmane.java index 8c88c3da479..475b664b129 100644 --- a/Mage.Sets/src/mage/cards/a/AjaniGoldmane.java +++ b/Mage.Sets/src/mage/cards/a/AjaniGoldmane.java @@ -4,7 +4,7 @@ package mage.cards.a; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.effects.Effects; @@ -22,7 +22,6 @@ import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.permanent.token.TokenImpl; -import mage.game.permanent.token.Token; import mage.players.Player; /** @@ -36,7 +35,7 @@ public final class AjaniGoldmane extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.AJANI); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(4)); // +1: You gain 2 life. this.addAbility(new LoyaltyAbility(new GainLifeEffect(2), 1)); diff --git a/Mage.Sets/src/mage/cards/a/AjaniMentorOfHeroes.java b/Mage.Sets/src/mage/cards/a/AjaniMentorOfHeroes.java index 33024b4d682..d60264cb683 100644 --- a/Mage.Sets/src/mage/cards/a/AjaniMentorOfHeroes.java +++ b/Mage.Sets/src/mage/cards/a/AjaniMentorOfHeroes.java @@ -4,7 +4,7 @@ package mage.cards.a; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.common.GainLifeEffect; import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; import mage.abilities.effects.common.counter.DistributeCountersEffect; @@ -46,7 +46,7 @@ public final class AjaniMentorOfHeroes extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.AJANI); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(4)); // +1: Distribute three +1/+1 counters among one, two, or three target creatures you control Ability ability = new LoyaltyAbility(new DistributeCountersEffect(CounterType.P1P1, 3, false, "one, two, or three target creatures you control"), 1); diff --git a/Mage.Sets/src/mage/cards/a/AjaniSteadfast.java b/Mage.Sets/src/mage/cards/a/AjaniSteadfast.java index 7311bec7141..7d95193116a 100644 --- a/Mage.Sets/src/mage/cards/a/AjaniSteadfast.java +++ b/Mage.Sets/src/mage/cards/a/AjaniSteadfast.java @@ -3,7 +3,7 @@ package mage.cards.a; import java.util.UUID; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.common.GetEmblemEffect; import mage.abilities.effects.common.continuous.BoostTargetEffect; @@ -45,7 +45,7 @@ public final class AjaniSteadfast extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.AJANI); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(4)); // +1: Until end of turn, up to one target creature gets +1/+1 and gains first strike, vigilance, and lifelink. Effect effect = new BoostTargetEffect(1, 1, Duration.EndOfTurn); diff --git a/Mage.Sets/src/mage/cards/a/AjaniUnyielding.java b/Mage.Sets/src/mage/cards/a/AjaniUnyielding.java index 7154fa51ef2..f7ba38516c5 100644 --- a/Mage.Sets/src/mage/cards/a/AjaniUnyielding.java +++ b/Mage.Sets/src/mage/cards/a/AjaniUnyielding.java @@ -3,7 +3,7 @@ package mage.cards.a; import java.util.UUID; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.common.ExileAndGainLifeEqualPowerTargetEffect; import mage.abilities.effects.common.RevealLibraryPutIntoHandEffect; import mage.abilities.effects.common.counter.AddCountersAllEffect; @@ -43,7 +43,7 @@ public final class AjaniUnyielding extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.AJANI); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(4)); // +2: Reveal the top three cards of your library. Put all nonland permanent cards revealed this way into your hand and the rest on the bottom of your library in any order. this.addAbility(new LoyaltyAbility(new RevealLibraryPutIntoHandEffect(3, nonlandPermanentFilter, Zone.LIBRARY), 2)); diff --git a/Mage.Sets/src/mage/cards/a/AjaniValiantProtector.java b/Mage.Sets/src/mage/cards/a/AjaniValiantProtector.java index d32725ebd4a..00f6ca6c98f 100644 --- a/Mage.Sets/src/mage/cards/a/AjaniValiantProtector.java +++ b/Mage.Sets/src/mage/cards/a/AjaniValiantProtector.java @@ -4,7 +4,7 @@ package mage.cards.a; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.dynamicvalue.common.ControllerLifeCount; import mage.abilities.effects.Effect; import mage.abilities.effects.common.RevealCardsFromLibraryUntilEffect; @@ -33,7 +33,7 @@ public final class AjaniValiantProtector extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.AJANI); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(4)); // +2: Put two +1/+1 counters on up to one target creature. Ability ability = new LoyaltyAbility(new AddCountersTargetEffect(CounterType.P1P1.createInstance(2)), 2); diff --git a/Mage.Sets/src/mage/cards/a/AjaniVengeant.java b/Mage.Sets/src/mage/cards/a/AjaniVengeant.java index bb77d4bd3c6..b6d4b3b48a3 100644 --- a/Mage.Sets/src/mage/cards/a/AjaniVengeant.java +++ b/Mage.Sets/src/mage/cards/a/AjaniVengeant.java @@ -3,7 +3,7 @@ package mage.cards.a; import java.util.UUID; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.Effects; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.DestroyAllControlledTargetEffect; @@ -37,7 +37,7 @@ public final class AjaniVengeant extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.AJANI); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3)); // +1: Target permanent doesn't untap during its controller's next untap step. LoyaltyAbility ability1 = new LoyaltyAbility(new DontUntapInControllersNextUntapStepTargetEffect(), 1); diff --git a/Mage.Sets/src/mage/cards/a/AjaniWiseCounselor.java b/Mage.Sets/src/mage/cards/a/AjaniWiseCounselor.java index 13636ab6ca1..8a28d2545e2 100644 --- a/Mage.Sets/src/mage/cards/a/AjaniWiseCounselor.java +++ b/Mage.Sets/src/mage/cards/a/AjaniWiseCounselor.java @@ -3,7 +3,7 @@ package mage.cards.a; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.dynamicvalue.common.ControllerLifeCount; import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; import mage.abilities.effects.common.GainLifeEffect; @@ -29,7 +29,7 @@ public final class AjaniWiseCounselor extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.AJANI); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(5)); // +2: You gain 1 life for each creature you control. this.addAbility(new LoyaltyAbility(new GainLifeEffect( diff --git a/Mage.Sets/src/mage/cards/a/AlexiZephyrMage.java b/Mage.Sets/src/mage/cards/a/AlexiZephyrMage.java index 76cb80c1832..3d9f281655f 100644 --- a/Mage.Sets/src/mage/cards/a/AlexiZephyrMage.java +++ b/Mage.Sets/src/mage/cards/a/AlexiZephyrMage.java @@ -1,4 +1,3 @@ - package mage.cards.a; import java.util.UUID; @@ -14,12 +13,12 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.SuperType; -import mage.constants.TargetAdjustment; import mage.constants.Zone; import mage.filter.FilterCard; import mage.filter.StaticFilters; import mage.target.TargetPermanent; import mage.target.common.TargetCardInHand; +import mage.target.targetadjustment.XTargetsAdjuster; /** * @@ -40,7 +39,7 @@ public final class AlexiZephyrMage extends CardImpl { ability.addCost(new TapSourceCost()); ability.addCost(new DiscardTargetCost(new TargetCardInHand(2, new FilterCard("two cards")))); ability.addTarget(new TargetPermanent(StaticFilters.FILTER_PERMANENT_CREATURES)); - ability.setTargetAdjustment(TargetAdjustment.X_TARGETS); + ability.setTargetAdjuster(XTargetsAdjuster.instance); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/a/AminatouTheFateShifter.java b/Mage.Sets/src/mage/cards/a/AminatouTheFateShifter.java index 44168d26c0b..8067fc0183c 100644 --- a/Mage.Sets/src/mage/cards/a/AminatouTheFateShifter.java +++ b/Mage.Sets/src/mage/cards/a/AminatouTheFateShifter.java @@ -3,7 +3,7 @@ package mage.cards.a; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; import mage.abilities.common.CanBeYourCommanderAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.ExileTargetForSourceEffect; @@ -48,7 +48,7 @@ public class AminatouTheFateShifter extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.AMINATOU); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3)); // +1: Draw a card, then put a card from your hand on top of your library. Ability ability = new LoyaltyAbility(new AminatouPlusEffect(), +1); diff --git a/Mage.Sets/src/mage/cards/a/AnZerrinRuins.java b/Mage.Sets/src/mage/cards/a/AnZerrinRuins.java index 37622e6c77b..d8817ae4672 100644 --- a/Mage.Sets/src/mage/cards/a/AnZerrinRuins.java +++ b/Mage.Sets/src/mage/cards/a/AnZerrinRuins.java @@ -62,7 +62,7 @@ class AnZerrinRuinsDontUntapEffect extends DontUntapInControllersUntapStepAllEff if (super.applies(event, source, game)) { Permanent permanent = game.getPermanent(event.getTargetId()); if (permanent != null) { - if (permanent.hasSubtype(ChooseCreatureTypeEffect.getChoosenCreatureType(source.getSourceId(), game), game)) { + if (permanent.hasSubtype(ChooseCreatureTypeEffect.getChosenCreatureType(source.getSourceId(), game), game)) { return true; } } diff --git a/Mage.Sets/src/mage/cards/a/AnakinSkywalker.java b/Mage.Sets/src/mage/cards/a/AnakinSkywalker.java index be930a31c99..cc479f50a47 100644 --- a/Mage.Sets/src/mage/cards/a/AnakinSkywalker.java +++ b/Mage.Sets/src/mage/cards/a/AnakinSkywalker.java @@ -2,6 +2,7 @@ package mage.cards.a; import java.util.UUID; + import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.ActivateAsSorceryActivatedAbility; @@ -15,7 +16,6 @@ import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.d.DarthVader; import mage.constants.*; import mage.counters.CounterType; import mage.filter.StaticFilters; @@ -27,7 +27,6 @@ import mage.target.common.TargetControlledCreaturePermanent; import mage.target.common.TargetCreaturePermanent; /** - * * @author Styxo */ public final class AnakinSkywalker extends CardImpl { @@ -41,7 +40,7 @@ public final class AnakinSkywalker extends CardImpl { this.toughness = new MageInt(4); this.transformable = true; - this.secondSideCardClazz = DarthVader.class; + this.secondSideCardClazz = mage.cards.d.DarthVader.class; // Whenever another creature dies, put a +1/+1 counter on Anakin Skywalker. this.addAbility(new DiesCreatureTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()), false, true)); diff --git a/Mage.Sets/src/mage/cards/a/AngelicReward.java b/Mage.Sets/src/mage/cards/a/AngelicReward.java new file mode 100644 index 00000000000..dce1309e721 --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/AngelicReward.java @@ -0,0 +1,53 @@ +package mage.cards.a; + +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTappedAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +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.abilities.keyword.TotemArmorAbility; +import mage.abilities.mana.AnyColorManaAbility; +import mage.abilities.mana.WhiteManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * @author JayDi85 + */ + +public final class AngelicReward extends CardImpl { + + public AngelicReward(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{W}{W}"); + this.subtype.add(SubType.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 and has flying. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(3, 3, Duration.WhileOnBattlefield))); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(FlyingAbility.getInstance(), AttachmentType.AURA))); + } + + public AngelicReward(final AngelicReward card) { + super(card); + } + + @Override + public AngelicReward copy() { + return new AngelicReward(this); + } +} diff --git a/Mage.Sets/src/mage/cards/a/AngelsTomb.java b/Mage.Sets/src/mage/cards/a/AngelsTomb.java index 6cd8c0e5ad9..9eec7a62863 100644 --- a/Mage.Sets/src/mage/cards/a/AngelsTomb.java +++ b/Mage.Sets/src/mage/cards/a/AngelsTomb.java @@ -1,10 +1,8 @@ package mage.cards.a; -import java.util.UUID; - -import mage.MageInt; -import mage.abilities.common.CreatureEntersBattlefieldTriggeredAbility; +import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; +import mage.abilities.effects.Effect; import mage.abilities.effects.common.continuous.BecomesCreatureSourceEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; @@ -12,10 +10,12 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.SubType; -import mage.game.permanent.token.TokenImpl; -import mage.game.permanent.token.Token; +import mage.constants.Zone; +import mage.filter.StaticFilters; import mage.game.permanent.token.custom.CreatureToken; +import java.util.UUID; + /** * @author Loki */ @@ -25,12 +25,18 @@ public final class AngelsTomb extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}"); // Whenever a creature enters the battlefield under your control, you may have Angel's Tomb become a 3/3 white Angel artifact creature with flying until end of turn. - this.addAbility(new CreatureEntersBattlefieldTriggeredAbility(new BecomesCreatureSourceEffect( - new CreatureToken(3, 3, "3/3 white Angel artifact creature with flying") - .withColor("W") - .withSubType(SubType.ANGEL) - .withAbility(FlyingAbility.getInstance()), - "", Duration.EndOfTurn), true)); + Effect effect = new BecomesCreatureSourceEffect(new CreatureToken(3, 3, "3/3 white Angel artifact creature with flying") + .withColor("W") + .withSubType(SubType.ANGEL) + .withAbility(FlyingAbility.getInstance()), + "", Duration.EndOfTurn) + .setText("have {this} become a 3/3 white Angel artifact creature with flying until end of turn"); + this.addAbility(new EntersBattlefieldControlledTriggeredAbility( + Zone.BATTLEFIELD, + effect, + StaticFilters.FILTER_PERMANENT_CREATURE_A, + true) + ); } public AngelsTomb(final AngelsTomb card) { diff --git a/Mage.Sets/src/mage/cards/a/AngrathMinotaurPirate.java b/Mage.Sets/src/mage/cards/a/AngrathMinotaurPirate.java index a35ad846ac8..d4f1f010f26 100644 --- a/Mage.Sets/src/mage/cards/a/AngrathMinotaurPirate.java +++ b/Mage.Sets/src/mage/cards/a/AngrathMinotaurPirate.java @@ -4,7 +4,7 @@ package mage.cards.a; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.Effects; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DamageAllControlledTargetEffect; @@ -39,7 +39,7 @@ public final class AngrathMinotaurPirate extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.ANGRATH); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(5)); // +2: Angrath, Minotaur Pirate deals 1 damage to target opponent and each creature that player controls. Effects effects1 = new Effects(); diff --git a/Mage.Sets/src/mage/cards/a/AngrathTheFlameChained.java b/Mage.Sets/src/mage/cards/a/AngrathTheFlameChained.java index 00c5d3028c3..c37312ddb63 100644 --- a/Mage.Sets/src/mage/cards/a/AngrathTheFlameChained.java +++ b/Mage.Sets/src/mage/cards/a/AngrathTheFlameChained.java @@ -5,7 +5,7 @@ import java.util.UUID; import mage.abilities.Ability; import mage.abilities.DelayedTriggeredAbility; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.LoseLifeOpponentsEffect; @@ -41,7 +41,7 @@ public final class AngrathTheFlameChained extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.ANGRATH); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(4)); // +1: Each opponent discards a card and loses 2 life. LoyaltyAbility ability = new LoyaltyAbility(new DiscardEachPlayerEffect(TargetController.OPPONENT), 1); diff --git a/Mage.Sets/src/mage/cards/a/ApexOfPower.java b/Mage.Sets/src/mage/cards/a/ApexOfPower.java index 7cedb5425bb..edf76709889 100644 --- a/Mage.Sets/src/mage/cards/a/ApexOfPower.java +++ b/Mage.Sets/src/mage/cards/a/ApexOfPower.java @@ -4,14 +4,13 @@ import java.util.Set; import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; -import mage.abilities.effects.AsThoughEffectImpl; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.asthought.PlayFromNotOwnHandZoneTargetEffect; import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.AsThoughEffectType; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; @@ -79,7 +78,7 @@ class ApexOfPowerSpellEffect extends OneShotEffect { if (card.isLand()) { continue; } - ContinuousEffect effect = new ApexOfPowerCastFromExileEffect(); + ContinuousEffect effect = new PlayFromNotOwnHandZoneTargetEffect(Zone.EXILED, Duration.EndOfTurn); effect.setTargetPointer(new FixedTarget(card.getId(), card.getZoneChangeCounter(game))); game.addEffect(effect, source); } @@ -87,34 +86,6 @@ class ApexOfPowerSpellEffect extends OneShotEffect { } } -class ApexOfPowerCastFromExileEffect extends AsThoughEffectImpl { - - public ApexOfPowerCastFromExileEffect() { - super(AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, Duration.EndOfTurn, Outcome.Benefit); - staticText = "You may play the card from exile"; - } - - public ApexOfPowerCastFromExileEffect(final ApexOfPowerCastFromExileEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - return true; - } - - @Override - public ApexOfPowerCastFromExileEffect copy() { - return new ApexOfPowerCastFromExileEffect(this); - } - - @Override - public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) { - return source.isControlledBy(affectedControllerId) - && objectId.equals(getTargetPointer().getFirst(game, source)); - } -} - class ApexOfPowerManaEffect extends OneShotEffect { public ApexOfPowerManaEffect() { diff --git a/Mage.Sets/src/mage/cards/a/ArcaneAdaptation.java b/Mage.Sets/src/mage/cards/a/ArcaneAdaptation.java index 0a0d05fd249..ee192097ff1 100644 --- a/Mage.Sets/src/mage/cards/a/ArcaneAdaptation.java +++ b/Mage.Sets/src/mage/cards/a/ArcaneAdaptation.java @@ -64,7 +64,7 @@ class ConspyEffect extends ContinuousEffectImpl { @Override public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) { Player controller = game.getPlayer(source.getControllerId()); - SubType subType = ChooseCreatureTypeEffect.getChoosenCreatureType(source.getSourceId(), game); + SubType subType = ChooseCreatureTypeEffect.getChosenCreatureType(source.getSourceId(), game); if (controller != null && subType != null) { // Creature cards you own that aren't on the battlefield // in graveyard diff --git a/Mage.Sets/src/mage/cards/a/ArcaneArtisan.java b/Mage.Sets/src/mage/cards/a/ArcaneArtisan.java index 44c97f4d767..52fe2bd0c7e 100644 --- a/Mage.Sets/src/mage/cards/a/ArcaneArtisan.java +++ b/Mage.Sets/src/mage/cards/a/ArcaneArtisan.java @@ -1,9 +1,6 @@ package mage.cards.a; -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -15,24 +12,27 @@ import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; import mage.abilities.effects.common.CreateTokenCopyTargetEffect; import mage.cards.Card; -import mage.constants.SubType; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; +import mage.constants.SubType; import mage.constants.Zone; -import mage.filter.FilterCard; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; -import mage.target.Target; +import mage.target.TargetCard; import mage.target.TargetPlayer; import mage.target.common.TargetCardInHand; import mage.target.targetpointer.FixedTarget; import mage.util.CardUtil; +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; + /** - * * @author TheElk801 */ public final class ArcaneArtisan extends CardImpl { @@ -46,10 +46,14 @@ public final class ArcaneArtisan extends CardImpl { this.toughness = new MageInt(3); // {2}{U}, {T}: Target player draws a card, then exiles a card from their hand. If a creature card is exiled this way, that player creates a token that's a copy of that card. - Ability ability = new SimpleActivatedAbility(new ArcaneArtisanCreateTokenEffect(), new ManaCostsImpl("{2}{U}")); + Ability ability = new SimpleActivatedAbility( + new ArcaneArtisanCreateTokenEffect(), + new ManaCostsImpl("{2}{U}") + ); ability.addCost(new TapSourceCost()); ability.addTarget(new TargetPlayer()); this.addAbility(ability); + // When Arcane Artisan leaves the battlefield, exile all tokens created with it at the beginning of the next end step. this.addAbility(new ArcaneArtisanLeavesBattlefieldTriggeredAbility()); } @@ -66,13 +70,13 @@ public final class ArcaneArtisan extends CardImpl { class ArcaneArtisanCreateTokenEffect extends OneShotEffect { - ArcaneArtisanCreateTokenEffect() { + public ArcaneArtisanCreateTokenEffect() { super(Outcome.Benefit); this.staticText = "Target player draws a card, then exiles a card from their hand. " + "If a creature card is exiled this way, that player creates a token that's a copy of that card."; } - ArcaneArtisanCreateTokenEffect(final ArcaneArtisanCreateTokenEffect effect) { + public ArcaneArtisanCreateTokenEffect(final ArcaneArtisanCreateTokenEffect effect) { super(effect); } @@ -88,8 +92,8 @@ class ArcaneArtisanCreateTokenEffect extends OneShotEffect { return false; } player.drawCards(1, game); - Target target = new TargetCardInHand(1, new FilterCard()); - if (!player.chooseTarget(Outcome.Exile, target, source, game)) { + TargetCard target = new TargetCardInHand(1, StaticFilters.FILTER_CARD); + if (!player.chooseTarget(Outcome.Exile, player.getHand(), target, source, game)) { return false; } Card card = game.getCard(target.getFirstTarget()); @@ -119,14 +123,14 @@ class ArcaneArtisanCreateTokenEffect extends OneShotEffect { class ArcaneArtisanLeavesBattlefieldTriggeredAbility extends ZoneChangeTriggeredAbility { - ArcaneArtisanLeavesBattlefieldTriggeredAbility() { + public ArcaneArtisanLeavesBattlefieldTriggeredAbility() { super(Zone.BATTLEFIELD, null, new CreateDelayedTriggeredAbilityEffect(new AtTheBeginOfNextEndStepDelayedTriggeredAbility(new ArcaneArtisanExileEffect())), "", false ); } - ArcaneArtisanLeavesBattlefieldTriggeredAbility(ArcaneArtisanLeavesBattlefieldTriggeredAbility ability) { + public ArcaneArtisanLeavesBattlefieldTriggeredAbility(ArcaneArtisanLeavesBattlefieldTriggeredAbility ability) { super(ability); } @@ -143,12 +147,12 @@ class ArcaneArtisanLeavesBattlefieldTriggeredAbility extends ZoneChangeTriggered class ArcaneArtisanExileEffect extends OneShotEffect { - ArcaneArtisanExileEffect() { + public ArcaneArtisanExileEffect() { super(Outcome.Benefit); this.staticText = "exile all tokens created with {this}."; } - ArcaneArtisanExileEffect(final ArcaneArtisanExileEffect effect) { + public ArcaneArtisanExileEffect(final ArcaneArtisanExileEffect effect) { super(effect); } diff --git a/Mage.Sets/src/mage/cards/a/ArclightPhoenix.java b/Mage.Sets/src/mage/cards/a/ArclightPhoenix.java index 8ca0e64be47..89fe19f8ee8 100644 --- a/Mage.Sets/src/mage/cards/a/ArclightPhoenix.java +++ b/Mage.Sets/src/mage/cards/a/ArclightPhoenix.java @@ -17,6 +17,7 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.TargetController; import mage.constants.WatcherScope; +import mage.constants.Zone; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.stack.Spell; @@ -44,8 +45,9 @@ public final class ArclightPhoenix extends CardImpl { // At the beginning of combat on your turn, if you cast 3 or more instants and/or sorceries this turn, you may return Arclight Phoenix from your graveyard to the battlefield. this.addAbility(new ConditionalInterveningIfTriggeredAbility( new BeginningOfCombatTriggeredAbility( + Zone.GRAVEYARD, new ReturnSourceFromGraveyardToBattlefieldEffect(), - TargetController.YOU, true + TargetController.YOU, true, false ), ArclightPhoenixCondition.instance, "At the beginning of combat on your turn, " + "if you've cast three or more instant " @@ -79,7 +81,7 @@ enum ArclightPhoenixCondition implements Condition { class ArclightPhoenixWatcher extends Watcher { - private Map instantSorceryCount = new HashMap(); + private final Map instantSorceryCount = new HashMap(); public ArclightPhoenixWatcher() { super(ArclightPhoenixWatcher.class.getSimpleName(), WatcherScope.GAME); diff --git a/Mage.Sets/src/mage/cards/a/ArguelsBloodFast.java b/Mage.Sets/src/mage/cards/a/ArguelsBloodFast.java index 89be4d3219a..1bc606d1529 100644 --- a/Mage.Sets/src/mage/cards/a/ArguelsBloodFast.java +++ b/Mage.Sets/src/mage/cards/a/ArguelsBloodFast.java @@ -2,6 +2,7 @@ package mage.cards.a; import java.util.UUID; + import mage.abilities.Ability; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; @@ -14,14 +15,12 @@ import mage.abilities.effects.common.TransformSourceEffect; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.t.TempleOfAclazotz; import mage.constants.CardType; import mage.constants.SuperType; import mage.constants.TargetController; import mage.constants.Zone; /** - * * @author TheElk801 */ public final class ArguelsBloodFast extends CardImpl { @@ -31,7 +30,7 @@ public final class ArguelsBloodFast extends CardImpl { addSuperType(SuperType.LEGENDARY); this.transformable = true; - this.secondSideCardClazz = TempleOfAclazotz.class; + this.secondSideCardClazz = mage.cards.t.TempleOfAclazotz.class; // {1}{B}, Pay 2 life: Draw a card. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), new ManaCostsImpl("{1}{B}")); diff --git a/Mage.Sets/src/mage/cards/a/ArlinnKord.java b/Mage.Sets/src/mage/cards/a/ArlinnKord.java index 73456139fc2..65387beee31 100644 --- a/Mage.Sets/src/mage/cards/a/ArlinnKord.java +++ b/Mage.Sets/src/mage/cards/a/ArlinnKord.java @@ -3,7 +3,7 @@ package mage.cards.a; import java.util.UUID; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.TransformSourceEffect; @@ -35,7 +35,7 @@ public final class ArlinnKord extends CardImpl { this.transformable = true; this.secondSideCardClazz = ArlinnEmbracedByTheMoon.class; - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3)); // +1: Until end of turn, up to one target creature gets +2/+2 and gains vigilance and haste. Effect effect = new BoostTargetEffect(2, 2, Duration.EndOfTurn); diff --git a/Mage.Sets/src/mage/cards/a/ArtfulTakedown.java b/Mage.Sets/src/mage/cards/a/ArtfulTakedown.java index 21a679dd647..076db17cd79 100644 --- a/Mage.Sets/src/mage/cards/a/ArtfulTakedown.java +++ b/Mage.Sets/src/mage/cards/a/ArtfulTakedown.java @@ -8,6 +8,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; +import mage.filter.common.FilterCreaturePermanent; import mage.target.common.TargetCreaturePermanent; /** @@ -16,6 +17,11 @@ import mage.target.common.TargetCreaturePermanent; */ public final class ArtfulTakedown extends CardImpl { + private static final FilterCreaturePermanent filter1 + = new FilterCreaturePermanent("creature (to tap)"); + private static final FilterCreaturePermanent filter2 + = new FilterCreaturePermanent("creature (to shrink)"); + public ArtfulTakedown(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{U}{B}"); @@ -24,13 +30,17 @@ public final class ArtfulTakedown extends CardImpl { this.getSpellAbility().getModes().setMaxModes(2); // • Tap target creature. - this.getSpellAbility().addEffect(new TapTargetEffect()); - this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + this.getSpellAbility().addEffect( + new TapTargetEffect().setText("target creature") + ); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter1)); // • Target creature gets -2/-4 until end of turn. - Mode mode = new Mode(); - mode.getEffects().add(new BoostTargetEffect(-2, -4, Duration.EndOfTurn)); - mode.getTargets().add(new TargetCreaturePermanent()); + Mode mode = new Mode( + new BoostTargetEffect(-2, -4, Duration.EndOfTurn) + .setText("target creature gets -2/-4 until end of turn") + ); + mode.addTarget(new TargetCreaturePermanent(filter2)); this.getSpellAbility().addMode(mode); } diff --git a/Mage.Sets/src/mage/cards/a/AryelKnightOfWindgrace.java b/Mage.Sets/src/mage/cards/a/AryelKnightOfWindgrace.java index 4e8c867ee37..86ad83f7f44 100644 --- a/Mage.Sets/src/mage/cards/a/AryelKnightOfWindgrace.java +++ b/Mage.Sets/src/mage/cards/a/AryelKnightOfWindgrace.java @@ -1,4 +1,3 @@ - package mage.cards.a; import java.util.UUID; @@ -6,6 +5,7 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.Cost; +import mage.abilities.costs.VariableCost; import mage.abilities.costs.VariableCostImpl; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.common.TapTargetCost; @@ -16,17 +16,21 @@ import mage.abilities.keyword.VigilanceAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.ComparisonType; import mage.constants.SubType; import mage.constants.SuperType; -import mage.constants.TargetAdjustment; import mage.constants.Zone; import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.PowerPredicate; import mage.filter.predicate.mageobject.SubtypePredicate; import mage.filter.predicate.permanent.TappedPredicate; import mage.game.Game; import mage.game.permanent.token.KnightToken; import mage.target.common.TargetControlledPermanent; +import mage.target.common.TargetCreaturePermanent; +import mage.target.targetadjustment.TargetAdjuster; /** * @@ -57,9 +61,8 @@ public final class AryelKnightOfWindgrace extends CardImpl { .setText("Destroy target creature with power X or less"), new ManaCostsImpl("{B}")); ability.addCost(new TapSourceCost()); ability.addCost(new AryelTapXTargetCost()); - ability.setTargetAdjustment(TargetAdjustment.CREATURE_POWER_X_OR_LESS); + ability.setTargetAdjuster(AryelKnightOfWindgraceAdjuster.instance); this.addAbility(ability); - ability.getOriginalId(); } public AryelKnightOfWindgrace(final AryelKnightOfWindgrace card) { @@ -106,3 +109,19 @@ class AryelTapXTargetCost extends VariableCostImpl { return new TapTargetCost(target); } } + +enum AryelKnightOfWindgraceAdjuster implements TargetAdjuster { + instance; + + @Override + public void adjustTargets(Ability ability, Game game) { + int value = 0; + for (VariableCost cost : ability.getCosts().getVariableCosts()) { + value = cost.getAmount(); + } + FilterCreaturePermanent filterCreaturePermanent = new FilterCreaturePermanent("creature with power " + value + " or less"); + filterCreaturePermanent.add(new PowerPredicate(ComparisonType.FEWER_THAN, value + 1)); + ability.getTargets().clear(); + ability.addTarget(new TargetCreaturePermanent(filterCreaturePermanent)); + } +} diff --git a/Mage.Sets/src/mage/cards/a/AshesOfTheFallen.java b/Mage.Sets/src/mage/cards/a/AshesOfTheFallen.java index 98879879a76..8af731bee2b 100644 --- a/Mage.Sets/src/mage/cards/a/AshesOfTheFallen.java +++ b/Mage.Sets/src/mage/cards/a/AshesOfTheFallen.java @@ -57,7 +57,7 @@ class AshesOfTheFallenEffect extends ContinuousEffectImpl { Player controller = game.getPlayer(source.getControllerId()); Permanent permanent = game.getPermanent(source.getSourceId()); if (controller != null && permanent != null) { - SubType subType = ChooseCreatureTypeEffect.getChoosenCreatureType(permanent.getId(), game); + SubType subType = ChooseCreatureTypeEffect.getChosenCreatureType(permanent.getId(), game); if (subType != null) { for (UUID cardId : controller.getGraveyard()) { Card card = game.getCard(cardId); diff --git a/Mage.Sets/src/mage/cards/a/AshiokNightmareWeaver.java b/Mage.Sets/src/mage/cards/a/AshiokNightmareWeaver.java index b43affceb1f..810e91e0aad 100644 --- a/Mage.Sets/src/mage/cards/a/AshiokNightmareWeaver.java +++ b/Mage.Sets/src/mage/cards/a/AshiokNightmareWeaver.java @@ -5,7 +5,7 @@ import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.costs.Cost; import mage.abilities.costs.common.PayVariableLoyaltyCost; import mage.abilities.effects.ContinuousEffectImpl; @@ -35,7 +35,7 @@ public final class AshiokNightmareWeaver extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.ASHIOK); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3)); // +2: Exile the top three cards of target opponent's library. LoyaltyAbility ability = new LoyaltyAbility(new AshiokNightmareWeaverExileEffect(), 2); diff --git a/Mage.Sets/src/mage/cards/a/AurraSingBaneOfJedi.java b/Mage.Sets/src/mage/cards/a/AurraSingBaneOfJedi.java index 1bf9c3acace..b09ac13a395 100644 --- a/Mage.Sets/src/mage/cards/a/AurraSingBaneOfJedi.java +++ b/Mage.Sets/src/mage/cards/a/AurraSingBaneOfJedi.java @@ -5,7 +5,7 @@ import java.util.List; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DamageControllerEffect; @@ -37,7 +37,7 @@ public final class AurraSingBaneOfJedi extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{2}{B}{R}"); this.subtype.add(SubType.AURRA); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3)); // +1:You may have {this} deal 2 damage to target creature. If you don't, {this} deals 1 damage to you. Ability ability = new LoyaltyAbility(new AurraSingBaneOfJediEffect(), +1); diff --git a/Mage.Sets/src/mage/cards/a/AvacynianMissionaries.java b/Mage.Sets/src/mage/cards/a/AvacynianMissionaries.java index 6c69bfeeb3b..10cdb29561c 100644 --- a/Mage.Sets/src/mage/cards/a/AvacynianMissionaries.java +++ b/Mage.Sets/src/mage/cards/a/AvacynianMissionaries.java @@ -2,6 +2,7 @@ package mage.cards.a; import java.util.UUID; + import mage.MageInt; import mage.abilities.common.BeginningOfEndStepTriggeredAbility; import mage.abilities.condition.common.EquippedSourceCondition; @@ -9,27 +10,25 @@ import mage.abilities.effects.common.TransformSourceEffect; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.l.LunarchInquisitors; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.TargetController; import mage.constants.Zone; /** - * * @author fireshoes */ public final class AvacynianMissionaries extends CardImpl { public AvacynianMissionaries(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.CLERIC); this.power = new MageInt(3); this.toughness = new MageInt(3); this.transformable = true; - this.secondSideCardClazz = LunarchInquisitors.class; + this.secondSideCardClazz = mage.cards.l.LunarchInquisitors.class; // At the beginning of your end step, if Avacynian Missionaries is equipped, transform it. this.addAbility(new TransformAbility()); diff --git a/Mage.Sets/src/mage/cards/a/AzorsGateway.java b/Mage.Sets/src/mage/cards/a/AzorsGateway.java index ce422328f8c..499991f9ea2 100644 --- a/Mage.Sets/src/mage/cards/a/AzorsGateway.java +++ b/Mage.Sets/src/mage/cards/a/AzorsGateway.java @@ -4,6 +4,7 @@ package mage.cards.a; import java.util.HashSet; import java.util.Set; import java.util.UUID; + import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -16,7 +17,6 @@ import mage.abilities.keyword.TransformAbility; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.s.SanctumOfTheSun; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SuperType; @@ -28,7 +28,6 @@ import mage.target.common.TargetCardInHand; import mage.util.CardUtil; /** - * * @author LevelX2 */ public final class AzorsGateway extends CardImpl { @@ -38,7 +37,7 @@ public final class AzorsGateway extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.transformable = true; - this.secondSideCardClazz = SanctumOfTheSun.class; + this.secondSideCardClazz = mage.cards.s.SanctumOfTheSun.class; // {1}, {T}: Draw a card, then exile a card from your hand. If cards with five or more different converted mana costs are exiled with Azor's Gateway, you gain 5 life, untap Azor's Gateway, and transform it. this.addAbility(new TransformAbility()); diff --git a/Mage.Sets/src/mage/cards/b/BINGO.java b/Mage.Sets/src/mage/cards/b/BINGO.java new file mode 100644 index 00000000000..185acbd19d8 --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BINGO.java @@ -0,0 +1,186 @@ + +package mage.cards.b; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import java.util.UUID; +import mage.MageInt; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.common.SpellCastAllTriggeredAbility; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.SetTargetPointer; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.filter.FilterSpell; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.game.stack.Spell; +import mage.util.CardUtil; + +/** + * + * @author L_J + */ +public final class BINGO extends CardImpl { + + public BINGO(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{G}"); + this.subtype.add(SubType.HOUND); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // Trample + this.addAbility(TrampleAbility.getInstance()); + + // Whenever a player casts a spell, put a chip counter on its converted mana cost. + this.addAbility(new SpellCastAllTriggeredAbility(new BingoEffect(), new FilterSpell("a spell"), false, SetTargetPointer.SPELL)); + + // B-I-N-G-O gets +9/+9 for each set of three numbers in a row with chip counters on them. + BingoCount count = new BingoCount(); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostSourceEffect(count, count, Duration.WhileOnBattlefield))); + } + + public BINGO(final BINGO card) { + super(card); + } + + @Override + public BINGO copy() { + return new BINGO(this); + } +} + +class BingoEffect extends OneShotEffect { + + public BingoEffect() { + super(Outcome.Neutral); + staticText = "put a chip counter on its converted mana cost"; + } + + public BingoEffect(final BingoEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Spell spell = game.getStack().getSpell(this.getTargetPointer().getFirst(game, source)); + if (spell != null) { + if (spell.getConvertedManaCost() > 9) { + return true; + } + MageObject mageObject = game.getObject(source.getSourceId()); + if (mageObject != null) { + Map chipCounters = new HashMap<>(); // Map + if (game.getState().getValue(mageObject.getId() + "_chip") != null) { + chipCounters.putAll((Map) game.getState().getValue(mageObject.getId() + "_chip")); + } + chipCounters.putIfAbsent(spell.getConvertedManaCost(), 0); + chipCounters.put(spell.getConvertedManaCost(), chipCounters.get(spell.getConvertedManaCost()) + 1); + game.getState().setValue(mageObject.getId() + "_chip", chipCounters); + if (mageObject instanceof Permanent) { + StringBuilder sb = new StringBuilder(); + int i = 0; + for (Map.Entry entry : chipCounters.entrySet()) { + i++; + sb.append(entry.getKey()); + if (i < chipCounters.size()) { + sb.append(", "); + } + } + ((Permanent) mageObject).addInfo("chip counters", CardUtil.addToolTipMarkTags("Chip counters at: " + sb), game); + new AddCountersSourceEffect(CounterType.CHIP.createInstance()).apply(game, source); + } + return true; + } + } + return false; + } + + @Override + public BingoEffect copy() { + return new BingoEffect(this); + } +} + +class BingoCount implements DynamicValue { + + public BingoCount() { + } + + public BingoCount(final BingoCount countersCount) { + } + + @Override + public int calculate(Game game, Ability sourceAbility, Effect effect) { + MageObject mageObject = game.getObject(sourceAbility.getSourceId()); + if (mageObject instanceof Permanent) { + Permanent permanent = game.getPermanentOrLKIBattlefield(sourceAbility.getSourceId()); + if (permanent != null && game.getState().getValue(mageObject.getId() + "_chip") != null) { + int rows = 0; + Set nums = ((Map) game.getState().getValue(mageObject.getId() + "_chip")).keySet(); + // if (nums.size() <= permanent.getCounters(game).getCount(CounterType.CHIP)) { + + // 1 4 7 + // 8 5 3 + // 2 0 6 + + if (nums.contains(1) && nums.contains(4) && nums.contains(7)) { + rows++; + } + if (nums.contains(1) && nums.contains(8) && nums.contains(2)) { + rows++; + } + if (nums.contains(1) && nums.contains(5) && nums.contains(6)) { + rows++; + } + if (nums.contains(8) && nums.contains(5) && nums.contains(3)) { + rows++; + } + if (nums.contains(4) && nums.contains(5) && nums.contains(0)) { + rows++; + } + if (nums.contains(2) && nums.contains(0) && nums.contains(6)) { + rows++; + } + if (nums.contains(7) && nums.contains(3) && nums.contains(6)) { + rows++; + } + if (nums.contains(2) && nums.contains(5) && nums.contains(7)) { + rows++; + } + return rows * 9; + // } + } + } + return 0; + } + + @Override + public BingoCount copy() { + return new BingoCount(this); + } + + @Override + public String toString() { + return "9"; + } + + @Override + public String getMessage() { + return "set of three numbers in a row with chip counters on them"; + } +} diff --git a/Mage.Sets/src/mage/cards/b/BeaconBolt.java b/Mage.Sets/src/mage/cards/b/BeaconBolt.java index 39ec31e518e..fe0ca03e892 100644 --- a/Mage.Sets/src/mage/cards/b/BeaconBolt.java +++ b/Mage.Sets/src/mage/cards/b/BeaconBolt.java @@ -7,6 +7,7 @@ import mage.abilities.keyword.JumpStartAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.target.common.TargetCreaturePermanent; /** * @@ -23,6 +24,7 @@ public final class BeaconBolt extends CardImpl { ).setText("{this} deals damage to target creature equal to " + "the total number of instant and sorcery cards " + "you own in exile and in your graveyard")); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); // Jump-start this.addAbility(new JumpStartAbility(this)); diff --git a/Mage.Sets/src/mage/cards/b/BeamsplitterMage.java b/Mage.Sets/src/mage/cards/b/BeamsplitterMage.java new file mode 100644 index 00000000000..0cd6c16ea0b --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BeamsplitterMage.java @@ -0,0 +1,226 @@ +package mage.cards.b; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.Mode; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.OneShotEffect; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledPermanent; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.game.stack.Spell; +import mage.players.Player; +import mage.target.Target; +import mage.target.TargetPermanent; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author TheElk801 + */ +public final class BeamsplitterMage extends CardImpl { + + public BeamsplitterMage(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{U}{R}"); + + this.subtype.add(SubType.VEDALKEN); + this.subtype.add(SubType.WIZARD); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Whenever you cast an instant or sorcery spell that targets only Beamsplitter Mage, if you control one or more creatures that spell could target, choose one of those creatures. Copy that spell. The copy targets the chosen creature. + this.addAbility(new BeamsplitterMageTriggeredAbility()); + } + + public BeamsplitterMage(final BeamsplitterMage card) { + super(card); + } + + @Override + public BeamsplitterMage copy() { + return new BeamsplitterMage(this); + } +} + +class BeamsplitterMageTriggeredAbility extends TriggeredAbilityImpl { + + public BeamsplitterMageTriggeredAbility() { + super(Zone.BATTLEFIELD, new BeamsplitterMageEffect(), false); + } + + public BeamsplitterMageTriggeredAbility(final BeamsplitterMageTriggeredAbility ability) { + super(ability); + } + + @Override + public BeamsplitterMageTriggeredAbility copy() { + return new BeamsplitterMageTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.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 (!isControlledInstantOrSorcery(spell)) { + return false; + } + boolean targetsSource = false; + for (Ability ability : spell.getSpellAbilities()) { + for (UUID modeId : ability.getModes().getSelectedModes()) { + Mode mode = ability.getModes().get(modeId); + for (Target target : mode.getTargets()) { + if (!target.isNotTarget()) { + for (UUID targetId : target.getTargets()) { + if (targetId.equals(getSourceId())) { + targetsSource = true; + } else { + return false; + } + } + } + } + } + } + if (targetsSource) { + this.getEffects().get(0).setTargetPointer(new FixedTarget(spell.getId())); + return true; + } + } + return false; + } + + private boolean isControlledInstantOrSorcery(Spell spell) { + return spell != null + && (spell.isControlledBy(this.getControllerId())) + && (spell.isInstant() || spell.isSorcery()); + } + + @Override + public String getRule() { + return "Whenever you cast an instant or sorcery spell that targets " + + "only {this}, if you control one or more creatures " + + "that spell could target, choose one of those creatures. " + + "Copy that spell. The copy targets the chosen creature."; + } +} + +class BeamsplitterMageEffect extends OneShotEffect { + + public BeamsplitterMageEffect() { + super(Outcome.Detriment); + } + + public BeamsplitterMageEffect(final BeamsplitterMageEffect effect) { + super(effect); + } + + @Override + public BeamsplitterMageEffect copy() { + return new BeamsplitterMageEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Spell spell = game.getSpellOrLKIStack(this.getTargetPointer().getFirst(game, source)); + Player controller = game.getPlayer(source.getControllerId()); + if (spell != null && controller != null) { + // search the target that targets source + Target usedTarget = null; + setUsedTarget: + for (Ability ability : spell.getSpellAbilities()) { + for (UUID modeId : ability.getModes().getSelectedModes()) { + Mode mode = ability.getModes().get(modeId); + for (Target target : mode.getTargets()) { + if (!target.isNotTarget() && target.getFirstTarget().equals(source.getSourceId())) { + usedTarget = target.copy(); + usedTarget.clearChosen(); + break setUsedTarget; + } + } + } + } + if (usedTarget == null) { + return false; + } + FilterPermanent filter = new BeamsplitterMageFilter(usedTarget, source.getSourceId()); + Target target1 = new TargetPermanent(filter); + target1.setNotTarget(true); + if (controller.choose(outcome, target1, source.getSourceId(), game)) { + Permanent creature = game.getPermanent(target1.getFirstTarget()); + if (creature == null) { + return false; + } + Spell copy = spell.copySpell(source.getControllerId()); + game.getStack().push(copy); + setTarget: + for (UUID modeId : copy.getSpellAbility().getModes().getSelectedModes()) { + Mode mode = copy.getSpellAbility().getModes().get(modeId); + for (Target target : mode.getTargets()) { + if (target.getClass().equals(usedTarget.getClass())) { + target.clearChosen(); // For targets with Max > 1 we need to clear before the text is comapred + if (target.getMessage().equals(usedTarget.getMessage())) { + target.addTarget(creature.getId(), copy.getSpellAbility(), game, false); + break setTarget; + } + } + } + } + game.fireEvent(new GameEvent(GameEvent.EventType.COPIED_STACKOBJECT, copy.getId(), spell.getId(), source.getControllerId())); + String activateMessage = copy.getActivatedMessage(game); + if (activateMessage.startsWith(" casts ")) { + activateMessage = activateMessage.substring(6); + } + if (!game.isSimulation()) { + game.informPlayers(controller.getLogName() + activateMessage); + } + } + return true; + } + return false; + } +} + +class BeamsplitterMageFilter extends FilterControlledPermanent { + + private final Target target; + private final UUID notId; + + public BeamsplitterMageFilter(Target target, UUID notId) { + super("creature this spell could target"); + this.target = target; + this.notId = notId; + } + + public BeamsplitterMageFilter(final BeamsplitterMageFilter filter) { + super(filter); + this.target = filter.target; + this.notId = filter.notId; + } + + @Override + public BeamsplitterMageFilter copy() { + return new BeamsplitterMageFilter(this); + } + + @Override + public boolean match(Permanent permanent, UUID sourceId, UUID playerId, Game game) { + return super.match(permanent, game) + && permanent.isCreature() + && !permanent.getId().equals(notId) + && target.canTarget(permanent.getId(), game); + } +} diff --git a/Mage.Sets/src/mage/cards/b/BeastInShow.java b/Mage.Sets/src/mage/cards/b/BeastInShow.java new file mode 100644 index 00000000000..d865d0baed8 --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BeastInShow.java @@ -0,0 +1,36 @@ + +package mage.cards.b; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; + +/** + * + * @author L_J + */ +public final class BeastInShow extends CardImpl { + + public BeastInShow(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{G}{G}"); + this.subtype.add(SubType.BEAST); + this.power = new MageInt(6); + this.toughness = new MageInt(4); + + // Trample + this.addAbility(TrampleAbility.getInstance()); + } + + public BeastInShow(final BeastInShow card) { + super(card); + } + + @Override + public BeastInShow copy() { + return new BeastInShow(this); + } +} diff --git a/Mage.Sets/src/mage/cards/b/BlastFromThePast.java b/Mage.Sets/src/mage/cards/b/BlastFromThePast.java new file mode 100644 index 00000000000..72af5d013e7 --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BlastFromThePast.java @@ -0,0 +1,57 @@ + +package mage.cards.b; + +import java.util.UUID; +import mage.abilities.condition.common.KickedCondition; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.keyword.BuybackAbility; +import mage.abilities.keyword.CyclingAbility; +import mage.abilities.keyword.FlashbackAbility; +import mage.abilities.keyword.KickerAbility; +import mage.abilities.keyword.MadnessAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.TimingRule; +import mage.game.permanent.token.GoblinToken; +import mage.target.common.TargetAnyTarget; + +/** + * + * @author L_J + */ +public final class BlastFromThePast extends CardImpl { + + public BlastFromThePast (UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{2}{R}"); + + // Madness {R} + this.addAbility(new MadnessAbility(this, new ManaCostsImpl("{R}"))); + // Cycling {1}{R} + this.addAbility(new CyclingAbility(new ManaCostsImpl("{1}{R}"))); + // Kicker {2}{R} + this.addAbility(new KickerAbility("{2}{R}")); + // Flashback {3}{R} + this.addAbility(new FlashbackAbility(new ManaCostsImpl("{3}{R}"), TimingRule.INSTANT)); + // Buyback {4}{R} + this.addAbility(new BuybackAbility("{4}{R}")); + + // Blast from the Past deals 2 damage to any target. If this spell was kicked, create a 1/1 red Goblin creature token. + this.getSpellAbility().addEffect(new DamageTargetEffect(2)); + this.getSpellAbility().addTarget(new TargetAnyTarget()); + this.getSpellAbility().addEffect(new ConditionalOneShotEffect(new CreateTokenEffect(new GoblinToken()), KickedCondition.instance)); + } + + public BlastFromThePast (final BlastFromThePast card) { + super(card); + } + + @Override + public BlastFromThePast copy() { + return new BlastFromThePast(this); + } + +} diff --git a/Mage.Sets/src/mage/cards/b/BlindingRadiance.java b/Mage.Sets/src/mage/cards/b/BlindingRadiance.java new file mode 100644 index 00000000000..2ef6ef3039e --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BlindingRadiance.java @@ -0,0 +1,40 @@ +package mage.cards.b; + +import mage.abilities.effects.common.TapAllEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.ComparisonType; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.common.FilterOpponentsCreaturePermanent; +import mage.filter.predicate.mageobject.ToughnessPredicate; + +import java.util.UUID; + +/** + * @author JayDi85 + */ +public final class BlindingRadiance extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterOpponentsCreaturePermanent("creatures your opponents control with toughness 2 or less"); + static { + filter.add(new ToughnessPredicate(ComparisonType.FEWER_THAN, 3)); + } + + public BlindingRadiance(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{W}"); + + // Tap all creatures your opponents control with toughness 2 or less. + TapAllEffect effect = new TapAllEffect(filter); + this.getSpellAbility().addEffect(effect); + } + + public BlindingRadiance(final BlindingRadiance card) { + super(card); + } + + @Override + public BlindingRadiance copy() { + return new BlindingRadiance(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/b/BloodOperative.java b/Mage.Sets/src/mage/cards/b/BloodOperative.java index f1e43565b15..b3cde09e0f0 100644 --- a/Mage.Sets/src/mage/cards/b/BloodOperative.java +++ b/Mage.Sets/src/mage/cards/b/BloodOperative.java @@ -59,7 +59,7 @@ public final class BloodOperative extends CardImpl { class BloodOperativeTriggeredAbility extends TriggeredAbilityImpl { public BloodOperativeTriggeredAbility() { - super(Zone.BATTLEFIELD, new DoIfCostPaid(new ReturnSourceFromGraveyardToHandEffect(), new PayLifeCost(3)), false); + super(Zone.GRAVEYARD, new DoIfCostPaid(new ReturnSourceFromGraveyardToHandEffect(), new PayLifeCost(3)), false); } public BloodOperativeTriggeredAbility(final BloodOperativeTriggeredAbility ability) { diff --git a/Mage.Sets/src/mage/cards/b/Bloodletter.java b/Mage.Sets/src/mage/cards/b/Bloodletter.java new file mode 100644 index 00000000000..cbb888e5f1f --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/Bloodletter.java @@ -0,0 +1,110 @@ + +package mage.cards.b; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.StateTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DamageEverythingEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.filter.common.FilterNonlandPermanent; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; + +/** + * + * @author L_J + */ +public final class Bloodletter extends CardImpl { + + public Bloodletter(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{B}"); + this.subtype.add(SubType.ZOMBIE); + this.power = new MageInt(2); + this.toughness = new MageInt(3); + + // When the names of three or more nonland permanents begin with the same letter, sacrifice Bloodletter. If you do, it deals 2 damage to each creature and each player. + this.addAbility(new BloodletterStateTriggeredAbility()); + } + + public Bloodletter(final Bloodletter card) { + super(card); + } + + @Override + public Bloodletter copy() { + return new Bloodletter(this); + } +} + +class BloodletterStateTriggeredAbility extends StateTriggeredAbility { + + public BloodletterStateTriggeredAbility() { + super(Zone.BATTLEFIELD, new BloodletterEffect()); + } + + public BloodletterStateTriggeredAbility(final BloodletterStateTriggeredAbility ability) { + super(ability); + } + + @Override + public BloodletterStateTriggeredAbility copy() { + return new BloodletterStateTriggeredAbility(this); + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + Map initialCount = new HashMap<>(); + for (Permanent permanent : game.getBattlefield().getActivePermanents(new FilterNonlandPermanent(), getControllerId(), getSourceId(), game)) { + Character initial = permanent.getName().charAt(0); + initialCount.putIfAbsent(initial, 0); + initialCount.put(initial, initialCount.get(initial) + 1); + } + for (Map.Entry entry : initialCount.entrySet()) { + if (entry.getValue() >= 3) { + return true; + } + } + return false; + } + + @Override + public String getRule() { + return "When the names of three or more nonland permanents begin with the same letter, " + super.getRule(); + } +} + +class BloodletterEffect extends OneShotEffect { + + public BloodletterEffect() { + super(Outcome.Sacrifice); + staticText = "sacrifice {this}. If you do, it deals 2 damage to each creature and each player"; + } + + public BloodletterEffect(final BloodletterEffect effect) { + super(effect); + } + + @Override + public BloodletterEffect copy() { + return new BloodletterEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = game.getPermanent(source.getSourceId()); + if (permanent != null && permanent.sacrifice(source.getSourceId(), game)) { + return new DamageEverythingEffect(2).apply(game, source); + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/b/BloodlineKeeper.java b/Mage.Sets/src/mage/cards/b/BloodlineKeeper.java index 8069c414cbc..b9fc172095b 100644 --- a/Mage.Sets/src/mage/cards/b/BloodlineKeeper.java +++ b/Mage.Sets/src/mage/cards/b/BloodlineKeeper.java @@ -2,6 +2,7 @@ package mage.cards.b; import java.util.UUID; + import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.ActivateIfConditionActivatedAbility; @@ -15,7 +16,6 @@ import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.l.LordOfLineage; import mage.constants.CardType; import mage.constants.ComparisonType; import mage.constants.SubType; @@ -25,7 +25,6 @@ import mage.filter.predicate.mageobject.SubtypePredicate; import mage.game.permanent.token.VampireToken; /** - * * @author Loki */ public final class BloodlineKeeper extends CardImpl { @@ -44,7 +43,7 @@ public final class BloodlineKeeper extends CardImpl { this.toughness = new MageInt(3); this.transformable = true; - this.secondSideCardClazz = LordOfLineage.class; + this.secondSideCardClazz = mage.cards.l.LordOfLineage.class; this.addAbility(FlyingAbility.getInstance()); // {T}: Create a 2/2 black Vampire creature token with flying. diff --git a/Mage.Sets/src/mage/cards/b/BlowflyInfestation.java b/Mage.Sets/src/mage/cards/b/BlowflyInfestation.java index 82ee8fe7708..77782f57c30 100644 --- a/Mage.Sets/src/mage/cards/b/BlowflyInfestation.java +++ b/Mage.Sets/src/mage/cards/b/BlowflyInfestation.java @@ -55,7 +55,7 @@ public final class BlowflyInfestation extends CardImpl { class BlowflyInfestationCondition implements Condition { - private static Permanent permanent; + private Permanent permanent; @Override public boolean apply(Game game, Ability source) { diff --git a/Mage.Sets/src/mage/cards/b/BoarUmbra.java b/Mage.Sets/src/mage/cards/b/BoarUmbra.java index c161a7a1ca4..5e40bb1e6ad 100644 --- a/Mage.Sets/src/mage/cards/b/BoarUmbra.java +++ b/Mage.Sets/src/mage/cards/b/BoarUmbra.java @@ -31,8 +31,11 @@ public final class BoarUmbra extends CardImpl { 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))); + + // Totem armor this.addAbility(new TotemArmorAbility()); } diff --git a/Mage.Sets/src/mage/cards/b/BoosterTutor.java b/Mage.Sets/src/mage/cards/b/BoosterTutor.java new file mode 100644 index 00000000000..78d2d21b081 --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BoosterTutor.java @@ -0,0 +1,106 @@ + +package mage.cards.b; + +import java.util.HashSet; +import java.util.Set; +import java.util.List; +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ChooseExpansionSetEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.CardsImpl; +import mage.cards.ExpansionSet; +import mage.cards.Sets; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.game.Game; +import mage.players.Player; +import mage.target.TargetCard; + +/** + * + * @author spjspj & L_J + */ +public final class BoosterTutor extends CardImpl { + + public BoosterTutor(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{B}"); + + // Open a sealed Magic booster pack, reveal the cards, and put one of those cards into your hand. + this.getSpellAbility().addEffect(new BoosterTutorEffect()); + } + + public BoosterTutor(final BoosterTutor card) { + super(card); + } + + @Override + public BoosterTutor copy() { + return new BoosterTutor(this); + } +} + +class BoosterTutorEffect extends OneShotEffect { + + public BoosterTutorEffect() { + super(Outcome.DestroyPermanent); + this.staticText = "Open a sealed Magic booster pack, reveal the cards, and put one of those cards into your hand"; + } + + public BoosterTutorEffect(final BoosterTutorEffect effect) { + super(effect); + } + + @Override + public BoosterTutorEffect copy() { + return new BoosterTutorEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + ChooseExpansionSetEffect effect = new ChooseExpansionSetEffect(Outcome.UnboostCreature); + effect.apply(game, source); + Player controller = game.getPlayer(source.getControllerId()); + + String setChosen = null; + if (effect.getValue("setchosen") != null) { + setChosen = (String) effect.getValue("setchosen"); + } else if (game.getState().getValue(this.getId() + "_set") != null) { + setChosen = (String) game.getState().getValue(this.getId() + "_set"); + } + + if (setChosen != null && controller != null) { + //ExpansionInfo set = ExpansionRepository.instance.getSetByName(setChosen); + ExpansionSet expansionSet = Sets.findSet(setChosen); + if (expansionSet != null) { + List boosterPack = expansionSet.create15CardBooster(); + if (boosterPack != null) { + StringBuilder message = new StringBuilder(controller.getLogName()).append(" opened: "); + for (Card card : boosterPack) { + message.append(card.getName()).append(" "); + } + game.informPlayers(message.toString()); + + TargetCard targetCard = new TargetCard(Zone.ALL, new FilterCard()); + Set cardsToLoad = new HashSet(boosterPack); + game.loadCards(cardsToLoad, controller.getId()); + CardsImpl cards = new CardsImpl(); + cards.addAll(boosterPack); + if (controller.choose(Outcome.Benefit, cards, targetCard, game)) { + Card card = game.getCard(targetCard.getFirstTarget()); + if (card != null) { + controller.moveCards(card, Zone.HAND, source, game); + } + } + } + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/b/BorosLocket.java b/Mage.Sets/src/mage/cards/b/BorosLocket.java index d6dcb782971..414476efcc6 100644 --- a/Mage.Sets/src/mage/cards/b/BorosLocket.java +++ b/Mage.Sets/src/mage/cards/b/BorosLocket.java @@ -23,8 +23,8 @@ public final class BorosLocket extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}"); // {T}: Add {R} or {W}. - this.addAbility(new WhiteManaAbility()); this.addAbility(new RedManaAbility()); + this.addAbility(new WhiteManaAbility()); // {R/W}{R/W}{R/W}{R/W}, {T}, Sacrifice Boros Locket: Draw two cards. Ability ability = new SimpleActivatedAbility( diff --git a/Mage.Sets/src/mage/cards/b/BountyOfMight.java b/Mage.Sets/src/mage/cards/b/BountyOfMight.java new file mode 100644 index 00000000000..d3f100192f0 --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BountyOfMight.java @@ -0,0 +1,47 @@ +package mage.cards.b; + +import java.util.UUID; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.filter.common.FilterCreaturePermanent; +import mage.target.common.TargetCreaturePermanent; +import mage.target.targetpointer.SecondTargetPointer; +import mage.target.targetpointer.ThirdTargetPointer; + +/** + * + * @author Ryan-Saklad + */ +public final class BountyOfMight extends CardImpl { + + public BountyOfMight(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{4}{G}{G}"); + + // Target creature gets +3/+3 until end of turn. + this.getSpellAbility().addEffect(new BoostTargetEffect(3, 3, Duration.EndOfTurn)); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(new FilterCreaturePermanent("creature (1st)"))); + // Target creature gets +3/+3 until end of turn. + Effect effect = new BoostTargetEffect(3, 3, Duration.EndOfTurn).setText("
Target creature gets +3/+3 until end of turn."); + effect.setTargetPointer(new SecondTargetPointer()); + this.getSpellAbility().addEffect(effect); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(new FilterCreaturePermanent("creature (2nd)"))); + // Target creature gets +3/+3 until end of turn. + effect = new BoostTargetEffect(3, 3, Duration.EndOfTurn).setText("
Target creature gets +3/+3 until end of turn."); + effect.setTargetPointer(new ThirdTargetPointer()); + this.getSpellAbility().addEffect(effect); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(new FilterCreaturePermanent("creature (3rd)"))); + } + + public BountyOfMight(final BountyOfMight card) { + super(card); + } + + @Override + public BountyOfMight copy() { + return new BountyOfMight(this); + } +} diff --git a/Mage.Sets/src/mage/cards/b/BreakneckRider.java b/Mage.Sets/src/mage/cards/b/BreakneckRider.java index 015fdf0395e..f1e8eab11a6 100644 --- a/Mage.Sets/src/mage/cards/b/BreakneckRider.java +++ b/Mage.Sets/src/mage/cards/b/BreakneckRider.java @@ -2,6 +2,7 @@ package mage.cards.b; import java.util.UUID; + import mage.MageInt; import mage.abilities.TriggeredAbility; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; @@ -11,25 +12,23 @@ import mage.abilities.effects.common.TransformSourceEffect; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.n.NeckBreaker; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.TargetController; /** - * * @author fireshoes */ public final class BreakneckRider extends CardImpl { public BreakneckRider(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{R}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}{R}"); this.subtype.add(SubType.HUMAN, SubType.SCOUT, SubType.WEREWOLF); this.power = new MageInt(3); this.toughness = new MageInt(3); - + this.transformable = true; - this.secondSideCardClazz = NeckBreaker.class; + this.secondSideCardClazz = mage.cards.n.NeckBreaker.class; // At the beginning of each upkeep, if no spells were cast last turn, transform Breakneck Rider. this.addAbility(new TransformAbility()); diff --git a/Mage.Sets/src/mage/cards/b/BrudicladTelchorEngineer.java b/Mage.Sets/src/mage/cards/b/BrudicladTelchorEngineer.java index e8071664894..52e0b75f3c6 100644 --- a/Mage.Sets/src/mage/cards/b/BrudicladTelchorEngineer.java +++ b/Mage.Sets/src/mage/cards/b/BrudicladTelchorEngineer.java @@ -1,6 +1,5 @@ package mage.cards.b; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.BeginningOfCombatTriggeredAbility; @@ -11,13 +10,7 @@ import mage.abilities.effects.common.continuous.GainAbilityAllEffect; import mage.abilities.keyword.HasteAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Outcome; -import mage.constants.SubType; -import mage.constants.SuperType; -import mage.constants.TargetController; -import mage.constants.Zone; +import mage.constants.*; import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.common.FilterControlledPermanent; import mage.filter.predicate.permanent.TokenPredicate; @@ -28,8 +21,9 @@ import mage.players.Player; import mage.target.common.TargetControlledPermanent; import mage.util.functions.EmptyApplyToPermanent; +import java.util.UUID; + /** - * * @author spjspj */ public final class BrudicladTelchorEngineer extends CardImpl { @@ -52,7 +46,7 @@ public final class BrudicladTelchorEngineer extends CardImpl { this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAllEffect(HasteAbility.getInstance(), Duration.WhileOnBattlefield, filter, true))); // At the beginning of combat on your turn, create a 2/1 blue Myr artifact creature token. Then you may choose a token you control. If you do, each other token you control becomes a copy of that token. - this.addAbility(new BeginningOfCombatTriggeredAbility(new BrudicladTelchorCombatffect(), TargetController.YOU, false)); + this.addAbility(new BeginningOfCombatTriggeredAbility(new BrudicladTelchorEngineerEffect(), TargetController.YOU, false)); } public BrudicladTelchorEngineer(final BrudicladTelchorEngineer card) { @@ -65,26 +59,26 @@ public final class BrudicladTelchorEngineer extends CardImpl { } } -class BrudicladTelchorCombatffect extends OneShotEffect { +class BrudicladTelchorEngineerEffect extends OneShotEffect { - private static final FilterControlledPermanent filter = new FilterControlledPermanent(" token you control. If you do, each other token you control becomes a copy of that token"); + private static final FilterControlledPermanent filter = new FilterControlledPermanent("token you control"); static { filter.add(new TokenPredicate()); } - public BrudicladTelchorCombatffect() { + public BrudicladTelchorEngineerEffect() { super(Outcome.Sacrifice); this.staticText = " create a 2/1 blue Myr artifact creature token. Then you may choose a token you control. If you do, each other token you control becomes a copy of that token"; } - public BrudicladTelchorCombatffect(final BrudicladTelchorCombatffect effect) { + public BrudicladTelchorEngineerEffect(final BrudicladTelchorEngineerEffect effect) { super(effect); } @Override - public BrudicladTelchorCombatffect copy() { - return new BrudicladTelchorCombatffect(this); + public BrudicladTelchorEngineerEffect copy() { + return new BrudicladTelchorEngineerEffect(this); } @Override @@ -95,7 +89,8 @@ class BrudicladTelchorCombatffect extends OneShotEffect { if (effect.apply(game, source)) { TargetControlledPermanent target = new TargetControlledPermanent(0, 1, filter, true); target.setNotTarget(true); - if (controller.choose(Outcome.Neutral, target, source.getSourceId(), game)) { + if (controller.chooseUse(outcome, "Select a token to copy?", source, game) + && controller.choose(Outcome.Neutral, target, source.getSourceId(), game)) { Permanent toCopyFromPermanent = game.getPermanent(target.getFirstTarget()); if (toCopyFromPermanent != null) { diff --git a/Mage.Sets/src/mage/cards/b/BurningCinderFuryOfCrimsonChaosFire.java b/Mage.Sets/src/mage/cards/b/BurningCinderFuryOfCrimsonChaosFire.java new file mode 100644 index 00000000000..1585222ed7b --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BurningCinderFuryOfCrimsonChaosFire.java @@ -0,0 +1,235 @@ +package mage.cards.b; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.BeginningOfEndStepTriggeredAbility; +import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; +import mage.abilities.condition.Condition; +import mage.abilities.effects.ContinuousEffect; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.filter.FilterPlayer; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.other.PlayerIdPredicate; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.Target; +import mage.target.TargetPlayer; +import mage.target.targetpointer.FixedTarget; +import mage.watchers.Watcher; + +/** + * + * @author L_J + */ +public final class BurningCinderFuryOfCrimsonChaosFire extends CardImpl { + + public BurningCinderFuryOfCrimsonChaosFire(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{R}"); + + // Whenever any player taps a permanent, that player choose one of their opponents. The chosen player gains control of that permanent at the beginning of the next end step. + this.addAbility(new BurningCinderFuryOfCrimsonChaosFireAbility()); + + // At the beginning of each player’s end step, if that player didn’t tap any nonland permanents that turn, Burning Cinder Fury of Crimson Chaos Fire deals 3 damage to that player. + this.addAbility(new BeginningOfEndStepTriggeredAbility(Zone.BATTLEFIELD, new DamageTargetEffect(3).setText("{this} deals 3 damage to that player"), + TargetController.ANY, new BurningCinderFuryOfCrimsonChaosFireCondition(), false), new BurningCinderFuryOfCrimsonChaosFireWatcher()); + } + + public BurningCinderFuryOfCrimsonChaosFire(final BurningCinderFuryOfCrimsonChaosFire card) { + super(card); + } + + @Override + public BurningCinderFuryOfCrimsonChaosFire copy() { + return new BurningCinderFuryOfCrimsonChaosFire(this); + } +} + +class BurningCinderFuryOfCrimsonChaosFireAbility extends TriggeredAbilityImpl { + + public BurningCinderFuryOfCrimsonChaosFireAbility() { + super(Zone.BATTLEFIELD, new BurningCinderFuryOfCrimsonChaosFireEffect(), false); + } + + public BurningCinderFuryOfCrimsonChaosFireAbility(BurningCinderFuryOfCrimsonChaosFireAbility ability) { + super(ability); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.TAPPED; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + Permanent permanent = game.getPermanent(event.getTargetId()); + if (permanent != null) { + BurningCinderFuryOfCrimsonChaosFireEffect effect = (BurningCinderFuryOfCrimsonChaosFireEffect) this.getEffects().get(0); + effect.setTargetPointer(new FixedTarget(permanent, game)); + effect.setFirstControllerId(permanent.getControllerId()); // it's necessary to remember the original controller, as the controller might change by the time the trigger resolves + return true; + } + return false; + } + + @Override + public BurningCinderFuryOfCrimsonChaosFireAbility copy() { + return new BurningCinderFuryOfCrimsonChaosFireAbility(this); + } + + @Override + public String getRule() { + return "Whenever any player taps a permanent, " + super.getRule(); + } +} + +class BurningCinderFuryOfCrimsonChaosFireEffect extends OneShotEffect { + + private UUID firstControllerId = null; + + public BurningCinderFuryOfCrimsonChaosFireEffect() { + super(Outcome.Detriment); + this.staticText = "that player choose one of their opponents. The chosen player gains control of that permanent at the beginning of the next end step"; + } + + public BurningCinderFuryOfCrimsonChaosFireEffect(final BurningCinderFuryOfCrimsonChaosFireEffect effect) { + super(effect); + this.firstControllerId = effect.firstControllerId; + } + + @Override + public BurningCinderFuryOfCrimsonChaosFireEffect copy() { + return new BurningCinderFuryOfCrimsonChaosFireEffect(this); + } + + public void setFirstControllerId(UUID newId) { + this.firstControllerId = newId; + } + + @Override + public boolean apply(Game game, Ability source) { + Player tappingPlayer = game.getPlayer(firstControllerId); + Permanent permanentToControl = game.getPermanent(this.getTargetPointer().getFirst(game, source)); + if (tappingPlayer != null && permanentToControl != null) { + // Create opponent filter list manually because otherwise opponent check prevents controller of this to be valid + FilterPlayer filter = new FilterPlayer("opponent to control " + permanentToControl.getIdName()); + List opponentPredicates = new ArrayList<>(); + for (UUID opponentId : game.getOpponents(firstControllerId)) { + opponentPredicates.add(new PlayerIdPredicate(opponentId)); + } + filter.add(Predicates.or(opponentPredicates)); + Target target = new TargetPlayer(1, 1, true, filter); + target.setTargetController(firstControllerId); + target.setAbilityController(source.getControllerId()); + if (tappingPlayer.chooseTarget(outcome, target, source, game)) { + Player chosenOpponent = game.getPlayer(target.getFirstTarget()); + if (chosenOpponent != null) { + game.informPlayers(tappingPlayer.getLogName() + " chose " + chosenOpponent.getLogName() + " to gain control of " + permanentToControl.getLogName() + " at the beginning of the next end step"); + ContinuousEffect effect = new BurningCinderFuryOfCrimsonChaosFireCreatureGainControlEffect(Duration.Custom, chosenOpponent.getId()); + effect.setTargetPointer(new FixedTarget(permanentToControl.getId())); + game.addDelayedTriggeredAbility(new AtTheBeginOfNextEndStepDelayedTriggeredAbility(effect), source); + return true; + } + } + } + return false; + } +} + +class BurningCinderFuryOfCrimsonChaosFireCreatureGainControlEffect extends ContinuousEffectImpl { + + private UUID controller; + + public BurningCinderFuryOfCrimsonChaosFireCreatureGainControlEffect(Duration duration, UUID controller) { + super(duration, Layer.ControlChangingEffects_2, SubLayer.NA, Outcome.GainControl); + this.controller = controller; + this.staticText = "the chosen player gains control of that permanent"; + } + + public BurningCinderFuryOfCrimsonChaosFireCreatureGainControlEffect(final BurningCinderFuryOfCrimsonChaosFireCreatureGainControlEffect effect) { + super(effect); + this.controller = effect.controller; + } + + @Override + public BurningCinderFuryOfCrimsonChaosFireCreatureGainControlEffect copy() { + return new BurningCinderFuryOfCrimsonChaosFireCreatureGainControlEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = game.getPermanent(source.getFirstTarget()); + if (targetPointer != null) { + permanent = game.getPermanent(targetPointer.getFirst(game, source)); + } + if (permanent != null && controller != null) { + return permanent.changeControllerId(controller, game); + } + return false; + } +} + +class BurningCinderFuryOfCrimsonChaosFireCondition implements Condition { + + @Override + public boolean apply(Game game, Ability source) { + BurningCinderFuryOfCrimsonChaosFireWatcher watcher = (BurningCinderFuryOfCrimsonChaosFireWatcher) game.getState().getWatchers().get(BurningCinderFuryOfCrimsonChaosFireWatcher.class.getSimpleName()); + if (watcher != null) { + return !watcher.tappedNonlandThisTurn(game.getActivePlayerId()); + } + return false; + } + + public String toString() { + return "if that player didn’t tap any nonland permanents that turn"; + } +} + +class BurningCinderFuryOfCrimsonChaosFireWatcher extends Watcher { + + private final Set tappedActivePlayerIds = new HashSet<>(); + + public BurningCinderFuryOfCrimsonChaosFireWatcher() { + super(BurningCinderFuryOfCrimsonChaosFireWatcher.class.getSimpleName(), WatcherScope.GAME); + } + + public BurningCinderFuryOfCrimsonChaosFireWatcher(final BurningCinderFuryOfCrimsonChaosFireWatcher watcher) { + super(watcher); + this.tappedActivePlayerIds.addAll(watcher.tappedActivePlayerIds); + } + + @Override + public void watch(GameEvent event, Game game) { + if (event.getType() == GameEvent.EventType.TAPPED) { + Permanent permanent = game.getPermanent(event.getTargetId()); + if (permanent != null && !permanent.isLand()) { + tappedActivePlayerIds.add(permanent.getControllerId()); + } + } + } + + public boolean tappedNonlandThisTurn(UUID playerId) { + return tappedActivePlayerIds.contains(playerId); + } + + @Override + public void reset() { + tappedActivePlayerIds.clear(); + } + + @Override + public BurningCinderFuryOfCrimsonChaosFireWatcher copy() { + return new BurningCinderFuryOfCrimsonChaosFireWatcher(this); + } +} diff --git a/Mage.Sets/src/mage/cards/c/Camaraderie.java b/Mage.Sets/src/mage/cards/c/Camaraderie.java index 505d1de53f6..9baba360dbe 100644 --- a/Mage.Sets/src/mage/cards/c/Camaraderie.java +++ b/Mage.Sets/src/mage/cards/c/Camaraderie.java @@ -56,7 +56,7 @@ class CamaraderieEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getSourceId()); + Player player = game.getPlayer(source.getControllerId()); if (player == null) { return false; } diff --git a/Mage.Sets/src/mage/cards/c/CandelabraOfTawnos.java b/Mage.Sets/src/mage/cards/c/CandelabraOfTawnos.java index 706014033a8..38462201bed 100644 --- a/Mage.Sets/src/mage/cards/c/CandelabraOfTawnos.java +++ b/Mage.Sets/src/mage/cards/c/CandelabraOfTawnos.java @@ -1,4 +1,3 @@ - package mage.cards.c; import java.util.UUID; @@ -11,10 +10,10 @@ import mage.abilities.effects.common.UntapTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.TargetAdjustment; import mage.constants.Zone; import mage.filter.StaticFilters; import mage.target.TargetPermanent; +import mage.target.targetadjustment.XTargetsAdjuster; /** * @@ -31,7 +30,7 @@ public final class CandelabraOfTawnos extends CardImpl { Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("{X}")); ability.addCost(new TapSourceCost()); ability.addTarget(new TargetPermanent(StaticFilters.FILTER_LANDS)); - ability.setTargetAdjustment(TargetAdjustment.X_TARGETS); + ability.setTargetAdjuster(XTargetsAdjuster.instance); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/c/CandlelightVigil.java b/Mage.Sets/src/mage/cards/c/CandlelightVigil.java new file mode 100644 index 00000000000..db7151ceeef --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CandlelightVigil.java @@ -0,0 +1,59 @@ +package mage.cards.c; + +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.VigilanceAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author Ryan-Saklad + */ +public final class CandlelightVigil extends CardImpl { + + public CandlelightVigil(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{W}"); + this.subtype.add(SubType.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/+2 and has vigilance. + Effect effect = new BoostEnchantedEffect(3, 2, Duration.WhileOnBattlefield); + effect.setText("Enchanted creature gets +3/+2"); + SimpleStaticAbility ability2 = new SimpleStaticAbility(Zone.BATTLEFIELD, effect); + effect = new GainAbilityAttachedEffect(VigilanceAbility.getInstance(), AttachmentType.AURA); + effect.setText("and has vigilance"); + ability2.addEffect(effect); + this.addAbility(ability2); + + } + + public CandlelightVigil(final CandlelightVigil card) { + super(card); + } + + @Override + public CandlelightVigil copy() { + return new CandlelightVigil(this); + } +} diff --git a/Mage.Sets/src/mage/cards/c/CankerousThirst.java b/Mage.Sets/src/mage/cards/c/CankerousThirst.java index ff27ec3a8df..724a37456d5 100644 --- a/Mage.Sets/src/mage/cards/c/CankerousThirst.java +++ b/Mage.Sets/src/mage/cards/c/CankerousThirst.java @@ -1,11 +1,10 @@ - package mage.cards.c; import java.util.UUID; -import mage.abilities.condition.LockedInCondition; +import mage.abilities.Ability; import mage.abilities.condition.common.ManaWasSpentCondition; -import mage.abilities.decorator.ConditionalContinuousEffect; import mage.abilities.effects.ContinuousEffect; +import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.InfoEffect; import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.cards.CardImpl; @@ -13,8 +12,13 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.ColoredManaSymbol; import mage.constants.Duration; +import mage.constants.Outcome; +import mage.filter.common.FilterCreaturePermanent; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetpointer.SecondTargetPointer; +import mage.target.targetpointer.FixedTarget; import mage.watchers.common.ManaSpentToCastWatcher; /** @@ -28,19 +32,9 @@ public final class CankerousThirst extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{3}{B/G}"); // If {B} was spent to cast Cankerous Thirst, you may have target creature get -3/-3 until end of turn. If {G} was spent to cast Cankerous Thirst, you may have target creature get +3/+3 until end of turn. - this.getSpellAbility().addEffect(new ConditionalContinuousEffect( - new BoostTargetEffect(-3, -3, Duration.EndOfTurn), - new LockedInCondition(new ManaWasSpentCondition(ColoredManaSymbol.B)), - "If {B} was spent to cast {this}, you may have target creature get -3/-3 until end of turn")); - - ContinuousEffect effect = new BoostTargetEffect(3, 3, Duration.EndOfTurn); - effect.setTargetPointer(new SecondTargetPointer()); - this.getSpellAbility().addEffect(new ConditionalContinuousEffect( - effect, - new LockedInCondition(new ManaWasSpentCondition(ColoredManaSymbol.G)), - "If {G} was spent to cast {this}, you may have target creature get +3/+3 until end of turn")); - this.getSpellAbility().addTarget(new TargetCreaturePermanent()); - this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + this.getSpellAbility().addEffect(new CankerousThirstEffect()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(new FilterCreaturePermanent("creature (1th effect -3/-3)"))); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(new FilterCreaturePermanent("creature (2nd effect +3/+3)"))); this.getSpellAbility().addEffect(new InfoEffect("(Do both if {B}{G} was spent.)")); this.getSpellAbility().addWatcher(new ManaSpentToCastWatcher()); } @@ -55,3 +49,45 @@ public final class CankerousThirst extends CardImpl { } } + +class CankerousThirstEffect extends OneShotEffect { + + public CankerousThirstEffect() { + super(Outcome.Benefit); + this.staticText = "If {B} was spent to cast {this}, you may have target creature get -3/-3 until end of turn. If {G} was spent to cast {this}, you may have target creature get +3/+3 until end of turn"; + } + + public CankerousThirstEffect(final CankerousThirstEffect effect) { + super(effect); + } + + @Override + public CankerousThirstEffect copy() { + return new CankerousThirstEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + if (new ManaWasSpentCondition(ColoredManaSymbol.B).apply(game, source)) { + Permanent targetCreature1 = game.getPermanent(getTargetPointer().getFirst(game, source)); + if (targetCreature1 != null && controller.chooseUse(Outcome.UnboostCreature, "Let " + targetCreature1.getIdName() + " get -3/-3 until end of turn?", source, game)) { + ContinuousEffect effect = new BoostTargetEffect(-3, -3, Duration.EndOfTurn); + effect.setTargetPointer(new FixedTarget(targetCreature1, game)); + game.addEffect(effect, source); + } + } + if (new ManaWasSpentCondition(ColoredManaSymbol.G).apply(game, source)) { + Permanent targetCreature2 = game.getPermanent(source.getTargets().get(1).getFirstTarget()); + if (targetCreature2 != null && controller.chooseUse(Outcome.UnboostCreature, "Let " + targetCreature2.getIdName() + " get +3/+3 until end of turn?", source, game)) { + ContinuousEffect effect = new BoostTargetEffect(+3, +3, Duration.EndOfTurn); + effect.setTargetPointer(new FixedTarget(targetCreature2, game)); + game.addEffect(effect, source); + } + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/c/CaptureSphere.java b/Mage.Sets/src/mage/cards/c/CaptureSphere.java new file mode 100644 index 00000000000..57225284db4 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CaptureSphere.java @@ -0,0 +1,57 @@ +package mage.cards.c; + +import java.util.UUID; +import mage.constants.SubType; +import mage.abilities.keyword.FlashAbility; +import mage.target.common.TargetCreaturePermanent; +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.DontUntapInControllersUntapStepEnchantedEffect; +import mage.abilities.effects.common.TapEnchantedEffect; +import mage.constants.Outcome; +import mage.target.TargetPermanent; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Zone; + +/** + * + * @author TheElk801 + */ +public final class CaptureSphere extends CardImpl { + + public CaptureSphere(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{U}"); + + this.subtype.add(SubType.AURA); + + // Flash + this.addAbility(FlashAbility.getInstance()); + + // 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 Capture Sphere 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 CaptureSphere(final CaptureSphere card) { + super(card); + } + + @Override + public CaptureSphere copy() { + return new CaptureSphere(this); + } +} diff --git a/Mage.Sets/src/mage/cards/c/CatharsCrusade.java b/Mage.Sets/src/mage/cards/c/CatharsCrusade.java index bfb4f678fbd..59a6ce427ef 100644 --- a/Mage.Sets/src/mage/cards/c/CatharsCrusade.java +++ b/Mage.Sets/src/mage/cards/c/CatharsCrusade.java @@ -1,27 +1,34 @@ package mage.cards.c; -import java.util.UUID; -import mage.abilities.common.CreatureEntersBattlefieldTriggeredAbility; +import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; import mage.abilities.effects.common.counter.AddCountersAllEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.Zone; import mage.counters.CounterType; +import mage.filter.StaticFilters; import mage.filter.common.FilterControlledCreaturePermanent; +import java.util.UUID; + /** - * * @author Loki */ public final class CatharsCrusade extends CardImpl { public CatharsCrusade(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{3}{W}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{W}{W}"); // Whenever a creature enters the battlefield under your control, put a +1/+1 counter on each creature you control. - this.addAbility(new CreatureEntersBattlefieldTriggeredAbility(new AddCountersAllEffect(CounterType.P1P1.createInstance(), new FilterControlledCreaturePermanent()))); + this.addAbility(new EntersBattlefieldControlledTriggeredAbility( + Zone.BATTLEFIELD, + new AddCountersAllEffect(CounterType.P1P1.createInstance(), new FilterControlledCreaturePermanent()), + StaticFilters.FILTER_PERMANENT_CREATURE_A, + false) + ); } public CatharsCrusade(final CatharsCrusade card) { diff --git a/Mage.Sets/src/mage/cards/c/CavernOfSouls.java b/Mage.Sets/src/mage/cards/c/CavernOfSouls.java index 41c2bea64a0..e1a5f5a2a11 100644 --- a/Mage.Sets/src/mage/cards/c/CavernOfSouls.java +++ b/Mage.Sets/src/mage/cards/c/CavernOfSouls.java @@ -64,7 +64,7 @@ class CavernOfSoulsManaBuilder extends ConditionalManaBuilder { @Override public ConditionalManaBuilder setMana(Mana mana, Ability source, Game game) { - SubType subType = ChooseCreatureTypeEffect.getChoosenCreatureType(source.getSourceId(), game); + SubType subType = ChooseCreatureTypeEffect.getChosenCreatureType(source.getSourceId(), game); if (subType != null) { creatureType = subType; } diff --git a/Mage.Sets/src/mage/cards/c/ChamberSentry.java b/Mage.Sets/src/mage/cards/c/ChamberSentry.java index 1cf6c1fd911..60c11825020 100644 --- a/Mage.Sets/src/mage/cards/c/ChamberSentry.java +++ b/Mage.Sets/src/mage/cards/c/ChamberSentry.java @@ -1,5 +1,6 @@ package mage.cards.c; +import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldAbility; @@ -25,27 +26,27 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.common.TargetAnyTarget; -import java.util.UUID; - /** * * @author jmharmon */ - public final class ChamberSentry extends CardImpl { public ChamberSentry(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT,CardType.CREATURE}, "{X}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{X}"); this.subtype.add(SubType.CONSTRUCT); this.power = new MageInt(0); this.toughness = new MageInt(0); // Chamber Sentry enters the battlefield with a +1/+1 counter on it for each color of mana spent to cast it. - this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance(), ColorsOfManaSpentToCastCount.getInstance(), true))); + this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance(), ColorsOfManaSpentToCastCount.getInstance(), true), + "with a +1/+1 counter on it for each color of mana spent to cast it")); // {X}, {T}, Remove X +1/+1 counters from Chamber Sentry: It deals X damage to any target. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(new ManacostVariableValue()), new ManaCostsImpl("{X}")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(new ManacostVariableValue()) + .setText("It deals X damage to any target"), + new ManaCostsImpl("{X}")); ability.addCost(new TapSourceCost()); ability.addCost(new ChamberSentryRemoveVariableCountersSourceCost(CounterType.P1P1.createInstance())); ability.addTarget(new TargetAnyTarget()); @@ -55,7 +56,7 @@ public final class ChamberSentry extends CardImpl { this.addAbility(new SimpleActivatedAbility(Zone.GRAVEYARD, new ReturnSourceFromGraveyardToHandEffect(), new ManaCostsImpl("{W}{U}{B}{R}{G}"))); } - public ChamberSentry(final ChamberSentry card) { + public ChamberSentry(final ChamberSentry card) { super(card); } @@ -75,7 +76,7 @@ class ChamberSentryRemoveVariableCountersSourceCost extends VariableCostImpl { } public ChamberSentryRemoveVariableCountersSourceCost(Counter counter, String text) { - this(counter, 0,text); + this(counter, 0, text); } public ChamberSentryRemoveVariableCountersSourceCost(Counter counter, int minimalCountersToPay) { diff --git a/Mage.Sets/src/mage/cards/c/ChanceForGlory.java b/Mage.Sets/src/mage/cards/c/ChanceForGlory.java index c630431bd6f..ab8c37fb8aa 100644 --- a/Mage.Sets/src/mage/cards/c/ChanceForGlory.java +++ b/Mage.Sets/src/mage/cards/c/ChanceForGlory.java @@ -21,7 +21,7 @@ public final class ChanceForGlory extends CardImpl { // Creatures you control gain indestructible. Take an extra turn after this one. At the beginning of that turn's end step, you lose the game. this.getSpellAbility().addEffect(new GainAbilityControlledEffect( IndestructibleAbility.getInstance(), Duration.EndOfGame - ).setText("Creatures you control gain indestructible.")); + ).setText("Creatures you control gain indestructible")); this.getSpellAbility().addEffect(new AddExtraTurnControllerEffect(true)); } diff --git a/Mage.Sets/src/mage/cards/c/ChandraAblaze.java b/Mage.Sets/src/mage/cards/c/ChandraAblaze.java index 6ba9aa38422..e2cefa5d39e 100644 --- a/Mage.Sets/src/mage/cards/c/ChandraAblaze.java +++ b/Mage.Sets/src/mage/cards/c/ChandraAblaze.java @@ -7,7 +7,7 @@ import mage.MageObjectReference; import mage.ObjectColor; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DrawCardAllEffect; @@ -41,7 +41,7 @@ public final class ChandraAblaze extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.CHANDRA); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(5)); // +1: Discard a card. If a red card is discarded this way, Chandra Ablaze deals 4 damage to any target. LoyaltyAbility ability = new LoyaltyAbility(new ChandraAblazeEffect1(), 1); diff --git a/Mage.Sets/src/mage/cards/c/ChandraBoldPyromancer.java b/Mage.Sets/src/mage/cards/c/ChandraBoldPyromancer.java index 16feda737c2..c15234a2de8 100644 --- a/Mage.Sets/src/mage/cards/c/ChandraBoldPyromancer.java +++ b/Mage.Sets/src/mage/cards/c/ChandraBoldPyromancer.java @@ -5,7 +5,7 @@ import java.util.UUID; import mage.Mana; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.Effects; import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.effects.common.DamageAllControlledTargetEffect; @@ -30,7 +30,7 @@ public final class ChandraBoldPyromancer extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.CHANDRA); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(5)); // +1: Add {R}{R}. Chandra, Bold Pyromancer deals 2 damage to target player. Ability ability = new LoyaltyAbility(new BasicManaEffect(Mana.RedMana(2)), +1); diff --git a/Mage.Sets/src/mage/cards/c/ChandraFlamecaller.java b/Mage.Sets/src/mage/cards/c/ChandraFlamecaller.java index 9ad4fd7eec4..7de1fc14326 100644 --- a/Mage.Sets/src/mage/cards/c/ChandraFlamecaller.java +++ b/Mage.Sets/src/mage/cards/c/ChandraFlamecaller.java @@ -5,7 +5,7 @@ import java.util.Set; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.costs.Cost; import mage.abilities.costs.common.PayVariableLoyaltyCost; import mage.abilities.dynamicvalue.DynamicValue; @@ -36,7 +36,7 @@ public final class ChandraFlamecaller extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.CHANDRA); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(4)); // +1: Create two 3/1 red Elemental creature tokens with haste. Exile them at the beginning of the next end step. this.addAbility(new LoyaltyAbility(new ChandraElementalEffect(), 1)); diff --git a/Mage.Sets/src/mage/cards/c/ChandraNalaar.java b/Mage.Sets/src/mage/cards/c/ChandraNalaar.java index 34c5ef88410..fe44aa90a49 100644 --- a/Mage.Sets/src/mage/cards/c/ChandraNalaar.java +++ b/Mage.Sets/src/mage/cards/c/ChandraNalaar.java @@ -4,7 +4,7 @@ package mage.cards.c; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.costs.Cost; import mage.abilities.costs.common.PayVariableLoyaltyCost; import mage.abilities.dynamicvalue.DynamicValue; @@ -33,7 +33,7 @@ public final class ChandraNalaar extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.CHANDRA); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(6)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(6)); // +1: Chandra Nalaar deals 1 damage to target player or planeswalker. LoyaltyAbility ability1 = new LoyaltyAbility(new DamageTargetEffect(1), 1); diff --git a/Mage.Sets/src/mage/cards/c/ChandraPyrogenius.java b/Mage.Sets/src/mage/cards/c/ChandraPyrogenius.java index 900ad4bc2b2..f764e35a3fa 100644 --- a/Mage.Sets/src/mage/cards/c/ChandraPyrogenius.java +++ b/Mage.Sets/src/mage/cards/c/ChandraPyrogenius.java @@ -3,7 +3,7 @@ package mage.cards.c; import java.util.UUID; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.Effects; import mage.abilities.effects.common.DamageAllControlledTargetEffect; @@ -31,7 +31,7 @@ public final class ChandraPyrogenius extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.CHANDRA); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(5)); // +2: Chandra, Pyrogenius deals 2 damage to each opponent. this.addAbility(new LoyaltyAbility(new DamagePlayersEffect(Outcome.Damage, new StaticValue(2), TargetController.OPPONENT), 2)); diff --git a/Mage.Sets/src/mage/cards/c/ChandraPyromaster.java b/Mage.Sets/src/mage/cards/c/ChandraPyromaster.java index 4e5b7fe082d..027213fdb3c 100644 --- a/Mage.Sets/src/mage/cards/c/ChandraPyromaster.java +++ b/Mage.Sets/src/mage/cards/c/ChandraPyromaster.java @@ -1,4 +1,3 @@ - package mage.cards.c; import java.util.HashSet; @@ -8,10 +7,10 @@ import mage.MageObject; import mage.MageObjectReference; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; -import mage.abilities.effects.AsThoughEffectImpl; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.asthought.PlayFromNotOwnHandZoneTargetEffect; import mage.abilities.effects.common.combat.CantBlockTargetEffect; import mage.cards.*; import mage.constants.*; @@ -20,7 +19,6 @@ import mage.filter.common.FilterInstantOrSorceryCard; import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.stack.StackObject; -import mage.players.Library; import mage.players.Player; import mage.target.Target; import mage.target.TargetCard; @@ -38,7 +36,7 @@ public final class ChandraPyromaster extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.CHANDRA); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(4)); // +1: Chandra, Pyromaster deals 1 damage to target player and 1 damage to up to one target creature that player controls. That creature can't block this turn. LoyaltyAbility ability1 = new LoyaltyAbility(new ChandraPyromasterEffect1(), 1); @@ -177,12 +175,13 @@ class ChandraPyromasterEffect2 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 && controller.getLibrary().hasCards()) { - Library library = controller.getLibrary(); - Card card = library.getFromTop(game); + if (controller != null && sourceObject != null) { + Card card = controller.getLibrary().getFromTop(game); if (card != null) { - controller.moveCardToExileWithInfo(card, source.getSourceId(), sourceObject.getIdName() + " ", source.getSourceId(), game, Zone.LIBRARY, true); - game.addEffect(new ChandraPyromasterPlayEffect(new MageObjectReference(card, game)), source); + controller.moveCards(card, Zone.EXILED, source, game); + ContinuousEffect effect = new PlayFromNotOwnHandZoneTargetEffect(Zone.EXILED, Duration.EndOfTurn); + effect.setTargetPointer(new FixedTarget(card, game)); + game.addEffect(effect, source); } return true; } @@ -190,45 +189,6 @@ class ChandraPyromasterEffect2 extends OneShotEffect { } } -class ChandraPyromasterPlayEffect extends AsThoughEffectImpl { - - private final MageObjectReference objectReference; - - public ChandraPyromasterPlayEffect(MageObjectReference objectReference) { - super(AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, Duration.EndOfTurn, Outcome.Benefit); - this.objectReference = objectReference; - staticText = "you may play that card until end of turn"; - } - - public ChandraPyromasterPlayEffect(final ChandraPyromasterPlayEffect effect) { - super(effect); - this.objectReference = effect.objectReference; - } - - @Override - public boolean apply(Game game, Ability source) { - return true; - } - - @Override - public ChandraPyromasterPlayEffect copy() { - return new ChandraPyromasterPlayEffect(this); - } - - @Override - public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) { - if (objectReference.refersTo(objectId, game) && affectedControllerId.equals(source.getControllerId())) { - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - return true; - } else { - discard(); - } - } - return false; - } -} - class ChandraPyromasterEffect3 extends OneShotEffect { public ChandraPyromasterEffect3() { diff --git a/Mage.Sets/src/mage/cards/c/ChandraRoaringFlame.java b/Mage.Sets/src/mage/cards/c/ChandraRoaringFlame.java index d234a953b05..3f08437c979 100644 --- a/Mage.Sets/src/mage/cards/c/ChandraRoaringFlame.java +++ b/Mage.Sets/src/mage/cards/c/ChandraRoaringFlame.java @@ -6,7 +6,7 @@ import java.util.List; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DamageTargetEffect; import mage.cards.CardImpl; @@ -36,7 +36,7 @@ public final class ChandraRoaringFlame extends CardImpl { this.nightCard = true; this.transformable = true; - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(4)); // +1: Chandra, Roaring Flame deals 2 damage to target player. LoyaltyAbility loyaltyAbility = new LoyaltyAbility(new DamageTargetEffect(2), 1); diff --git a/Mage.Sets/src/mage/cards/c/ChandraTheFirebrand.java b/Mage.Sets/src/mage/cards/c/ChandraTheFirebrand.java index 69cbe99358c..905b6b4db13 100644 --- a/Mage.Sets/src/mage/cards/c/ChandraTheFirebrand.java +++ b/Mage.Sets/src/mage/cards/c/ChandraTheFirebrand.java @@ -4,7 +4,7 @@ package mage.cards.c; import java.util.UUID; import mage.abilities.DelayedTriggeredAbility; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.common.CopyTargetSpellEffect; import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; @@ -33,7 +33,7 @@ public final class ChandraTheFirebrand extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.CHANDRA); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3)); // +1: Chandra, the Firebrand deals 1 damage to any target. LoyaltyAbility ability1 = new LoyaltyAbility(new DamageTargetEffect(1), 1); diff --git a/Mage.Sets/src/mage/cards/c/ChandraTorchOfDefiance.java b/Mage.Sets/src/mage/cards/c/ChandraTorchOfDefiance.java index 81a6e6c8613..95fd6740e5c 100644 --- a/Mage.Sets/src/mage/cards/c/ChandraTorchOfDefiance.java +++ b/Mage.Sets/src/mage/cards/c/ChandraTorchOfDefiance.java @@ -6,7 +6,7 @@ import mage.MageObjectReference; import mage.Mana; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DamagePlayersEffect; @@ -37,7 +37,7 @@ public final class ChandraTorchOfDefiance extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.CHANDRA); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(4)); // +1: Exile the top card of your library. You may cast that card. If you don't, Chandra, Torch of Defiance deals 2 damage to each opponent. LoyaltyAbility ability = new LoyaltyAbility(new ChandraTorchOfDefianceEffect(), 1); diff --git a/Mage.Sets/src/mage/cards/c/ChecksAndBalances.java b/Mage.Sets/src/mage/cards/c/ChecksAndBalances.java new file mode 100644 index 00000000000..183ef311411 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/ChecksAndBalances.java @@ -0,0 +1,119 @@ + +package mage.cards.c; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.CastOnlyIfConditionIsTrueAbility; +import mage.abilities.common.SpellCastAllTriggeredAbility; +import mage.abilities.condition.Condition; +import mage.abilities.effects.OneShotEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SetTargetPointer; +import mage.filter.FilterSpell; +import mage.game.Game; +import mage.game.stack.Spell; +import mage.players.Player; +import mage.target.common.TargetCardInHand; + +/** + * + * @author L_J + */ +public final class ChecksAndBalances extends CardImpl { + + public ChecksAndBalances(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{2}{U}"); + + // Cast this spell only if there are three or more players in the game. + this.addAbility(new CastOnlyIfConditionIsTrueAbility(ChecksAndBalancesCondition.instance, "Cast this spell only if there are three or more players in the game")); + + // Whenever a player casts a spell, each of that player’s opponents may discard a card. If they do, counter that spell. + this.addAbility(new SpellCastAllTriggeredAbility(new ChecksAndBalancesEffect(), new FilterSpell("a spell"), false, SetTargetPointer.SPELL)); + } + + public ChecksAndBalances(final ChecksAndBalances card) { + super(card); + } + + @Override + public ChecksAndBalances copy() { + return new ChecksAndBalances(this); + } +} + +enum ChecksAndBalancesCondition implements Condition { + instance; + + @Override + public boolean apply(Game game, Ability source) { + return game.getPlayerList().size() >= 3; + } + + @Override + public String toString() { + return "there are three or more players in the game"; + } +} + +class ChecksAndBalancesEffect extends OneShotEffect { + + public ChecksAndBalancesEffect() { + super(Outcome.Detriment); + staticText = "each of that player’s opponents may discard a card. If they do, counter that spell"; + } + + public ChecksAndBalancesEffect(final ChecksAndBalancesEffect effect) { + super(effect); + } + + @Override + public ChecksAndBalancesEffect copy() { + return new ChecksAndBalancesEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Spell spell = game.getStack().getSpell(this.getTargetPointer().getFirst(game, source)); + if (spell != null) { + for (UUID uuid : game.getOpponents(spell.getControllerId())) { + Player player = game.getPlayer(uuid); + if (player != null) { + if (player.getHand().isEmpty()) { + game.informPlayers(player.getLogName() + " doesn't have a card in hand to discard to counter " + spell.getLogName() + ", effect aborted."); + return true; + } + } + } + for (UUID uuid : game.getOpponents(spell.getControllerId())) { + Player player = game.getPlayer(uuid); + if (player != null) { + if (!player.chooseUse(outcome, "Do you wish to discard a card to counter " + spell.getLogName() + '?', source, game)) { + game.informPlayers(player.getLogName() + " refuses to discard a card to counter " + spell.getLogName()); + return true; + } else { + game.informPlayers(player.getLogName() + " agrees to discard a card to counter " + spell.getLogName()); + } + } + } + for (UUID uuid : game.getOpponents(spell.getControllerId())) { + Player player = game.getPlayer(uuid); + if (player != null && !player.getHand().isEmpty()) { + TargetCardInHand target = new TargetCardInHand(); + if (player.choose(Outcome.Discard, target, source.getSourceId(), game)) { + Card card = game.getCard(target.getFirstTarget()); + if (card != null) { + player.discard(card, source, game); + } + } + } + } + game.getStack().counter(spell.getId(), source.getSourceId(), game); + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/c/ChosenOfMarkov.java b/Mage.Sets/src/mage/cards/c/ChosenOfMarkov.java index 8a12eb107b2..5a31f0d5b8e 100644 --- a/Mage.Sets/src/mage/cards/c/ChosenOfMarkov.java +++ b/Mage.Sets/src/mage/cards/c/ChosenOfMarkov.java @@ -2,6 +2,7 @@ package mage.cards.c; import java.util.UUID; + import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -11,7 +12,6 @@ import mage.abilities.effects.common.TransformSourceEffect; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.m.MarkovsServant; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Zone; @@ -22,7 +22,6 @@ import mage.filter.predicate.permanent.TappedPredicate; import mage.target.common.TargetControlledPermanent; /** - * * @author Loki */ public final class ChosenOfMarkov extends CardImpl { @@ -34,14 +33,14 @@ public final class ChosenOfMarkov extends CardImpl { } public ChosenOfMarkov(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}"); this.subtype.add(SubType.HUMAN); this.power = new MageInt(2); this.toughness = new MageInt(2); this.transformable = true; - this.secondSideCardClazz = MarkovsServant.class; + this.secondSideCardClazz = mage.cards.m.MarkovsServant.class; // {tap}, Tap an untapped Vampire you control: Transform Chosen of Markov. this.addAbility(new TransformAbility()); diff --git a/Mage.Sets/src/mage/cards/c/CircuDimirLobotomist.java b/Mage.Sets/src/mage/cards/c/CircuDimirLobotomist.java index c2332bbfddd..84ec986fd29 100644 --- a/Mage.Sets/src/mage/cards/c/CircuDimirLobotomist.java +++ b/Mage.Sets/src/mage/cards/c/CircuDimirLobotomist.java @@ -1,7 +1,6 @@ package mage.cards.c; -import java.util.UUID; import mage.MageInt; import mage.MageObject; import mage.ObjectColor; @@ -13,13 +12,7 @@ import mage.abilities.effects.OneShotEffect; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.SubType; -import mage.constants.Duration; -import mage.constants.Outcome; -import mage.constants.SuperType; -import mage.constants.Zone; -import mage.filter.FilterPlayer; +import mage.constants.*; import mage.filter.FilterSpell; import mage.filter.predicate.mageobject.ColorPredicate; import mage.game.ExileZone; @@ -31,8 +24,9 @@ import mage.players.Player; import mage.target.TargetPlayer; import mage.util.CardUtil; +import java.util.UUID; + /** - * * @author LevelX2 */ public final class CircuDimirLobotomist extends CardImpl { @@ -54,16 +48,16 @@ public final class CircuDimirLobotomist extends CardImpl { this.power = new MageInt(2); this.toughness = new MageInt(3); - // 10/1/2005 The first two abilities target libraries, not players. - // Target Library not supported yet - used as workaround target player // Whenever you cast a blue spell, exile the top card of target library. Ability ability = new SpellCastControllerTriggeredAbility(new CircuDimirLobotomistEffect(), filterBlue, false); - ability.addTarget(new TargetPlayer(1, 1, true, new FilterPlayer("target library"))); + ability.addTarget(new TargetPlayer()); this.addAbility(ability); + // Whenever you cast a black spell, exile the top card of target library. ability = new SpellCastControllerTriggeredAbility(new CircuDimirLobotomistEffect(), filterBlack, false); - ability.addTarget(new TargetPlayer(1, 1, true, new FilterPlayer("target library"))); + ability.addTarget(new TargetPlayer()); this.addAbility(ability); + // Your opponents can't cast nonland cards with the same name as a card exiled with Circu, Dimir Lobotomist. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CircuDimirLobotomistRuleModifyingEffect())); } @@ -82,7 +76,7 @@ class CircuDimirLobotomistEffect extends OneShotEffect { public CircuDimirLobotomistEffect() { super(Outcome.Detriment); - this.staticText = "exile the top card of target library"; + this.staticText = "exile the top card of target player's library"; } public CircuDimirLobotomistEffect(final CircuDimirLobotomistEffect effect) { diff --git a/Mage.Sets/src/mage/cards/c/CivilizedScholar.java b/Mage.Sets/src/mage/cards/c/CivilizedScholar.java index 79993fd2c2d..775632b928a 100644 --- a/Mage.Sets/src/mage/cards/c/CivilizedScholar.java +++ b/Mage.Sets/src/mage/cards/c/CivilizedScholar.java @@ -2,6 +2,7 @@ package mage.cards.c; import java.util.UUID; + import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -11,7 +12,6 @@ import mage.abilities.keyword.TransformAbility; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.h.HomicidalBrute; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Outcome; @@ -29,12 +29,12 @@ import mage.watchers.Watcher; public final class CivilizedScholar extends CardImpl { public CivilizedScholar(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.ADVISOR); this.transformable = true; - this.secondSideCardClazz = HomicidalBrute.class; + this.secondSideCardClazz = mage.cards.h.HomicidalBrute.class; this.power = new MageInt(0); this.toughness = new MageInt(1); diff --git a/Mage.Sets/src/mage/cards/c/ClamIAm.java b/Mage.Sets/src/mage/cards/c/ClamIAm.java new file mode 100644 index 00000000000..5ac727a7c25 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/ClamIAm.java @@ -0,0 +1,92 @@ + +package mage.cards.c; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.ReplacementEffectImpl; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.players.Player; + +/** + * + * @author L_J + */ +public final class ClamIAm extends CardImpl { + + public ClamIAm(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}"); + this.subtype.add(SubType.CLAMFOLK); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // If you roll a 3 on a six-sided die, you may reroll that die. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ClamIAmEffect())); + } + + public ClamIAm(final ClamIAm card) { + super(card); + } + + @Override + public ClamIAm copy() { + return new ClamIAm(this); + } +} + +class ClamIAmEffect extends ReplacementEffectImpl { + + ClamIAmEffect() { + super(Duration.WhileOnBattlefield, Outcome.Benefit); + staticText = "If you roll a 3 on a six-sided die, you may reroll that die"; + } + + ClamIAmEffect(final ClamIAmEffect effect) { + super(effect); + } + + @Override + public boolean replaceEvent(GameEvent event, Ability source, Game game) { + Player player = game.getPlayer(event.getPlayerId()); + if (player != null) { + String data = event.getData(); + int numSides = Integer.parseInt(data); + if (numSides == 6 && event.getAmount() == 3) { + if (player.chooseUse(outcome, "Reroll the die?", source, game)) { + game.informPlayers(player.getLogName() + " chose to reroll the die."); + event.setAmount(player.rollDice(game, 6)); + } + } + } + return false; + } + + @Override + public boolean checksEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.ROLL_DICE; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + return source.getControllerId().equals(event.getPlayerId()); + } + + @Override + public boolean apply(Game game, Ability source) { + return false; + } + + @Override + public ClamIAmEffect copy() { + return new ClamIAmEffect(this); + } +} diff --git a/Mage.Sets/src/mage/cards/c/Clambassadors.java b/Mage.Sets/src/mage/cards/c/Clambassadors.java new file mode 100644 index 00000000000..20bd836355d --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/Clambassadors.java @@ -0,0 +1,102 @@ + +package mage.cards.c; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.DealsDamageToAPlayerTriggeredAbility; +import mage.abilities.effects.ContinuousEffect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.continuous.GainControlTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.filter.common.FilterControlledPermanent; +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.Target; +import mage.target.common.TargetControlledPermanent; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author L_J + */ +public final class Clambassadors extends CardImpl { + + public Clambassadors(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}"); + this.subtype.add(SubType.CLAMFOLK); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Whenever Clambassadors deals damage to a player, choose an artifact, creature, or land you control. That player gains control of that permanent. + this.addAbility(new DealsDamageToAPlayerTriggeredAbility(new ClambassadorsEffect(), false, true)); + } + + public Clambassadors(final Clambassadors card) { + super(card); + } + + @Override + public Clambassadors copy() { + return new Clambassadors(this); + } +} + + +class ClambassadorsEffect extends OneShotEffect { + + private static final FilterControlledPermanent filter = new FilterControlledPermanent("artifact, creature, or land you control"); + + static { + filter.add(Predicates.or( + new CardTypePredicate(CardType.ARTIFACT), + new CardTypePredicate(CardType.CREATURE), + new CardTypePredicate(CardType.LAND))); + } + + static { + filter.add(Predicates.or(new CardTypePredicate(CardType.ARTIFACT), new CardTypePredicate(CardType.CREATURE), new CardTypePredicate(CardType.LAND))); + } + + public ClambassadorsEffect() { + super(Outcome.Detriment); + this.staticText = "choose an artifact, creature, or land you control. That player gains control of that permanent"; + } + + public ClambassadorsEffect(final ClambassadorsEffect effect) { + super(effect); + } + + @Override + public ClambassadorsEffect copy() { + return new ClambassadorsEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + Target target = new TargetControlledPermanent(1, 1, filter, true); + if (target.canChoose(source.getSourceId(), controller.getId(), game)) { + while (!target.isChosen() && target.canChoose(controller.getId(), game) && controller.canRespond()) { + controller.chooseTarget(outcome, target, source, game); + } + } + Permanent permanent = game.getPermanent(target.getFirstTarget()); + Player opponent = game.getPlayer(this.getTargetPointer().getFirst(game, source)); + if (permanent != null && opponent != null) { + ContinuousEffect effect = new GainControlTargetEffect(Duration.Custom, true, opponent.getId()); + effect.setTargetPointer(new FixedTarget(permanent, game)); + game.addEffect(effect, source); + game.informPlayers(opponent.getLogName() + " has gained control of " + permanent.getLogName()); + return true; + } + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/c/CloisteredYouth.java b/Mage.Sets/src/mage/cards/c/CloisteredYouth.java index aacd1ce4b9c..9e9153a0c21 100644 --- a/Mage.Sets/src/mage/cards/c/CloisteredYouth.java +++ b/Mage.Sets/src/mage/cards/c/CloisteredYouth.java @@ -2,32 +2,31 @@ package mage.cards.c; import java.util.UUID; + import mage.MageInt; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.effects.common.TransformSourceEffect; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.u.UnholyFiend; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.TargetController; /** - * * @author Loki */ public final class CloisteredYouth extends CardImpl { public CloisteredYouth(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}"); this.subtype.add(SubType.HUMAN); this.power = new MageInt(1); this.toughness = new MageInt(1); this.transformable = true; - this.secondSideCardClazz = UnholyFiend.class; + this.secondSideCardClazz = mage.cards.u.UnholyFiend.class; // At the beginning of your upkeep, you may transform Cloistered Youth. this.addAbility(new TransformAbility()); diff --git a/Mage.Sets/src/mage/cards/c/CollarTheCulprit.java b/Mage.Sets/src/mage/cards/c/CollarTheCulprit.java new file mode 100644 index 00000000000..0551082ab36 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CollarTheCulprit.java @@ -0,0 +1,42 @@ + +package mage.cards.c; + +import java.util.UUID; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.ComparisonType; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.ToughnessPredicate; +import mage.target.common.TargetCreaturePermanent; + +/** + * @author Ryan-Saklad + */ + +public final class CollarTheCulprit extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with toughness 4 or greater"); + + static { + filter.add(new ToughnessPredicate(ComparisonType.MORE_THAN, 3)); + } + + public CollarTheCulprit(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{3}{W}"); + + // Destroy target creature with toughness 4 or greater. + this.getSpellAbility().addEffect(new DestroyTargetEffect()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter)); + } + + public CollarTheCulprit(final CollarTheCulprit card) { + super(card); + } + + @Override + public CollarTheCulprit copy() { + return new CollarTheCulprit(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/c/CommuneWithLava.java b/Mage.Sets/src/mage/cards/c/CommuneWithLava.java index e38056a591d..08cf2112e74 100644 --- a/Mage.Sets/src/mage/cards/c/CommuneWithLava.java +++ b/Mage.Sets/src/mage/cards/c/CommuneWithLava.java @@ -1,4 +1,3 @@ - package mage.cards.c; import java.util.Set; @@ -23,7 +22,7 @@ import mage.util.CardUtil; public final class CommuneWithLava extends CardImpl { public CommuneWithLava(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{X}{R}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{X}{R}{R}"); // Exile the top X cards of your library. Until the end of your next turn, you may play those cards. this.getSpellAbility().addEffect(new CommuneWithLavaEffect()); diff --git a/Mage.Sets/src/mage/cards/c/ConfrontTheAssault.java b/Mage.Sets/src/mage/cards/c/ConfrontTheAssault.java new file mode 100644 index 00000000000..985bc5f919a --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/ConfrontTheAssault.java @@ -0,0 +1,45 @@ +package mage.cards.c; + +import mage.abilities.Ability; +import mage.abilities.common.CastOnlyDuringPhaseStepSourceAbility; +import mage.abilities.condition.common.AttackedThisStepCondition; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.PhaseStep; +import mage.constants.TurnPhase; +import mage.game.permanent.token.SpiritWhiteToken; +import mage.watchers.common.PlayerAttackedStepWatcher; + +import java.util.UUID; + +/** + * @author JayDi85 + */ +public final class ConfrontTheAssault extends CardImpl { + + public ConfrontTheAssault(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{4}{W}"); + + // Cast this spell only if a creature is attacking you. + Ability ability = new CastOnlyDuringPhaseStepSourceAbility( + TurnPhase.COMBAT, PhaseStep.DECLARE_ATTACKERS, AttackedThisStepCondition.instance, + "Cast this spell only if a creature is attacking you." + ); + ability.addWatcher(new PlayerAttackedStepWatcher()); + this.addAbility(ability); + + // Create three 1/1 white Spirit creature tokens with flying. + this.getSpellAbility().addEffect(new CreateTokenEffect(new SpiritWhiteToken("ANA"), 3)); + } + + public ConfrontTheAssault(final ConfrontTheAssault card) { + super(card); + } + + @Override + public ConfrontTheAssault copy() { + return new ConfrontTheAssault(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/c/Conspiracy.java b/Mage.Sets/src/mage/cards/c/Conspiracy.java index 1b305eff23b..dcac9387fbb 100644 --- a/Mage.Sets/src/mage/cards/c/Conspiracy.java +++ b/Mage.Sets/src/mage/cards/c/Conspiracy.java @@ -66,7 +66,7 @@ class ConspiracyEffect extends ContinuousEffectImpl { @Override public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) { Player controller = game.getPlayer(source.getControllerId()); - SubType subType = ChooseCreatureTypeEffect.getChoosenCreatureType(source.getSourceId(), game); + SubType subType = ChooseCreatureTypeEffect.getChosenCreatureType(source.getSourceId(), game); if (controller != null && subType != null) { // Creature cards you own that aren't on the battlefield // in graveyard diff --git a/Mage.Sets/src/mage/cards/c/ConvictedKiller.java b/Mage.Sets/src/mage/cards/c/ConvictedKiller.java index 513878588fd..3cc30aa14df 100644 --- a/Mage.Sets/src/mage/cards/c/ConvictedKiller.java +++ b/Mage.Sets/src/mage/cards/c/ConvictedKiller.java @@ -2,6 +2,7 @@ package mage.cards.c; import java.util.UUID; + import mage.MageInt; import mage.abilities.TriggeredAbility; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; @@ -11,26 +12,24 @@ import mage.abilities.effects.common.TransformSourceEffect; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.b.BrandedHowler; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.TargetController; /** - * * @author fireshoes */ public final class ConvictedKiller extends CardImpl { public ConvictedKiller(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.WEREWOLF); this.power = new MageInt(2); this.toughness = new MageInt(2); this.transformable = true; - this.secondSideCardClazz = BrandedHowler.class; + this.secondSideCardClazz = mage.cards.b.BrandedHowler.class; // At the beginning of each upkeep, if no spells were cast last turn, transform Convicted Killer. this.addAbility(new TransformAbility()); diff --git a/Mage.Sets/src/mage/cards/c/CosmotronicWave.java b/Mage.Sets/src/mage/cards/c/CosmotronicWave.java new file mode 100644 index 00000000000..18574f5cac6 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CosmotronicWave.java @@ -0,0 +1,41 @@ +package mage.cards.c; + +import java.util.UUID; +import mage.abilities.effects.common.DamageAllEffect; +import mage.abilities.effects.common.combat.CantBlockAllEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.filter.FilterPermanent; +import mage.filter.StaticFilters; +import mage.filter.common.FilterOpponentsCreaturePermanent; + +/** + * + * @author TheElk801 + */ +public final class CosmotronicWave extends CardImpl { + + private static final FilterPermanent filter = new FilterOpponentsCreaturePermanent("creature your opponents control"); + + public CosmotronicWave(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{R}"); + + // Cosmotronic Wave deals 1 damage to each creature your opponents control. Creatures your opponents control can't block this turn. + this.getSpellAbility().addEffect(new DamageAllEffect(1, filter)); + this.getSpellAbility().addEffect(new CantBlockAllEffect( + StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURE, + Duration.EndOfTurn + )); + } + + public CosmotronicWave(final CosmotronicWave card) { + super(card); + } + + @Override + public CosmotronicWave copy() { + return new CosmotronicWave(this); + } +} diff --git a/Mage.Sets/src/mage/cards/c/CoverOfDarkness.java b/Mage.Sets/src/mage/cards/c/CoverOfDarkness.java index 3e5a023a7f0..1c464ed1802 100644 --- a/Mage.Sets/src/mage/cards/c/CoverOfDarkness.java +++ b/Mage.Sets/src/mage/cards/c/CoverOfDarkness.java @@ -61,7 +61,7 @@ class FilterCoverOfDarkness extends FilterCreaturePermanent { public boolean match(Permanent permanent, UUID sourceId, UUID playerId, Game game) { if (super.match(permanent, sourceId, playerId, game)) { if (subType == null) { - subType = ChooseCreatureTypeEffect.getChoosenCreatureType(sourceId, game); + subType = ChooseCreatureTypeEffect.getChosenCreatureType(sourceId, game); if (subType == null) { return false; } diff --git a/Mage.Sets/src/mage/cards/c/CrabUmbra.java b/Mage.Sets/src/mage/cards/c/CrabUmbra.java index 86f5d56cf78..da173d83406 100644 --- a/Mage.Sets/src/mage/cards/c/CrabUmbra.java +++ b/Mage.Sets/src/mage/cards/c/CrabUmbra.java @@ -2,6 +2,7 @@ package mage.cards.c; import java.util.UUID; + import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; @@ -19,13 +20,12 @@ import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; /** - * * @author Loki */ public final class CrabUmbra extends CardImpl { public CrabUmbra(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{U}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{U}"); this.subtype.add(SubType.AURA); @@ -35,8 +35,11 @@ public final class CrabUmbra extends CardImpl { this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); Ability ability = new EnchantAbility(auraTarget.getTargetName()); this.addAbility(ability); + // {2}{U}: Untap enchanted creature. this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new UntapEnchantedEffect(), new ManaCostsImpl("{2}{U}"))); + + // Totem armor this.addAbility(new TotemArmorAbility()); } diff --git a/Mage.Sets/src/mage/cards/c/CruelCut.java b/Mage.Sets/src/mage/cards/c/CruelCut.java new file mode 100644 index 00000000000..267732f89f2 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CruelCut.java @@ -0,0 +1,42 @@ +package mage.cards.c; + +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.ComparisonType; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.PowerPredicate; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * @author JayDi85 + */ + +public final class CruelCut extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with power 2 or less"); + + static { + filter.add(new PowerPredicate(ComparisonType.FEWER_THAN, 3)); + } + + public CruelCut(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{B}"); + + // Destroy target creature with power 2 or less. + this.getSpellAbility().addEffect(new DestroyTargetEffect()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter)); + } + + public CruelCut(final CruelCut card) { + super(card); + } + + @Override + public CruelCut copy() { + return new CruelCut(this); + } +} diff --git a/Mage.Sets/src/mage/cards/c/CrushContraband.java b/Mage.Sets/src/mage/cards/c/CrushContraband.java new file mode 100644 index 00000000000..6cbe26f8dbb --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CrushContraband.java @@ -0,0 +1,45 @@ + +package mage.cards.c; + +import java.util.UUID; +import mage.abilities.Mode; +import mage.abilities.effects.common.ExileTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.target.common.TargetArtifactPermanent; +import mage.target.common.TargetEnchantmentPermanent; + +/** + * + * @author Ryan-Saklad + */ + +public final class CrushContraband extends CardImpl { + + public CrushContraband(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{3}{W}"); + + // Choose one or both - Destroy target artifact; or Destroy target land. + this.getSpellAbility().getModes().setMinModes(1); + this.getSpellAbility().getModes().setMaxModes(2); + + this.getSpellAbility().addTarget(new TargetArtifactPermanent()); + this.getSpellAbility().addEffect(new ExileTargetEffect()); + + Mode mode1 = new Mode(); + mode1.getTargets().add(new TargetEnchantmentPermanent()); + mode1.getEffects().add(new ExileTargetEffect()); + this.getSpellAbility().addMode(mode1); + + } + + public CrushContraband(final CrushContraband card) { + super(card); + } + + @Override + public CrushContraband copy() { + return new CrushContraband(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/c/CryptolithFragment.java b/Mage.Sets/src/mage/cards/c/CryptolithFragment.java index 2980d3aa903..103127f4a40 100644 --- a/Mage.Sets/src/mage/cards/c/CryptolithFragment.java +++ b/Mage.Sets/src/mage/cards/c/CryptolithFragment.java @@ -2,6 +2,7 @@ package mage.cards.c; import java.util.UUID; + import mage.abilities.Ability; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.common.EntersBattlefieldTappedAbility; @@ -13,21 +14,19 @@ import mage.abilities.keyword.TransformAbility; import mage.abilities.mana.AnyColorManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.a.AuroraOfEmrakul; import mage.constants.CardType; import mage.constants.TargetController; /** - * * @author fireshoes */ public final class CryptolithFragment extends CardImpl { public CryptolithFragment(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{3}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}"); this.transformable = true; - this.secondSideCardClazz = AuroraOfEmrakul.class; + this.secondSideCardClazz = mage.cards.a.AuroraOfEmrakul.class; // Cryptolith Fragment enters the battlefield tapped. this.addAbility(new EntersBattlefieldTappedAbility()); diff --git a/Mage.Sets/src/mage/cards/c/CunningAbduction.java b/Mage.Sets/src/mage/cards/c/CunningAbduction.java index 1bbb4ac15b1..f34a14e72c5 100644 --- a/Mage.Sets/src/mage/cards/c/CunningAbduction.java +++ b/Mage.Sets/src/mage/cards/c/CunningAbduction.java @@ -1,4 +1,3 @@ - package mage.cards.c; import java.util.UUID; @@ -8,6 +7,7 @@ import mage.abilities.effects.AsThoughEffectImpl; import mage.abilities.effects.AsThoughManaEffect; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.asthought.PlayFromNotOwnHandZoneTargetEffect; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -28,7 +28,7 @@ import mage.util.CardUtil; public final class CunningAbduction extends CardImpl { public CunningAbduction(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{1}{U}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{U}{B}"); // Target opponent reveals their hand. You choose a nonland card from that player's hand and exile it. You may cast that card for as long as it remains exiled, and you may spend mana as though it were mana of any color to cast that spell. this.getSpellAbility().addTarget(new TargetOpponent()); @@ -82,10 +82,10 @@ class CunningAbductionExileEffect extends OneShotEffect { if (card != null) { // move card to exile UUID exileId = CardUtil.getCardExileZoneId(game, source); - controller.moveCardToExileWithInfo(card, exileId, sourceObject.getIdName(), source.getSourceId(), game, Zone.HAND, true); + controller.moveCardsToExile(card, source, game, true, exileId, sourceObject.getIdName()); // allow to cast the card - ContinuousEffect effect = new CunningAbductionCastFromExileEffect(); - effect.setTargetPointer(new FixedTarget(card.getId())); + ContinuousEffect effect = new PlayFromNotOwnHandZoneTargetEffect(Zone.EXILED, Duration.Custom); + effect.setTargetPointer(new FixedTarget(card, game)); game.addEffect(effect, source); // and you may spend mana as though it were mana of any color to cast it effect = new CunningAbductionSpendAnyManaEffect(); @@ -99,41 +99,6 @@ class CunningAbductionExileEffect extends OneShotEffect { } } -class CunningAbductionCastFromExileEffect extends AsThoughEffectImpl { - - public CunningAbductionCastFromExileEffect() { - super(AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, Duration.Custom, Outcome.Benefit); - staticText = "You may cast that card for as long as it remains exiled, and you may spend mana as though it were mana of any color to cast that spell"; - } - - public CunningAbductionCastFromExileEffect(final CunningAbductionCastFromExileEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - return true; - } - - @Override - public CunningAbductionCastFromExileEffect copy() { - return new CunningAbductionCastFromExileEffect(this); - } - - @Override - public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) { - if (objectId.equals(getTargetPointer().getFirst(game, source))) { - if (affectedControllerId.equals(source.getControllerId())) { - return true; - } - } else if (((FixedTarget) getTargetPointer()).getTarget().equals(objectId)) { - // object has moved zone so effect can be discarted - this.discard(); - } - return false; - } -} - class CunningAbductionSpendAnyManaEffect extends AsThoughEffectImpl implements AsThoughManaEffect { public CunningAbductionSpendAnyManaEffect() { diff --git a/Mage.Sets/src/mage/cards/c/CuriousHomunculus.java b/Mage.Sets/src/mage/cards/c/CuriousHomunculus.java index 183beb3ef6c..8770e67a6be 100644 --- a/Mage.Sets/src/mage/cards/c/CuriousHomunculus.java +++ b/Mage.Sets/src/mage/cards/c/CuriousHomunculus.java @@ -2,6 +2,7 @@ package mage.cards.c; import java.util.UUID; + import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; @@ -14,7 +15,6 @@ import mage.abilities.mana.ConditionalColorlessManaAbility; import mage.abilities.mana.builder.common.InstantOrSorcerySpellManaBuilder; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.v.VoraciousReader; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.TargetController; @@ -23,7 +23,6 @@ import mage.game.Game; import mage.players.Player; /** - * * @author fireshoes */ public final class CuriousHomunculus extends CardImpl { @@ -35,7 +34,7 @@ public final class CuriousHomunculus extends CardImpl { this.toughness = new MageInt(1); this.transformable = true; - this.secondSideCardClazz = VoraciousReader.class; + this.secondSideCardClazz = mage.cards.v.VoraciousReader.class; // {T}: Add {C}. Spend this mana only to cast an instant or sorcery spell. this.addAbility(new ConditionalColorlessManaAbility(new TapSourceCost(), 1, new InstantOrSorcerySpellManaBuilder())); diff --git a/Mage.Sets/src/mage/cards/d/DackFayden.java b/Mage.Sets/src/mage/cards/d/DackFayden.java index d6fe0597e36..f23dc1865e8 100644 --- a/Mage.Sets/src/mage/cards/d/DackFayden.java +++ b/Mage.Sets/src/mage/cards/d/DackFayden.java @@ -3,7 +3,7 @@ package mage.cards.d; import java.util.UUID; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.common.DrawCardTargetEffect; import mage.abilities.effects.common.GetEmblemEffect; @@ -27,7 +27,7 @@ public final class DackFayden extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.DACK); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3)); // +1: Target player draws two cards, then discards two cards. LoyaltyAbility ability = new LoyaltyAbility(new DrawCardTargetEffect(2), 1); diff --git a/Mage.Sets/src/mage/cards/d/DarettiIngeniousIconoclast.java b/Mage.Sets/src/mage/cards/d/DarettiIngeniousIconoclast.java index 8bad4d8f426..8abf13e932d 100644 --- a/Mage.Sets/src/mage/cards/d/DarettiIngeniousIconoclast.java +++ b/Mage.Sets/src/mage/cards/d/DarettiIngeniousIconoclast.java @@ -4,7 +4,7 @@ package mage.cards.d; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.costs.common.SacrificeTargetCost; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateTokenCopyTargetEffect; @@ -47,7 +47,7 @@ public final class DarettiIngeniousIconoclast extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.DARETTI); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3)); // +1: Create a 1/1 colorless Construct artifact creature token with defender. LoyaltyAbility ability = new LoyaltyAbility(new CreateTokenEffect(new DarettiConstructToken()), 1); diff --git a/Mage.Sets/src/mage/cards/d/DarettiScrapSavant.java b/Mage.Sets/src/mage/cards/d/DarettiScrapSavant.java index 5a71881639b..85a367404c1 100644 --- a/Mage.Sets/src/mage/cards/d/DarettiScrapSavant.java +++ b/Mage.Sets/src/mage/cards/d/DarettiScrapSavant.java @@ -5,7 +5,7 @@ import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; import mage.abilities.common.CanBeYourCommanderAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; @@ -44,7 +44,7 @@ public final class DarettiScrapSavant extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.DARETTI); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3)); // +2: Discard up to two cards, then draw that many cards. this.addAbility(new LoyaltyAbility(new DarettiDiscardDrawEffect(), 2)); diff --git a/Mage.Sets/src/mage/cards/d/DaringSleuth.java b/Mage.Sets/src/mage/cards/d/DaringSleuth.java index 0d0bef2394f..a4fbd3a1c75 100644 --- a/Mage.Sets/src/mage/cards/d/DaringSleuth.java +++ b/Mage.Sets/src/mage/cards/d/DaringSleuth.java @@ -7,7 +7,6 @@ import mage.abilities.effects.common.TransformSourceEffect; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.b.BearerOfOverwhelmingTruths; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Zone; @@ -18,20 +17,19 @@ import mage.game.events.GameEvent.EventType; import java.util.UUID; /** - * * @author fireshoes */ public final class DaringSleuth extends CardImpl { public DaringSleuth(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.ROGUE); this.power = new MageInt(2); this.toughness = new MageInt(1); - + this.transformable = true; - this.secondSideCardClazz = BearerOfOverwhelmingTruths.class; + this.secondSideCardClazz = mage.cards.b.BearerOfOverwhelmingTruths.class; // When you sacrifice a Clue, transform Daring Sleuth. this.addAbility(new TransformAbility()); diff --git a/Mage.Sets/src/mage/cards/d/DarkDecision.java b/Mage.Sets/src/mage/cards/d/DarkDecision.java index 880f0216af5..f89c73413ba 100644 --- a/Mage.Sets/src/mage/cards/d/DarkDecision.java +++ b/Mage.Sets/src/mage/cards/d/DarkDecision.java @@ -1,22 +1,20 @@ - package mage.cards.d; import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.costs.common.PayLifeCost; -import mage.abilities.effects.AsThoughEffectImpl; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.asthought.PlayFromNotOwnHandZoneTargetEffect; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.AsThoughEffectType; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; +import mage.constants.Zone; import mage.filter.common.FilterNonlandCard; -import mage.game.ExileZone; import mage.game.Game; import mage.players.Player; import mage.target.common.TargetCardInLibrary; @@ -76,7 +74,7 @@ class DarkDecisionEffect extends OneShotEffect { Card card = game.getCard(targetId); if (card != null) { controller.moveCardsToExile(card, source, game, true, source.getSourceId(), sourceObject.getIdName()); - ContinuousEffect effect = new DarkDecisionMayPlayExiledEffect(); + ContinuousEffect effect = new PlayFromNotOwnHandZoneTargetEffect(Zone.EXILED, Duration.EndOfTurn); effect.setTargetPointer(new FixedTarget(card.getId(), game)); game.addEffect(effect, source); } @@ -88,34 +86,3 @@ class DarkDecisionEffect extends OneShotEffect { } } - -class DarkDecisionMayPlayExiledEffect extends AsThoughEffectImpl { - - public DarkDecisionMayPlayExiledEffect() { - super(AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, Duration.EndOfTurn, Outcome.Benefit); - } - - public DarkDecisionMayPlayExiledEffect(final DarkDecisionMayPlayExiledEffect effect) { - super(effect); - } - - @Override - public DarkDecisionMayPlayExiledEffect copy() { - return new DarkDecisionMayPlayExiledEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - return true; - } - - @Override - public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) { - if (objectId.equals(getTargetPointer().getFirst(game, source)) && affectedControllerId.equals(source.getControllerId())) { - ExileZone exileZone = game.getExile().getExileZone(source.getSourceId()); - return exileZone != null && exileZone.contains(getTargetPointer().getFirst(game, source)); - } - return false; - } - -} diff --git a/Mage.Sets/src/mage/cards/d/DarkDwellerOracle.java b/Mage.Sets/src/mage/cards/d/DarkDwellerOracle.java index bef6334009f..fc1d1a34269 100644 --- a/Mage.Sets/src/mage/cards/d/DarkDwellerOracle.java +++ b/Mage.Sets/src/mage/cards/d/DarkDwellerOracle.java @@ -6,17 +6,17 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.SacrificeTargetCost; import mage.abilities.costs.mana.GenericManaCost; -import mage.abilities.effects.AsThoughEffectImpl; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.asthought.PlayFromNotOwnHandZoneTargetEffect; import mage.cards.Card; -import mage.constants.SubType; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.AsThoughEffectType; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; +import mage.constants.SubType; +import mage.constants.Zone; import static mage.filter.StaticFilters.FILTER_CONTROLLED_CREATURE_SHORT_TEXT; import mage.game.Game; import mage.game.permanent.Permanent; @@ -88,8 +88,8 @@ class DarkDwellerOracleExileEffect extends OneShotEffect { if (card != null) { String exileName = sourcePermanent.getIdName() + " "; controller.moveCardsToExile(card, source, game, true, source.getSourceId(), exileName); - ContinuousEffect effect = new DarkDwellerOracleCastFromExileEffect(); - effect.setTargetPointer(new FixedTarget(card.getId(), card.getZoneChangeCounter(game))); + ContinuousEffect effect = new PlayFromNotOwnHandZoneTargetEffect(Zone.EXILED, Duration.EndOfTurn); + effect.setTargetPointer(new FixedTarget(card, game)); game.addEffect(effect, source); } return true; @@ -97,31 +97,3 @@ class DarkDwellerOracleExileEffect extends OneShotEffect { return false; } } - -class DarkDwellerOracleCastFromExileEffect extends AsThoughEffectImpl { - - public DarkDwellerOracleCastFromExileEffect() { - super(AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, Duration.EndOfTurn, Outcome.Benefit); - staticText = "You may play the card from exile"; - } - - public DarkDwellerOracleCastFromExileEffect(final DarkDwellerOracleCastFromExileEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - return true; - } - - @Override - public DarkDwellerOracleCastFromExileEffect copy() { - return new DarkDwellerOracleCastFromExileEffect(this); - } - - @Override - public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) { - return source.isControlledBy(affectedControllerId) - && objectId.equals(getTargetPointer().getFirst(game, source)); - } -} diff --git a/Mage.Sets/src/mage/cards/d/DarkbladeAgent.java b/Mage.Sets/src/mage/cards/d/DarkbladeAgent.java index 62610350a32..85a91830aa8 100644 --- a/Mage.Sets/src/mage/cards/d/DarkbladeAgent.java +++ b/Mage.Sets/src/mage/cards/d/DarkbladeAgent.java @@ -22,7 +22,6 @@ import mage.constants.Zone; import mage.game.Game; import mage.game.events.GameEvent; import mage.watchers.Watcher; -import mage.watchers.common.SpellsCastWatcher; /** * @@ -59,7 +58,7 @@ public final class DarkbladeAgent extends CardImpl { "and \"Whenever this creature deals " + "combat damage to a player, draw a card.\"" )); - this.addAbility(ability, new SpellsCastWatcher()); + this.addAbility(ability, new DarkbladeAgentWatcher()); } public DarkbladeAgent(final DarkbladeAgent card) { diff --git a/Mage.Sets/src/mage/cards/d/DarthSidiousSithLord.java b/Mage.Sets/src/mage/cards/d/DarthSidiousSithLord.java index 875a208acee..27fe59e6722 100644 --- a/Mage.Sets/src/mage/cards/d/DarthSidiousSithLord.java +++ b/Mage.Sets/src/mage/cards/d/DarthSidiousSithLord.java @@ -4,7 +4,7 @@ package mage.cards.d; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.DestroyTargetEffect; import mage.abilities.effects.common.SacrificeEffect; @@ -38,7 +38,7 @@ public final class DarthSidiousSithLord extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.PLANESWALKER},"{4}{U}{B}{B}{R}"); this.subtype.add(SubType.SIDIOUS); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(5)); // +3: Destroy target noncreature permanent. Ability ability = new LoyaltyAbility(new DestroyTargetEffect(), +3); diff --git a/Mage.Sets/src/mage/cards/d/DarthTyranusCountOfSerenno.java b/Mage.Sets/src/mage/cards/d/DarthTyranusCountOfSerenno.java index 124c90a7b0b..92b3e495aba 100644 --- a/Mage.Sets/src/mage/cards/d/DarthTyranusCountOfSerenno.java +++ b/Mage.Sets/src/mage/cards/d/DarthTyranusCountOfSerenno.java @@ -4,7 +4,7 @@ package mage.cards.d; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.SearchEffect; @@ -37,7 +37,7 @@ public final class DarthTyranusCountOfSerenno extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.PLANESWALKER},"{1}{W}{U}{B}"); this.subtype.add(SubType.DOOKU); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3)); // +1: Up to one target creature gets -6/-0 until your next turn. Effect effect = new BoostTargetEffect(-6, 0, Duration.UntilYourNextTurn); diff --git a/Mage.Sets/src/mage/cards/d/DaxosOfMeletis.java b/Mage.Sets/src/mage/cards/d/DaxosOfMeletis.java index 0f13053b5a6..87131ba9ba9 100644 --- a/Mage.Sets/src/mage/cards/d/DaxosOfMeletis.java +++ b/Mage.Sets/src/mage/cards/d/DaxosOfMeletis.java @@ -1,4 +1,3 @@ - package mage.cards.d; import java.util.Objects; @@ -12,6 +11,7 @@ import mage.abilities.effects.AsThoughEffectImpl; import mage.abilities.effects.AsThoughManaEffect; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.asthought.PlayFromNotOwnHandZoneTargetEffect; import mage.abilities.effects.common.combat.CantBeBlockedByCreaturesSourceEffect; import mage.cards.Card; import mage.cards.CardImpl; @@ -39,7 +39,7 @@ public final class DaxosOfMeletis extends CardImpl { } public DaxosOfMeletis(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{W}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}{U}"); this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.SOLDIER); @@ -91,7 +91,7 @@ class DaxosOfMeletisEffect extends OneShotEffect { Card card = damagedPlayer.getLibrary().getFromTop(game); if (card != null) { // move card to exile - controller.moveCardToExileWithInfo(card, exileId, sourceObject.getIdName(), source.getSourceId(), game, Zone.LIBRARY, true); + controller.moveCardsToExile(card, source, game, true, exileId, sourceObject.getIdName()); // player gains life int cmc = card.getConvertedManaCost(); if (cmc > 0) { @@ -100,10 +100,12 @@ class DaxosOfMeletisEffect extends OneShotEffect { // Add effects only if the card has a spellAbility (e.g. not for lands). if (card.getSpellAbility() != null) { // allow to cast the card - game.addEffect(new DaxosOfMeletisCastFromExileEffect(card.getId(), exileId), source); + ContinuousEffect effect = new PlayFromNotOwnHandZoneTargetEffect(Zone.EXILED, Duration.EndOfTurn); + effect.setTargetPointer(new FixedTarget(card, game)); + game.addEffect(effect, source); // and you may spend mana as though it were mana of any color to cast it - ContinuousEffect effect = new DaxosOfMeletisSpendAnyManaEffect(); - effect.setTargetPointer(new FixedTarget(card.getId())); + effect = new DaxosOfMeletisSpendAnyManaEffect(); + effect.setTargetPointer(new FixedTarget(card, game)); game.addEffect(effect, source); } } diff --git a/Mage.Sets/src/mage/cards/d/DaybreakRanger.java b/Mage.Sets/src/mage/cards/d/DaybreakRanger.java index 19f86a0c96e..093f520c88b 100644 --- a/Mage.Sets/src/mage/cards/d/DaybreakRanger.java +++ b/Mage.Sets/src/mage/cards/d/DaybreakRanger.java @@ -2,6 +2,7 @@ package mage.cards.d; import java.util.UUID; + import mage.MageInt; import mage.abilities.Ability; import mage.abilities.TriggeredAbility; @@ -16,7 +17,6 @@ import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.n.NightfallPredator; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.TargetController; @@ -26,7 +26,6 @@ import mage.filter.predicate.mageobject.AbilityPredicate; import mage.target.common.TargetCreaturePermanent; /** - * * @author North */ public final class DaybreakRanger extends CardImpl { @@ -38,13 +37,13 @@ public final class DaybreakRanger extends CardImpl { } public DaybreakRanger(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.ARCHER); this.subtype.add(SubType.WEREWOLF); this.transformable = true; - this.secondSideCardClazz = NightfallPredator.class; + this.secondSideCardClazz = mage.cards.n.NightfallPredator.class; this.power = new MageInt(2); this.toughness = new MageInt(2); @@ -67,4 +66,4 @@ public final class DaybreakRanger extends CardImpl { public DaybreakRanger copy() { return new DaybreakRanger(this); } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/d/DeadMansChest.java b/Mage.Sets/src/mage/cards/d/DeadMansChest.java index 24c8de7bdab..76a659af210 100644 --- a/Mage.Sets/src/mage/cards/d/DeadMansChest.java +++ b/Mage.Sets/src/mage/cards/d/DeadMansChest.java @@ -1,4 +1,3 @@ - package mage.cards.d; import java.util.Set; @@ -11,6 +10,7 @@ import mage.abilities.effects.AsThoughManaEffect; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.asthought.PlayFromNotOwnHandZoneTargetEffect; import mage.abilities.keyword.EnchantAbility; import mage.cards.Card; import mage.cards.CardImpl; @@ -22,6 +22,7 @@ import mage.constants.ManaType; import mage.constants.Outcome; import mage.constants.SubType; import mage.constants.TargetController; +import mage.constants.Zone; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.permanent.ControllerPredicate; import mage.game.Game; @@ -101,11 +102,11 @@ class DeadMansChestEffect extends OneShotEffect { controller.moveCardsToExile(cards, source, game, true, source.getSourceId(), sourceObject.getLogName()); for (Card card : cards) { if (!card.isLand()) { - ContinuousEffect effect = new DeadMansChestCastFromExileEffect(); - effect.setTargetPointer(new FixedTarget(card.getId(), card.getZoneChangeCounter(game))); + ContinuousEffect effect = new PlayFromNotOwnHandZoneTargetEffect(Zone.EXILED, Duration.Custom); + effect.setTargetPointer(new FixedTarget(card, game)); game.addEffect(effect, source); effect = new DeadMansChestSpendManaEffect(); - effect.setTargetPointer(new FixedTarget(card.getId(), card.getZoneChangeCounter(game))); + effect.setTargetPointer(new FixedTarget(card, game)); game.addEffect(effect, source); } } diff --git a/Mage.Sets/src/mage/cards/d/DeclarationOfNaught.java b/Mage.Sets/src/mage/cards/d/DeclarationOfNaught.java index 7fef07ec16a..8e761b1c307 100644 --- a/Mage.Sets/src/mage/cards/d/DeclarationOfNaught.java +++ b/Mage.Sets/src/mage/cards/d/DeclarationOfNaught.java @@ -1,7 +1,7 @@ - package mage.cards.d; import java.util.UUID; +import mage.abilities.Ability; import mage.abilities.common.AsEntersBattlefieldAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; @@ -10,10 +10,12 @@ import mage.abilities.effects.common.ChooseACardNameEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.TargetAdjustment; import mage.constants.Zone; import mage.filter.FilterSpell; +import mage.filter.predicate.mageobject.NamePredicate; +import mage.game.Game; import mage.target.TargetSpell; +import mage.target.targetadjustment.TargetAdjuster; /** * @@ -31,7 +33,7 @@ public final class DeclarationOfNaught extends CardImpl { // {U}: Counter target spell with the chosen name. SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CounterTargetEffect(), new ManaCostsImpl("{U}")); - ability.setTargetAdjustment(TargetAdjustment.CHOSEN_NAME); + ability.setTargetAdjuster(DeclarationOfNaughtAdjuster.instance); ability.addTarget(new TargetSpell(filter)); this.addAbility(ability); } @@ -45,3 +47,17 @@ public final class DeclarationOfNaught extends CardImpl { return new DeclarationOfNaught(this); } } + +enum DeclarationOfNaughtAdjuster implements TargetAdjuster { + instance; + + @Override + public void adjustTargets(Ability ability, Game game) { + ability.getTargets().clear(); + String chosenName = (String) game.getState().getValue(ability.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY); + FilterSpell filterSpell = new FilterSpell("spell named " + chosenName); + filterSpell.add(new NamePredicate(chosenName)); + TargetSpell target = new TargetSpell(1, filterSpell); + ability.addTarget(target); + } +} diff --git a/Mage.Sets/src/mage/cards/d/DecoctionModule.java b/Mage.Sets/src/mage/cards/d/DecoctionModule.java index 95b4a39c128..c870592f426 100644 --- a/Mage.Sets/src/mage/cards/d/DecoctionModule.java +++ b/Mage.Sets/src/mage/cards/d/DecoctionModule.java @@ -1,9 +1,8 @@ package mage.cards.d; -import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.common.CreatureEntersBattlefieldTriggeredAbility; +import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; @@ -13,19 +12,26 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Zone; +import mage.filter.StaticFilters; import mage.target.common.TargetControlledCreaturePermanent; +import java.util.UUID; + /** - * * @author emerald000 */ public final class DecoctionModule extends CardImpl { public DecoctionModule(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{2}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}"); // Whenever a creature enters the battlefield under your control, you get {E}. - this.addAbility(new CreatureEntersBattlefieldTriggeredAbility(new GetEnergyCountersControllerEffect(1))); + this.addAbility(new EntersBattlefieldControlledTriggeredAbility( + Zone.BATTLEFIELD, + new GetEnergyCountersControllerEffect(1), + StaticFilters.FILTER_PERMANENT_CREATURE_A, + false) + ); // {4}, {T}: Return target creature you control to its owner's hand. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ReturnToHandTargetEffect(), new GenericManaCost(4)); diff --git a/Mage.Sets/src/mage/cards/d/DeepfireElemental.java b/Mage.Sets/src/mage/cards/d/DeepfireElemental.java index c5bcdd1dcc6..59ec4f30aad 100644 --- a/Mage.Sets/src/mage/cards/d/DeepfireElemental.java +++ b/Mage.Sets/src/mage/cards/d/DeepfireElemental.java @@ -1,4 +1,3 @@ - package mage.cards.d; import java.util.UUID; @@ -11,12 +10,12 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.constants.TargetAdjustment; import mage.constants.Zone; import mage.filter.FilterPermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.CardTypePredicate; import mage.target.TargetPermanent; +import mage.target.targetadjustment.XCMCPermanentAdjuster; /** * @@ -43,7 +42,7 @@ public final class DeepfireElemental extends CardImpl { // {X}{X}{1}: Destroy target artifact or creature with converted mana cost X. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DestroyTargetEffect(), new ManaCostsImpl("{X}{X}{1}")); ability.addTarget(new TargetPermanent(filter)); - ability.setTargetAdjustment(TargetAdjustment.X_CMC_EQUAL_PERM); + ability.setTargetAdjuster(XCMCPermanentAdjuster.instance); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/d/DeepwoodElder.java b/Mage.Sets/src/mage/cards/d/DeepwoodElder.java index 2262b266e32..0acd737bac5 100644 --- a/Mage.Sets/src/mage/cards/d/DeepwoodElder.java +++ b/Mage.Sets/src/mage/cards/d/DeepwoodElder.java @@ -1,4 +1,3 @@ - package mage.cards.d; import java.util.UUID; @@ -17,12 +16,12 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; -import mage.constants.TargetAdjustment; import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.Target; import mage.target.TargetPermanent; +import mage.target.targetadjustment.XTargetsAdjuster; import mage.target.targetpointer.FixedTarget; /** @@ -44,7 +43,7 @@ public final class DeepwoodElder extends CardImpl { ability.addCost(new TapSourceCost()); ability.addCost(new DiscardCardCost()); ability.addTarget(new TargetPermanent(StaticFilters.FILTER_LANDS)); - ability.setTargetAdjustment(TargetAdjustment.X_TARGETS); + ability.setTargetAdjuster(XTargetsAdjuster.instance); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/d/DelightedKillbot.java b/Mage.Sets/src/mage/cards/d/DelightedKillbot.java new file mode 100644 index 00000000000..a5138ced2d9 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DelightedKillbot.java @@ -0,0 +1,33 @@ + +package mage.cards.d; + +import java.util.UUID; +import mage.MageInt; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; + +/** + * + * @author spjspj + */ +public final class DelightedKillbot extends CardImpl { + + public DelightedKillbot(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{2}"); + + this.subtype.add(SubType.KILLBOT); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + } + + public DelightedKillbot(final DelightedKillbot card) { + super(card); + } + + @Override + public DelightedKillbot copy() { + return new DelightedKillbot(this); + } +} diff --git a/Mage.Sets/src/mage/cards/d/DelverOfSecrets.java b/Mage.Sets/src/mage/cards/d/DelverOfSecrets.java index 474993fb4c8..2b2ea06194d 100644 --- a/Mage.Sets/src/mage/cards/d/DelverOfSecrets.java +++ b/Mage.Sets/src/mage/cards/d/DelverOfSecrets.java @@ -2,6 +2,7 @@ package mage.cards.d; import java.util.UUID; + import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; @@ -9,7 +10,6 @@ import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.TransformSourceEffect; import mage.abilities.keyword.TransformAbility; import mage.cards.*; -import mage.cards.i.InsectileAberration; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Outcome; @@ -21,13 +21,12 @@ import mage.game.permanent.Permanent; import mage.players.Player; /** - * * @author Alvin */ public final class DelverOfSecrets extends CardImpl { public DelverOfSecrets(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{U}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{U}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.WIZARD); @@ -35,7 +34,7 @@ public final class DelverOfSecrets extends CardImpl { this.toughness = new MageInt(1); this.transformable = true; - this.secondSideCardClazz = InsectileAberration.class; + this.secondSideCardClazz = mage.cards.i.InsectileAberration.class; // At the beginning of your upkeep, look at the top card of your library. You may reveal that card. If an instant or sorcery card is revealed this way, transform Delver of Secrets. this.addAbility(new TransformAbility()); @@ -53,28 +52,28 @@ public final class DelverOfSecrets extends CardImpl { } class DelverOfSecretsEffect extends OneShotEffect { - + private static final FilterCard filter = new FilterInstantOrSorceryCard(); - + public DelverOfSecretsEffect() { super(Outcome.Benefit); this.staticText = "look at the top card of your library. You may reveal that card. If an instant or sorcery card is revealed this way, transform {this}"; } - + public DelverOfSecretsEffect(final DelverOfSecretsEffect effect) { super(effect); } - + @Override public DelverOfSecretsEffect copy() { return new DelverOfSecretsEffect(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) { + if (player != null && sourcePermanent != null) { if (player.getLibrary().hasCards()) { Card card = player.getLibrary().getFromTop(game); Cards cards = new CardsImpl(); @@ -86,10 +85,10 @@ class DelverOfSecretsEffect extends OneShotEffect { return new TransformSourceEffect(true, true).apply(game, source); } } - + } return true; - } + } return false; } } diff --git a/Mage.Sets/src/mage/cards/d/Demotion.java b/Mage.Sets/src/mage/cards/d/Demotion.java new file mode 100644 index 00000000000..c3634273b84 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/Demotion.java @@ -0,0 +1,51 @@ + +package mage.cards.d; + +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.combat.CantBlockActivateAttachedEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.keyword.DefenderAbility; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author Ryan-Saklad + */ + +public final class Demotion extends CardImpl { + + public Demotion(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{W}"); + this.subtype.add(SubType.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); + + // Enchanted creature can't block, and its activated abilities can't be activated. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBlockActivateAttachedEffect())); + + } + + public Demotion(final Demotion card) { + super(card); + } + + @Override + public Demotion copy() { + return new Demotion(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/d/Denied.java b/Mage.Sets/src/mage/cards/d/Denied.java new file mode 100644 index 00000000000..534d1a1a5f6 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/Denied.java @@ -0,0 +1,80 @@ + +package mage.cards.d; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ChooseACardNameEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.game.Game; +import mage.players.Player; +import mage.game.stack.Spell; +import mage.target.TargetSpell; + +/** + * + * @author L_J + */ +public final class Denied extends CardImpl { + + public Denied(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{U}"); + + // Choose a card name, then target spell's controller reveals their hand. If a card with the chosen name is revealed this way, counter that spell. + this.getSpellAbility().addEffect(new ChooseACardNameEffect(ChooseACardNameEffect.TypeOfName.ALL)); + this.getSpellAbility().addEffect(new DeniedEffect()); + this.getSpellAbility().addTarget(new TargetSpell()); + } + + public Denied(final Denied card) { + super(card); + } + + @Override + public Denied copy() { + return new Denied(this); + } +} + +class DeniedEffect extends OneShotEffect { + + public DeniedEffect() { + super(Outcome.Detriment); + staticText = "Choose a card name, then target spell's controller reveals their hand. If a card with the chosen name is revealed this way, counter that spell"; + } + + public DeniedEffect(final DeniedEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Spell targetSpell = game.getStack().getSpell(source.getFirstTarget()); + if (targetSpell == null) { + return true; + } + Player player = game.getPlayer(targetSpell.getControllerId()); + Object object = (String) game.getState().getValue(source.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY); + if (player != null && object instanceof String) { + player.revealCards("Denied!", player.getHand(), game, true); + String namedCard = (String) object; + for (Card card : player.getHand().getCards(game)) { + if (card != null && card.getName().equals(namedCard)) { + game.getStack().counter(targetSpell.getId(), source.getSourceId(), game); + break; + } + } + return true; + } + return false; + } + + @Override + public DeniedEffect copy() { + return new DeniedEffect(this); + } +} diff --git a/Mage.Sets/src/mage/cards/d/DespondentKillbot.java b/Mage.Sets/src/mage/cards/d/DespondentKillbot.java new file mode 100644 index 00000000000..3f4dde3130f --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DespondentKillbot.java @@ -0,0 +1,33 @@ + +package mage.cards.d; + +import java.util.UUID; +import mage.MageInt; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; + +/** + * + * @author spjspj + */ +public final class DespondentKillbot extends CardImpl { + + public DespondentKillbot(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{2}"); + + this.subtype.add(SubType.KILLBOT); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + } + + public DespondentKillbot(final DespondentKillbot card) { + super(card); + } + + @Override + public DespondentKillbot copy() { + return new DespondentKillbot(this); + } +} diff --git a/Mage.Sets/src/mage/cards/d/DeviousCoverUp.java b/Mage.Sets/src/mage/cards/d/DeviousCoverUp.java new file mode 100644 index 00000000000..3bc89c7350a --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DeviousCoverUp.java @@ -0,0 +1,83 @@ +package mage.cards.d; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CounterTargetWithReplacementEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.Cards; +import mage.cards.CardsImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.game.Game; +import mage.players.Player; +import mage.target.TargetSpell; +import mage.target.common.TargetCardInYourGraveyard; +import mage.target.targetpointer.SecondTargetPointer; + +/** + * + * @author TheElk801 + */ +public final class DeviousCoverUp extends CardImpl { + + public DeviousCoverUp(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{U}{U}"); + + // Counter target spell. If that spell is countered this way, exile it instead of putting it into its owner's graveyard. + this.getSpellAbility().addEffect(new CounterTargetWithReplacementEffect(Zone.EXILED)); + this.getSpellAbility().addTarget(new TargetSpell()); + + // You may shuffle up to four target cards from your graveyard into your library. + this.getSpellAbility().addEffect(new DeviousCoverUpEffect().setTargetPointer(new SecondTargetPointer())); + this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(0, 4)); + } + + public DeviousCoverUp(final DeviousCoverUp card) { + super(card); + } + + @Override + public DeviousCoverUp copy() { + return new DeviousCoverUp(this); + } +} + +class DeviousCoverUpEffect extends OneShotEffect { + + public DeviousCoverUpEffect() { + super(Outcome.Benefit); + this.staticText = "You may shuffle up to four target cards " + + "from your graveyard into your library."; + } + + public DeviousCoverUpEffect(final DeviousCoverUpEffect effect) { + super(effect); + } + + @Override + public DeviousCoverUpEffect copy() { + return new DeviousCoverUpEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller == null || !controller.chooseUse(outcome, "Shuffle the targeted cards into your library?", source, game)) { + return false; + } + Cards cards = new CardsImpl(); + for (UUID targetId : targetPointer.getTargets(game, source)) { + Card card = game.getCard(targetId); + if (card != null) { + cards.add(card); + } + } + controller.putCardsOnTopOfLibrary(cards, game, source, false); + controller.shuffleLibrary(source, game); + return true; + } +} diff --git a/Mage.Sets/src/mage/cards/d/DiligentFarmhand.java b/Mage.Sets/src/mage/cards/d/DiligentFarmhand.java index d659549bcaf..374c3c905e1 100644 --- a/Mage.Sets/src/mage/cards/d/DiligentFarmhand.java +++ b/Mage.Sets/src/mage/cards/d/DiligentFarmhand.java @@ -9,7 +9,6 @@ import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.m.MuscleBurst; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Zone; @@ -19,13 +18,12 @@ import mage.target.common.TargetCardInLibrary; import java.util.UUID; /** - * * @author Plopman */ public final class DiligentFarmhand extends CardImpl { public DiligentFarmhand(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{G}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.DRUID); @@ -37,7 +35,7 @@ public final class DiligentFarmhand extends CardImpl { ability.addCost(new SacrificeSourceCost()); this.addAbility(ability); // If Diligent Farmhand is in a graveyard, effects from spells named Muscle Burst count it as a card named Muscle Burst. - this.addAbility(MuscleBurst.getCountAsAbility()); + this.addAbility(mage.cards.m.MuscleBurst.getCountAsAbility()); } public DiligentFarmhand(final DiligentFarmhand card) { @@ -48,4 +46,4 @@ public final class DiligentFarmhand extends CardImpl { public DiligentFarmhand copy() { return new DiligentFarmhand(this); } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/d/DimirSpybug.java b/Mage.Sets/src/mage/cards/d/DimirSpybug.java index 4a4e4662e17..3897226b2b5 100644 --- a/Mage.Sets/src/mage/cards/d/DimirSpybug.java +++ b/Mage.Sets/src/mage/cards/d/DimirSpybug.java @@ -4,12 +4,12 @@ import java.util.UUID; import mage.MageInt; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.effects.common.counter.AddCountersSourceEffect; -import mage.constants.SubType; import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.MenaceAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.SubType; import mage.constants.Zone; import mage.counters.CounterType; import mage.game.Game; @@ -67,7 +67,7 @@ class DimirSpybugTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.SURVEIL; + return event.getType() == GameEvent.EventType.SURVEILED; } @Override diff --git a/Mage.Sets/src/mage/cards/d/DireFleetDaredevil.java b/Mage.Sets/src/mage/cards/d/DireFleetDaredevil.java index 72fe39f0cae..f49e33e7050 100644 --- a/Mage.Sets/src/mage/cards/d/DireFleetDaredevil.java +++ b/Mage.Sets/src/mage/cards/d/DireFleetDaredevil.java @@ -1,4 +1,3 @@ - package mage.cards.d; import java.util.Objects; @@ -11,6 +10,7 @@ import mage.abilities.effects.AsThoughManaEffect; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.ReplacementEffectImpl; +import mage.abilities.effects.common.asthought.PlayFromNotOwnHandZoneTargetEffect; import mage.abilities.keyword.FirstStrikeAbility; import mage.cards.Card; import mage.cards.CardImpl; @@ -102,14 +102,14 @@ class DireFleetDaredevilEffect extends OneShotEffect { if (controller.moveCards(targetCard, Zone.EXILED, source, game)) { targetCard = game.getCard(targetCard.getId()); if (targetCard != null) { - ContinuousEffect effect = new DireFleetDaredevilPlayEffect(); - effect.setTargetPointer(new FixedTarget(targetCard.getId(), targetCard.getZoneChangeCounter(game))); + ContinuousEffect effect = new PlayFromNotOwnHandZoneTargetEffect(Zone.EXILED, Duration.EndOfTurn); + effect.setTargetPointer(new FixedTarget(targetCard, game)); game.addEffect(effect, source); effect = new DireFleetDaredevilSpendAnyManaEffect(); - effect.setTargetPointer(new FixedTarget(targetCard.getId(), targetCard.getZoneChangeCounter(game))); + effect.setTargetPointer(new FixedTarget(targetCard, game)); game.addEffect(effect, source); effect = new DireFleetDaredevilReplacementEffect(); - effect.setTargetPointer(new FixedTarget(targetCard.getId(), targetCard.getZoneChangeCounter(game))); + effect.setTargetPointer(new FixedTarget(targetCard, game)); game.addEffect(effect, source); } @@ -121,41 +121,6 @@ class DireFleetDaredevilEffect extends OneShotEffect { } } -class DireFleetDaredevilPlayEffect extends AsThoughEffectImpl { - - public DireFleetDaredevilPlayEffect() { - super(AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, Duration.EndOfTurn, Outcome.Benefit); - staticText = "You may cast that card this turn"; - } - - public DireFleetDaredevilPlayEffect(final DireFleetDaredevilPlayEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - return true; - } - - @Override - public DireFleetDaredevilPlayEffect copy() { - return new DireFleetDaredevilPlayEffect(this); - } - - @Override - public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) { - UUID targetId = getTargetPointer().getFirst(game, source); - if (targetId != null) { - return targetId.equals(objectId) - && source.isControlledBy(affectedControllerId); - } else { - // the target card has changed zone meanwhile, so the effect is no longer needed - discard(); - return false; - } - } -} - class DireFleetDaredevilSpendAnyManaEffect extends AsThoughEffectImpl implements AsThoughManaEffect { public DireFleetDaredevilSpendAnyManaEffect() { diff --git a/Mage.Sets/src/mage/cards/d/DiscoveryDispersal.java b/Mage.Sets/src/mage/cards/d/DiscoveryDispersal.java index 762421895e5..6e57cee6652 100644 --- a/Mage.Sets/src/mage/cards/d/DiscoveryDispersal.java +++ b/Mage.Sets/src/mage/cards/d/DiscoveryDispersal.java @@ -54,7 +54,7 @@ public final class DiscoveryDispersal extends SplitCard { // Dispersal // Each opponent returns a nonland permanent they control with the highest converted mana cost among permanents they control to its owner’s hand, then discards a card. - this.getLeftHalfCard().getSpellAbility().addEffect(new DispersalEffect()); + this.getRightHalfCard().getSpellAbility().addEffect(new DispersalEffect()); } public DiscoveryDispersal(final DiscoveryDispersal card) { diff --git a/Mage.Sets/src/mage/cards/d/DocentOfPerfection.java b/Mage.Sets/src/mage/cards/d/DocentOfPerfection.java index f138bce3e9b..46b698bb57a 100644 --- a/Mage.Sets/src/mage/cards/d/DocentOfPerfection.java +++ b/Mage.Sets/src/mage/cards/d/DocentOfPerfection.java @@ -2,6 +2,7 @@ package mage.cards.d; import java.util.UUID; + import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SpellCastControllerTriggeredAbility; @@ -13,7 +14,6 @@ import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.f.FinalIteration; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SubType; @@ -29,7 +29,6 @@ import mage.game.permanent.token.HumanWizardToken; import mage.players.Player; /** - * * @author fireshoes */ public final class DocentOfPerfection extends CardImpl { @@ -43,14 +42,14 @@ public final class DocentOfPerfection extends CardImpl { } public DocentOfPerfection(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{U}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}{U}"); this.subtype.add(SubType.INSECT); this.subtype.add(SubType.HORROR); this.power = new MageInt(5); this.toughness = new MageInt(4); this.transformable = true; - this.secondSideCardClazz = FinalIteration.class; + this.secondSideCardClazz = mage.cards.f.FinalIteration.class; // Flying this.addAbility(FlyingAbility.getInstance()); @@ -107,5 +106,4 @@ class DocentOfPerfectionEffect extends OneShotEffect { } return false; } -} - +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/d/DomriRade.java b/Mage.Sets/src/mage/cards/d/DomriRade.java index 43de8f9a5ae..b561ebf5541 100644 --- a/Mage.Sets/src/mage/cards/d/DomriRade.java +++ b/Mage.Sets/src/mage/cards/d/DomriRade.java @@ -5,7 +5,7 @@ import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.FightTargetsEffect; import mage.abilities.effects.common.GetEmblemEffect; @@ -37,7 +37,7 @@ public final class DomriRade extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.DOMRI); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3)); // +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. this.addAbility(new LoyaltyAbility(new DomriRadeEffect1(), 1)); diff --git a/Mage.Sets/src/mage/cards/d/DoomCannon.java b/Mage.Sets/src/mage/cards/d/DoomCannon.java index 7fb9aada5c1..3414f1ebe79 100644 --- a/Mage.Sets/src/mage/cards/d/DoomCannon.java +++ b/Mage.Sets/src/mage/cards/d/DoomCannon.java @@ -70,7 +70,7 @@ class DoomCannonFilter extends FilterControlledCreaturePermanent { @Override public boolean match(Permanent permanent, UUID sourceId, UUID playerId, Game game) { if (super.match(permanent, sourceId, playerId, game)) { - SubType subType = ChooseCreatureTypeEffect.getChoosenCreatureType(sourceId, game); + SubType subType = ChooseCreatureTypeEffect.getChosenCreatureType(sourceId, game); if (subType != null && permanent.hasSubtype(subType, game)) { return true; } diff --git a/Mage.Sets/src/mage/cards/d/DoorOfDestinies.java b/Mage.Sets/src/mage/cards/d/DoorOfDestinies.java index 5f196a12056..b7d72e91a18 100644 --- a/Mage.Sets/src/mage/cards/d/DoorOfDestinies.java +++ b/Mage.Sets/src/mage/cards/d/DoorOfDestinies.java @@ -71,7 +71,7 @@ class AddCounterAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { - SubType subType = ChooseCreatureTypeEffect.getChoosenCreatureType(getSourceId(), game); + SubType subType = ChooseCreatureTypeEffect.getChosenCreatureType(getSourceId(), game); if (subType != null) { Spell spell = game.getStack().getSpell(event.getTargetId()); if (spell != null diff --git a/Mage.Sets/src/mage/cards/d/DoubleHeader.java b/Mage.Sets/src/mage/cards/d/DoubleHeader.java new file mode 100644 index 00000000000..7a483fb2820 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DoubleHeader.java @@ -0,0 +1,94 @@ + +package mage.cards.d; + +import java.util.UUID; +import java.util.regex.Pattern; +import mage.MageInt; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.ReturnToHandTargetEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.SplitCard; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.SpellAbilityType; +import mage.filter.FilterPermanent; +import mage.filter.predicate.Predicate; +import mage.game.Game; +import mage.game.stack.Spell; +import mage.target.TargetPermanent; + +/** + * + * @author L_J + */ +public final class DoubleHeader extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent("permanent with a two-word name"); + + static { + filter.add(new DoubleHeaderPredicate()); + } + + public DoubleHeader(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{U}{U}"); + this.subtype.add(SubType.DRAKE); + + this.power = new MageInt(2); + this.toughness = new MageInt(3); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // When Double Header enters the battlefield, you may return target permanent with a two-word name to its owner’s hand. + Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnToHandTargetEffect(), true); + ability.addTarget(new TargetPermanent(filter)); + this.addAbility(ability); + } + + public DoubleHeader(final DoubleHeader card) { + super(card); + } + + @Override + public DoubleHeader copy() { + return new DoubleHeader(this); + } +} + +class DoubleHeaderPredicate implements Predicate { + + public DoubleHeaderPredicate() { + } + + @Override + public boolean apply(MageObject input, Game game) { + String name = input.getName(); + if (input instanceof SplitCard) { + return hasTwoWords(((SplitCard)input).getLeftHalfCard().getName()) || hasTwoWords(((SplitCard)input).getRightHalfCard().getName()); + } else if (input instanceof Spell && ((Spell) input).getSpellAbility().getSpellAbilityType() == SpellAbilityType.SPLIT_FUSED){ + SplitCard card = (SplitCard) ((Spell)input).getCard(); + return hasTwoWords(card.getLeftHalfCard().getName()) || hasTwoWords(card.getRightHalfCard().getName()); + } else { + if (name.contains(" // ")) { + String leftName = name.substring(0, name.indexOf(" // ")); + String rightName = name.substring(name.indexOf(" // ") + 4, name.length()); + return hasTwoWords(leftName) || hasTwoWords(rightName); + } else { + return hasTwoWords(name); + } + } + } + + private boolean hasTwoWords(String str) { + return Pattern.compile("\\s+").split(str).length == 2; + } + + @Override + public String toString() { + return ""; + } +} diff --git a/Mage.Sets/src/mage/cards/d/DovinBaan.java b/Mage.Sets/src/mage/cards/d/DovinBaan.java index 2ce9f267757..670251eca77 100644 --- a/Mage.Sets/src/mage/cards/d/DovinBaan.java +++ b/Mage.Sets/src/mage/cards/d/DovinBaan.java @@ -4,7 +4,7 @@ package mage.cards.d; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; import mage.abilities.effects.Effect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; @@ -35,7 +35,7 @@ public final class DovinBaan extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.DOVIN); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3)); // +1: Until your next turn, up to one target creature gets -3/-0 and its activated abilities can't be activated. Effect effect = new BoostTargetEffect(-3, 0, Duration.UntilYourNextTurn); diff --git a/Mage.Sets/src/mage/cards/d/DowsingDagger.java b/Mage.Sets/src/mage/cards/d/DowsingDagger.java index f2693caabe6..538bb409c39 100644 --- a/Mage.Sets/src/mage/cards/d/DowsingDagger.java +++ b/Mage.Sets/src/mage/cards/d/DowsingDagger.java @@ -2,6 +2,7 @@ package mage.cards.d; import java.util.UUID; + import mage.abilities.Ability; import mage.abilities.common.DealsDamageToAPlayerAttachedTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; @@ -15,7 +16,6 @@ import mage.abilities.keyword.TransformAbility; import mage.constants.SubType; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.l.LostVale; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; @@ -24,7 +24,6 @@ import mage.target.Target; import mage.target.common.TargetOpponent; /** - * * @author TheElk801 */ public final class DowsingDagger extends CardImpl { @@ -35,7 +34,7 @@ public final class DowsingDagger extends CardImpl { this.subtype.add(SubType.EQUIPMENT); this.transformable = true; - this.secondSideCardClazz = LostVale.class; + this.secondSideCardClazz = mage.cards.l.LostVale.class; // When Dowsing Dagger enters the battlefield, target opponent creates two 0/2 green Plant creature tokens with defender. Ability ability = new EntersBattlefieldTriggeredAbility(new CreateTokenTargetEffect(new DefenderPlantToken(), 2), false); @@ -62,4 +61,4 @@ public final class DowsingDagger extends CardImpl { public DowsingDagger copy() { return new DowsingDagger(this); } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/d/DrakeUmbra.java b/Mage.Sets/src/mage/cards/d/DrakeUmbra.java index 299d7b07373..8a124d093f0 100644 --- a/Mage.Sets/src/mage/cards/d/DrakeUmbra.java +++ b/Mage.Sets/src/mage/cards/d/DrakeUmbra.java @@ -2,6 +2,7 @@ package mage.cards.d; import java.util.UUID; + import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.AttachEffect; @@ -17,13 +18,12 @@ import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; /** - * * @author Loki */ public final class DrakeUmbra extends CardImpl { public DrakeUmbra(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{4}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{4}{U}"); this.subtype.add(SubType.AURA); @@ -33,9 +33,12 @@ public final class DrakeUmbra extends CardImpl { this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); Ability ability = new EnchantAbility(auraTarget.getTargetName()); this.addAbility(ability); + // Enchanted creature gets +3/+3 and has flying. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(3, 3, Duration.WhileOnBattlefield))); this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(FlyingAbility.getInstance(), AttachmentType.AURA))); + + // Totem armor this.addAbility(new TotemArmorAbility()); } diff --git a/Mage.Sets/src/mage/cards/d/DreamPillager.java b/Mage.Sets/src/mage/cards/d/DreamPillager.java index e0eefc81fe7..67869fe5110 100644 --- a/Mage.Sets/src/mage/cards/d/DreamPillager.java +++ b/Mage.Sets/src/mage/cards/d/DreamPillager.java @@ -1,4 +1,3 @@ - package mage.cards.d; import java.util.Set; @@ -7,21 +6,23 @@ import mage.MageInt; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.TriggeredAbilityImpl; -import mage.abilities.effects.AsThoughEffectImpl; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.asthought.PlayFromNotOwnHandZoneTargetEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.cards.Cards; +import mage.cards.CardsImpl; import mage.constants.*; import mage.game.Game; import mage.game.events.DamagedPlayerEvent; import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; import mage.players.Player; -import mage.target.targetpointer.FixedTarget; +import mage.target.targetpointer.FixedTargets; /** * @@ -30,7 +31,7 @@ import mage.target.targetpointer.FixedTarget; public final class DreamPillager extends CardImpl { public DreamPillager(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{5}{R}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{R}{R}"); this.subtype.add(SubType.DRAGON); this.power = new MageInt(4); this.toughness = new MageInt(4); @@ -114,13 +115,15 @@ class DreamPillagerEffect extends OneShotEffect { Set cards = controller.getLibrary().getTopCards(game, amount); if (!cards.isEmpty()) { controller.moveCards(cards, Zone.EXILED, source, game); + Cards canBeCast = new CardsImpl(); for (Card card : cards) { if (!card.isLand()) { - ContinuousEffect effect = new DreamPillagerCastFromExileEffect(); - effect.setTargetPointer(new FixedTarget(card.getId(), card.getZoneChangeCounter(game))); - game.addEffect(effect, source); + canBeCast.add(card); } } + ContinuousEffect effect = new PlayFromNotOwnHandZoneTargetEffect(Zone.EXILED, Duration.EndOfTurn); + effect.setTargetPointer(new FixedTargets(canBeCast, game)); + game.addEffect(effect, source); } return true; } @@ -129,31 +132,3 @@ class DreamPillagerEffect extends OneShotEffect { return false; } } - -class DreamPillagerCastFromExileEffect extends AsThoughEffectImpl { - - public DreamPillagerCastFromExileEffect() { - super(AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, Duration.EndOfTurn, Outcome.Benefit); - staticText = "You may play the card from exile"; - } - - public DreamPillagerCastFromExileEffect(final DreamPillagerCastFromExileEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - return true; - } - - @Override - public DreamPillagerCastFromExileEffect copy() { - return new DreamPillagerCastFromExileEffect(this); - } - - @Override - public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) { - return source.isControlledBy(affectedControllerId) - && objectId.equals(getTargetPointer().getFirst(game, source)); - } -} diff --git a/Mage.Sets/src/mage/cards/d/DuskwatchRecruiter.java b/Mage.Sets/src/mage/cards/d/DuskwatchRecruiter.java index c790d01d342..cd9f699c35f 100644 --- a/Mage.Sets/src/mage/cards/d/DuskwatchRecruiter.java +++ b/Mage.Sets/src/mage/cards/d/DuskwatchRecruiter.java @@ -2,6 +2,7 @@ package mage.cards.d; import java.util.UUID; + import mage.MageInt; import mage.abilities.TriggeredAbility; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; @@ -14,7 +15,6 @@ import mage.abilities.effects.common.TransformSourceEffect; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.k.KrallenhordeHowler; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.TargetController; @@ -35,7 +35,7 @@ public final class DuskwatchRecruiter extends CardImpl { this.subtype.add(SubType.WEREWOLF); this.transformable = true; - this.secondSideCardClazz = KrallenhordeHowler.class; + this.secondSideCardClazz = mage.cards.k.KrallenhordeHowler.class; this.power = new MageInt(2); this.toughness = new MageInt(2); @@ -61,4 +61,4 @@ public final class DuskwatchRecruiter extends CardImpl { return new DuskwatchRecruiter(this); } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/e/EelUmbra.java b/Mage.Sets/src/mage/cards/e/EelUmbra.java index d0d69cce3d4..7438c420299 100644 --- a/Mage.Sets/src/mage/cards/e/EelUmbra.java +++ b/Mage.Sets/src/mage/cards/e/EelUmbra.java @@ -2,6 +2,7 @@ package mage.cards.e; import java.util.UUID; + import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.AttachEffect; @@ -20,25 +21,28 @@ import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; /** - * * @author Loki */ public final class EelUmbra extends CardImpl { public EelUmbra(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{1}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{U}"); this.subtype.add(SubType.AURA); - + // Flash this.addAbility(FlashAbility.getInstance()); + // 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/+1. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(1, 1, Duration.WhileOnBattlefield))); + + // Totem armor this.addAbility(new TotemArmorAbility()); } diff --git a/Mage.Sets/src/mage/cards/e/ElandUmbra.java b/Mage.Sets/src/mage/cards/e/ElandUmbra.java index 86a2c8be49d..1cbee9cbfa3 100644 --- a/Mage.Sets/src/mage/cards/e/ElandUmbra.java +++ b/Mage.Sets/src/mage/cards/e/ElandUmbra.java @@ -2,6 +2,7 @@ package mage.cards.e; import java.util.UUID; + import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.AttachEffect; @@ -19,24 +20,25 @@ import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; /** - * * @author Loki */ public final class ElandUmbra extends CardImpl { public ElandUmbra(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{1}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}"); this.subtype.add(SubType.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 +0/+4. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(0, 4, Duration.WhileOnBattlefield))); + + // Totem armor this.addAbility(new TotemArmorAbility()); } diff --git a/Mage.Sets/src/mage/cards/e/ElbrusTheBindingBlade.java b/Mage.Sets/src/mage/cards/e/ElbrusTheBindingBlade.java index cd5edc770a9..d949dd182a0 100644 --- a/Mage.Sets/src/mage/cards/e/ElbrusTheBindingBlade.java +++ b/Mage.Sets/src/mage/cards/e/ElbrusTheBindingBlade.java @@ -2,6 +2,7 @@ package mage.cards.e; import java.util.UUID; + import mage.abilities.Ability; import mage.abilities.common.DealsDamageToAPlayerAttachedTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; @@ -12,7 +13,6 @@ import mage.abilities.keyword.EquipAbility; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.w.WithengarUnbound; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Outcome; @@ -22,25 +22,24 @@ import mage.game.Game; import mage.game.permanent.Permanent; /** - * * @author BetaSteward */ public final class ElbrusTheBindingBlade extends CardImpl { public ElbrusTheBindingBlade(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{7}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{7}"); addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.EQUIPMENT); this.transformable = true; - this.secondSideCardClazz = WithengarUnbound.class; + this.secondSideCardClazz = mage.cards.w.WithengarUnbound.class; this.addAbility(new TransformAbility()); // Equipped creature gets +1/+0. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEquippedEffect(1, 0))); // When equipped creature deals combat damage to a player, unattach Elbrus, the Binding Blade, then transform it. - this.addAbility(new DealsDamageToAPlayerAttachedTriggeredAbility(new ElbrusTheBindingBladeEffect(), "equipped", true)); - // Equip {1} + this.addAbility(new DealsDamageToAPlayerAttachedTriggeredAbility(new ElbrusTheBindingBladeEffect(), "equipped", true)); + // Equip {1} this.addAbility(new EquipAbility(Outcome.AddAbility, new GenericManaCost(1))); } diff --git a/Mage.Sets/src/mage/cards/e/ElkinLair.java b/Mage.Sets/src/mage/cards/e/ElkinLair.java index 41b7287efdb..8539e15b47e 100644 --- a/Mage.Sets/src/mage/cards/e/ElkinLair.java +++ b/Mage.Sets/src/mage/cards/e/ElkinLair.java @@ -1,4 +1,3 @@ - package mage.cards.e; import java.util.Set; @@ -10,6 +9,7 @@ import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbil import mage.abilities.effects.AsThoughEffectImpl; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.asthought.PlayFromNotOwnHandZoneTargetEffect; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -20,9 +20,9 @@ import mage.constants.Outcome; import mage.constants.SuperType; import mage.constants.TargetController; import mage.constants.Zone; +import mage.filter.FilterCard; import mage.game.Game; import mage.game.permanent.Permanent; -import mage.filter.FilterCard; import mage.players.Player; import mage.target.targetpointer.FixedTarget; import mage.util.RandomUtil; @@ -81,8 +81,8 @@ class ElkinLairUpkeepEffect extends OneShotEffect { String exileName = sourcePermanent.getIdName() + " 2) { + int cardsFound = 0; + for (Card exiledCard : game.getExile().getAllCards(game)) { + if (exiledCard.getCounters(game).getCount(CounterType.HIT) >= 1 && exiledCard.getOwnerId().equals(player.getId())) { + cardsFound++; + } + } + if (cardsFound > 2) { player.lost(game); } return new ShuffleIntoLibrarySourceEffect().apply(game, source); diff --git a/Mage.Sets/src/mage/cards/e/ExpansionExplosion.java b/Mage.Sets/src/mage/cards/e/ExpansionExplosion.java index 4a8bc361fbe..88cd4ef9f99 100644 --- a/Mage.Sets/src/mage/cards/e/ExpansionExplosion.java +++ b/Mage.Sets/src/mage/cards/e/ExpansionExplosion.java @@ -2,6 +2,7 @@ package mage.cards.e; import java.util.UUID; import mage.abilities.Ability; +import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CopyTargetSpellEffect; @@ -40,7 +41,7 @@ public final class ExpansionExplosion extends SplitCard { // Expansion // Copy target instant or sorcery spell with converted mana cost 4 or less. You may choose new targets for the copy. this.getLeftHalfCard().getSpellAbility().addEffect(new CopyTargetSpellEffect()); - this.getSpellAbility().addTarget(new TargetSpell(filter)); + this.getLeftHalfCard().getSpellAbility().addTarget(new TargetSpell(filter)); // Explosion // Explosion deals X damage to any target. Target player draws X cards. @@ -79,7 +80,7 @@ class ExplosionEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { int xValue = source.getManaCostsToPay().getX(); - Effect effect = new DamageTargetEffect(xValue); + Effect effect = new DamageTargetEffect(new StaticValue(xValue), true, "", true); effect.setTargetPointer(new FixedTarget(source.getFirstTarget(), game)); effect.apply(game, source); Player player = game.getPlayer(source.getTargets().get(1).getFirstTarget()); diff --git a/Mage.Sets/src/mage/cards/e/ExperimentalFrenzy.java b/Mage.Sets/src/mage/cards/e/ExperimentalFrenzy.java new file mode 100644 index 00000000000..50dcb6b5a45 --- /dev/null +++ b/Mage.Sets/src/mage/cards/e/ExperimentalFrenzy.java @@ -0,0 +1,133 @@ +package mage.cards.e; + +import java.util.UUID; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; +import mage.abilities.effects.common.DestroySourceEffect; +import mage.abilities.effects.common.continuous.PlayTheTopCardEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +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.events.GameEvent; +import mage.players.Player; + +/** + * + * @author TheElk801 + */ +public final class ExperimentalFrenzy extends CardImpl { + + public ExperimentalFrenzy(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{R}"); + + // You may look at the top card of your library any time. + this.addAbility(new SimpleStaticAbility( + Zone.BATTLEFIELD, new ExperimentalFrenzyTopCardEffect() + )); + + // You may play the top card of your library. + this.addAbility(new SimpleStaticAbility( + Zone.BATTLEFIELD, new PlayTheTopCardEffect() + )); + + // You can't play cards from your hand. + this.addAbility(new SimpleStaticAbility( + Zone.BATTLEFIELD, new ExperimentalFrenzyRestrictionEffect() + )); + + // {3}{R}: Destroy Experimental Frenzy. + this.addAbility(new SimpleActivatedAbility( + new DestroySourceEffect(), new ManaCostsImpl("{3}{R}") + )); + } + + public ExperimentalFrenzy(final ExperimentalFrenzy card) { + super(card); + } + + @Override + public ExperimentalFrenzy copy() { + return new ExperimentalFrenzy(this); + } +} + +class ExperimentalFrenzyTopCardEffect extends ContinuousEffectImpl { + + public ExperimentalFrenzyTopCardEffect() { + super(Duration.WhileOnBattlefield, Layer.PlayerEffects, SubLayer.NA, Outcome.Benefit); + staticText = "You may look at the top card of your library any time."; + } + + public ExperimentalFrenzyTopCardEffect(final ExperimentalFrenzyTopCardEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller == null) { + return true; + } + Card topCard = controller.getLibrary().getFromTop(game); + if (topCard == null) { + return true; + } + MageObject obj = source.getSourceObject(game); + if (obj == null) { + return true; + } + controller.lookAtCards("Top card of " + obj.getIdName() + " controller's library", topCard, game); + return true; + } + + @Override + public ExperimentalFrenzyTopCardEffect copy() { + return new ExperimentalFrenzyTopCardEffect(this); + } +} + +class ExperimentalFrenzyRestrictionEffect extends ContinuousRuleModifyingEffectImpl { + + public ExperimentalFrenzyRestrictionEffect() { + super(Duration.WhileOnBattlefield, Outcome.Detriment); + this.staticText = "You can't play cards from your hand"; + } + + public ExperimentalFrenzyRestrictionEffect(final ExperimentalFrenzyRestrictionEffect effect) { + super(effect); + } + + @Override + public ExperimentalFrenzyRestrictionEffect copy() { + return new ExperimentalFrenzyRestrictionEffect(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 + || event.getType() == GameEvent.EventType.CAST_SPELL; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + return event.getPlayerId().equals(source.getControllerId()) + && game.getState().getZone(event.getSourceId()) == Zone.HAND; + } +} diff --git a/Mage.Sets/src/mage/cards/f/FeralRoar.java b/Mage.Sets/src/mage/cards/f/FeralRoar.java new file mode 100644 index 00000000000..46598d12af4 --- /dev/null +++ b/Mage.Sets/src/mage/cards/f/FeralRoar.java @@ -0,0 +1,33 @@ +package mage.cards.f; + +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * @author JayDi85 + */ +public final class FeralRoar extends CardImpl { + + public FeralRoar(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{G}"); + + // Target creature gets +4/+4 until end of turn. + this.getSpellAbility().addEffect(new BoostTargetEffect(4, 4, Duration.EndOfTurn)); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + } + + public FeralRoar(final FeralRoar card) { + super(card); + } + + @Override + public FeralRoar copy() { + return new FeralRoar(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/f/FirstComeFirstServed.java b/Mage.Sets/src/mage/cards/f/FirstComeFirstServed.java new file mode 100644 index 00000000000..3f3fa1c97cd --- /dev/null +++ b/Mage.Sets/src/mage/cards/f/FirstComeFirstServed.java @@ -0,0 +1,74 @@ + +package mage.cards.f; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.UUID; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.continuous.GainAbilityAllEffect; +import mage.abilities.keyword.FirstStrikeAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Zone; +import mage.filter.common.FilterAttackingOrBlockingCreature; +import mage.filter.predicate.Predicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.game.permanent.PermanentCard; + +/** + * + * @author L_J + */ +public final class FirstComeFirstServed extends CardImpl { + + private static final FilterAttackingOrBlockingCreature filter = new FilterAttackingOrBlockingCreature("Each attacking or blocking creature with the lowest collector number among attacking or blocking creatures"); + + static { + filter.add(new FirstComeFirstServedPredicate()); + } + + public FirstComeFirstServed(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{1}{W}"); + + // Each attacking or blocking creature with the lowest collector number among attacking or blocking creatures has first strike. + GainAbilityAllEffect gainEffect = new GainAbilityAllEffect(FirstStrikeAbility.getInstance(), Duration.WhileOnBattlefield, filter, false); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, gainEffect)); + } + + public FirstComeFirstServed(final FirstComeFirstServed card) { + super(card); + } + + @Override + public FirstComeFirstServed copy() { + return new FirstComeFirstServed(this); + } +} + +class FirstComeFirstServedPredicate implements Predicate { + + @Override + public boolean apply(Permanent input, Game game) { + if (input instanceof PermanentCard) { + int lowestNumber = Integer.MAX_VALUE; + for (Permanent permanent : game.getBattlefield().getAllActivePermanents(new FilterAttackingOrBlockingCreature(), game)) { + int number = parseCardNumber(permanent); + if (lowestNumber > number) { + lowestNumber = number; + } + } + return parseCardNumber(input) == lowestNumber; + } + return false; + } + + public int parseCardNumber(Permanent input) { + String str = input.getCardNumber(); + Matcher matcher = Pattern.compile("\\d+").matcher(str); + matcher.find(); + return Integer.valueOf(matcher.group()); + } +} diff --git a/Mage.Sets/src/mage/cards/f/FlockOfRabidSheep.java b/Mage.Sets/src/mage/cards/f/FlockOfRabidSheep.java new file mode 100644 index 00000000000..79ac3e5e977 --- /dev/null +++ b/Mage.Sets/src/mage/cards/f/FlockOfRabidSheep.java @@ -0,0 +1,71 @@ + +package mage.cards.f; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.game.Game; +import mage.game.permanent.token.RabidSheepToken; +import mage.players.Player; + +/** + * + * @author L_J + */ +public class FlockOfRabidSheep extends CardImpl { + + public FlockOfRabidSheep(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{G}{G}"); + + // Flip X coins. For each flip you win, create a 2/2 green Sheep creature token named Rabid Sheep. + this.getSpellAbility().addEffect(new FlockOfRabidSheepEffect()); + } + + public FlockOfRabidSheep(final FlockOfRabidSheep card) { + super(card); + } + + @Override + public FlockOfRabidSheep copy() { + return new FlockOfRabidSheep(this); + } +} + +class FlockOfRabidSheepEffect extends OneShotEffect { + + public FlockOfRabidSheepEffect() { + super(Outcome.LoseLife); + this.staticText = "Flip X coins. For each flip you win, create a 2/2 green Sheep creature token named Rabid Sheep"; + } + + public FlockOfRabidSheepEffect(final FlockOfRabidSheepEffect effect) { + super(effect); + } + + @Override + public FlockOfRabidSheepEffect copy() { + return new FlockOfRabidSheepEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + int repeat = source.getManaCostsToPay().getX(); + int wonCount = 0; + for (int i = 1; i <= repeat; i++) { + if (controller.flipCoin(game)) { + wonCount++; + } + } + new CreateTokenEffect(new RabidSheepToken(), wonCount).apply(game, source); + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/f/ForceProjection.java b/Mage.Sets/src/mage/cards/f/ForceProjection.java index a29ec11982c..6770afe6c72 100644 --- a/Mage.Sets/src/mage/cards/f/ForceProjection.java +++ b/Mage.Sets/src/mage/cards/f/ForceProjection.java @@ -1,7 +1,6 @@ package mage.cards.f; import java.util.UUID; - import mage.abilities.Ability; import mage.abilities.TriggeredAbility; import mage.abilities.common.BecomesTargetTriggeredAbility; @@ -15,13 +14,11 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SubType; -import mage.constants.Zone; import mage.filter.FilterSpell; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetControlledCreaturePermanent; -import mage.target.common.TargetCreaturePermanent; import mage.target.targetpointer.FixedTarget; /** @@ -32,7 +29,6 @@ public final class ForceProjection extends CardImpl { public ForceProjection(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{U}{U}"); - // Create a token that is a copy of target creature you control except that it is an Illusion in addition to its other types and gains "When this creature becomes the target of a spell, sacrifice it." this.getSpellAbility().addEffect(new ForceProjectionEffect()); @@ -56,8 +52,8 @@ class ForceProjectionEffect extends OneShotEffect { public ForceProjectionEffect() { super(Outcome.Copy); - this.staticText = "Create a token that is a copy of target creature you control except that it is an Illusion " + - "in addition to its other types and gains \"When this creature becomes the target of a spell, sacrifice it.\""; + this.staticText = "Create a token that is a copy of target creature you control except that it is an Illusion " + + "in addition to its other types and gains \"When this creature becomes the target of a spell, sacrifice it.\""; } public ForceProjectionEffect(final ForceProjectionEffect effect) { diff --git a/Mage.Sets/src/mage/cards/f/ForerunnerOfTheEmpire.java b/Mage.Sets/src/mage/cards/f/ForerunnerOfTheEmpire.java index a2789bf5555..a33e5bfc1bb 100644 --- a/Mage.Sets/src/mage/cards/f/ForerunnerOfTheEmpire.java +++ b/Mage.Sets/src/mage/cards/f/ForerunnerOfTheEmpire.java @@ -1,23 +1,26 @@ package mage.cards.f; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.common.CreatureEntersBattlefieldTriggeredAbility; +import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.effects.common.DamageAllEffect; import mage.abilities.effects.common.search.SearchLibraryPutOnLibraryEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.TargetController; +import mage.constants.Zone; import mage.filter.common.FilterBySubtypeCard; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.permanent.ControllerPredicate; import mage.target.common.TargetCardInLibrary; +import java.util.UUID; + /** - * * @author JayDi85 */ public final class ForerunnerOfTheEmpire extends CardImpl { @@ -49,12 +52,11 @@ public final class ForerunnerOfTheEmpire extends CardImpl { ); // Whenever a Dinosaur enters the battlefield under your control, you may have Forerunner of the Empire deal 1 damage to each creature. - Ability ability = new CreatureEntersBattlefieldTriggeredAbility( + Ability ability = new EntersBattlefieldControlledTriggeredAbility( Zone.BATTLEFIELD, new DamageAllEffect(1, new FilterCreaturePermanent()).setText("have {this} deal 1 damage to each creature"), filterAnyDinosaur, - true, - false); + true); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/f/FormOfTheSquirrel.java b/Mage.Sets/src/mage/cards/f/FormOfTheSquirrel.java new file mode 100644 index 00000000000..f41bb741d90 --- /dev/null +++ b/Mage.Sets/src/mage/cards/f/FormOfTheSquirrel.java @@ -0,0 +1,122 @@ + +package mage.cards.f; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.AsEntersBattlefieldAbility; +import mage.abilities.common.LeavesBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.ContinuousEffect; +import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.LoseGameTargetPlayerEffect; +import mage.abilities.effects.common.combat.CantAttackYouAllEffect; +import mage.abilities.effects.common.continuous.GainAbilityControllerEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.ShroudAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.token.SquirrelToken; +import mage.players.Player; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author L_J + */ +public final class FormOfTheSquirrel extends CardImpl { + + public FormOfTheSquirrel(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{G}"); + + // As Form of the Squirrel enters the battlefield, create a 1/1 green Squirrel creature token. You lose the game when that creature leaves the battlefield. + this.addAbility(new AsEntersBattlefieldAbility(new FormOfTheSquirrelCreateTokenEffect())); + + // Creatures can't attack you. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackYouAllEffect(Duration.WhileOnBattlefield))); + + // You have shroud. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityControllerEffect(ShroudAbility.getInstance()))); + + // You can't cast spells. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new FormOfTheSquirrelCantCastEffect())); + } + + public FormOfTheSquirrel(final FormOfTheSquirrel card) { + super(card); + } + + @Override + public FormOfTheSquirrel copy() { + return new FormOfTheSquirrel(this); + } +} + +class FormOfTheSquirrelCreateTokenEffect extends OneShotEffect { + + public FormOfTheSquirrelCreateTokenEffect() { + super(Outcome.PutCreatureInPlay); + staticText = "create a 1/1 green Squirrel creature token. You lose the game when that creature leaves the battlefield"; + } + + public FormOfTheSquirrelCreateTokenEffect(final FormOfTheSquirrelCreateTokenEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Player sourceController = game.getPlayer(source.getControllerId()); + if (sourceController != null) { + CreateTokenEffect effect = new CreateTokenEffect(new SquirrelToken()); + effect.apply(game, source); + game.getState().setValue(source.getSourceId() + "_token", effect.getLastAddedTokenIds()); + for (UUID addedTokenId : effect.getLastAddedTokenIds()) { + Effect loseGameEffect = new LoseGameTargetPlayerEffect(); + loseGameEffect.setTargetPointer(new FixedTarget(sourceController.getId(), game)); + LeavesBattlefieldTriggeredAbility triggerAbility = new LeavesBattlefieldTriggeredAbility(loseGameEffect, false); + ContinuousEffect continuousEffect = new GainAbilityTargetEffect(triggerAbility, Duration.WhileOnBattlefield); + continuousEffect.setTargetPointer(new FixedTarget(addedTokenId, game)); + game.addEffect(continuousEffect, source); + } + return true; + } + return false; + } + + @Override + public FormOfTheSquirrelCreateTokenEffect copy() { + return new FormOfTheSquirrelCreateTokenEffect(this); + } +} + +class FormOfTheSquirrelCantCastEffect extends ContinuousRuleModifyingEffectImpl { + + public FormOfTheSquirrelCantCastEffect() { + super(Duration.WhileOnBattlefield, Outcome.Detriment); + staticText = "You can't cast spells"; + } + + public FormOfTheSquirrelCantCastEffect(final FormOfTheSquirrelCantCastEffect effect) { + super(effect); + } + + @Override + public FormOfTheSquirrelCantCastEffect copy() { + return new FormOfTheSquirrelCantCastEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + return event.getType() == GameEvent.EventType.CAST_SPELL && event.getPlayerId().equals(source.getControllerId()); + } +} diff --git a/Mage.Sets/src/mage/cards/f/FreeForAll.java b/Mage.Sets/src/mage/cards/f/FreeForAll.java new file mode 100644 index 00000000000..631cc6bcd9f --- /dev/null +++ b/Mage.Sets/src/mage/cards/f/FreeForAll.java @@ -0,0 +1,144 @@ + +package mage.cards.f; + +import java.util.List; +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.LeavesBattlefieldTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.Cards; +import mage.cards.CardsImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.game.ExileZone; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; + +/** + * + * @author L_J + */ +public final class FreeForAll extends CardImpl { + + public FreeForAll(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{3}{U}"); + + // When Free-for-All enters the battlefield, exile all creatures face down. + this.addAbility(new EntersBattlefieldTriggeredAbility(new FreeForAllExileAllEffect())); + + // At the beginning of each player's upkeep, that player chooses a card exiled with Free-for-All at random and puts it onto the battlefield. + this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new FreeForAllReturnFromExileEffect(), TargetController.ANY, false, true)); + + // When Free-for-All leaves the battlefield, put all cards exiled with it into their owners' graveyards. + this.addAbility(new LeavesBattlefieldTriggeredAbility(new FreeForAllLeavesBattlefieldEffect(), false)); + } + + public FreeForAll(final FreeForAll card) { + super(card); + } + + @Override + public FreeForAll copy() { + return new FreeForAll(this); + } +} + +class FreeForAllExileAllEffect extends OneShotEffect { + + public FreeForAllExileAllEffect() { + super(Outcome.Exile); + staticText = "exile all creatures face down"; + } + + public FreeForAllExileAllEffect(final FreeForAllExileAllEffect effect) { + super(effect); + } + + @Override + public FreeForAllExileAllEffect copy() { + return new FreeForAllExileAllEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + List permanents = game.getBattlefield().getActivePermanents(new FilterCreaturePermanent(), source.getControllerId(), source.getSourceId(), game); + for (Permanent permanent : permanents) { + Card card = game.getCard(permanent.getId()); + permanent.moveToExile(source.getSourceId(), "Free-for-All", source.getSourceId(), game); + if (card != null) { + card.setFaceDown(true, game); + } + } + return true; + } +} + +class FreeForAllReturnFromExileEffect extends OneShotEffect { + + public FreeForAllReturnFromExileEffect() { + super(Outcome.PutCardInPlay); + staticText = "that player chooses a card exiled with Free-for-All at random and puts it onto the battlefield"; + } + + public FreeForAllReturnFromExileEffect(final FreeForAllReturnFromExileEffect effect) { + super(effect); + } + + @Override + public FreeForAllReturnFromExileEffect copy() { + return new FreeForAllReturnFromExileEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(targetPointer.getFirst(game, source)); + if (player != null) { + ExileZone exZone = game.getExile().getExileZone(source.getSourceId()); + if (exZone != null) { + Cards exiledCards = new CardsImpl(exZone.getCards(game)); + return player.moveCards(exiledCards.getRandom(game), Zone.BATTLEFIELD, source, game); + } + return true; + } + return false; + } +} + +class FreeForAllLeavesBattlefieldEffect extends OneShotEffect { + + public FreeForAllLeavesBattlefieldEffect() { + super(Outcome.Detriment); + this.staticText = "put all cards exiled with it into their owners' graveyards"; + } + + public FreeForAllLeavesBattlefieldEffect(final FreeForAllLeavesBattlefieldEffect effect) { + super(effect); + } + + @Override + public FreeForAllLeavesBattlefieldEffect copy() { + return new FreeForAllLeavesBattlefieldEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + ExileZone exZone = game.getExile().getExileZone(source.getSourceId()); + if (exZone != null) { + return controller.moveCards(exZone.getCards(game), Zone.GRAVEYARD, source, game, false, false, true, null); + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/f/FreeRangeChicken.java b/Mage.Sets/src/mage/cards/f/FreeRangeChicken.java new file mode 100644 index 00000000000..47310ccc4b2 --- /dev/null +++ b/Mage.Sets/src/mage/cards/f/FreeRangeChicken.java @@ -0,0 +1,135 @@ + +package mage.cards.f; + +import java.util.HashMap; +import java.util.Map; +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.OneShotEffect; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.constants.WatcherScope; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.watchers.Watcher; + +/** + * + * @author L_J + */ +public final class FreeRangeChicken extends CardImpl { + + public FreeRangeChicken(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}"); + this.subtype.add(SubType.CHICKEN); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // {1}{G}: Roll two six-sided dice. If both results are the same, Free-Range Chicken gets +X/+X until end of turn, where X is that result. If the total of those results is equal to any other total you have rolled this turn for Free-Range Chicken, sacrifice it. (For example, if you roll two 3s, Free-Range Chicken gets +3/+3. If you roll a total of 6 for Free-Range Chicken later that turn, sacrifice it.) + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new FreeRangeChickenEffect(), new ManaCostsImpl("{1}{G}")), new FreeRangeChickenWatcher()); + } + + public FreeRangeChicken(final FreeRangeChicken card) { + super(card); + } + + @Override + public FreeRangeChicken copy() { + return new FreeRangeChicken(this); + } +} + +class FreeRangeChickenEffect extends OneShotEffect { + + public FreeRangeChickenEffect() { + super(Outcome.BoostCreature); + this.staticText = "Roll two six-sided dice. If both results are the same, Free-Range Chicken gets +X/+X until end of turn, where X is that result. If the total of those results is equal to any other total you have rolled this turn for Free-Range Chicken, sacrifice it"; + } + + public FreeRangeChickenEffect(final FreeRangeChickenEffect effect) { + super(effect); + } + + @Override + public FreeRangeChickenEffect copy() { + return new FreeRangeChickenEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + int firstRoll = controller.rollDice(game, 6); + int secondRoll = controller.rollDice(game, 6); + if (firstRoll == secondRoll) { + game.addEffect(new BoostSourceEffect(firstRoll, firstRoll, Duration.EndOfTurn), source); + } + FreeRangeChickenWatcher watcher = (FreeRangeChickenWatcher) game.getState().getWatchers().get(FreeRangeChickenWatcher.class.getSimpleName()); + if (watcher != null) { + int totalRoll = firstRoll + secondRoll; + Permanent sourcePermanent = game.getPermanent(source.getSourceId()); + if (sourcePermanent != null) { + if (watcher.rolledThisTurn(sourcePermanent.getId(), totalRoll)) { + sourcePermanent.sacrifice(source.getSourceId(), game); + } else { + watcher.addRoll(sourcePermanent.getId(), totalRoll); + } + } + } + return true; + } + return false; + } +} + +class FreeRangeChickenWatcher extends Watcher { + + private final Map totalRolls = new HashMap<>(); + + public FreeRangeChickenWatcher() { + super(FreeRangeChickenWatcher.class.getSimpleName(), WatcherScope.GAME); + } + + public FreeRangeChickenWatcher(final FreeRangeChickenWatcher watcher) { + super(watcher); + for (Map.Entry entry : watcher.totalRolls.entrySet()) { + this.totalRolls.put(entry.getKey(), entry.getValue()); + } + } + + @Override + public void watch(GameEvent event, Game game) { + } + + @Override + public void reset() { + totalRolls.clear(); + } + + @Override + public FreeRangeChickenWatcher copy() { + return new FreeRangeChickenWatcher(this); + } + + public void addRoll(UUID sourceId, int roll) { + totalRolls.put(sourceId, roll); + } + + public boolean rolledThisTurn(UUID sourceId, int roll) { + if (totalRolls.get(sourceId) != null) { + return totalRolls.get(sourceId) == roll; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/f/FreyaliseLlanowarsFury.java b/Mage.Sets/src/mage/cards/f/FreyaliseLlanowarsFury.java index 068d053d121..63b81378fcf 100644 --- a/Mage.Sets/src/mage/cards/f/FreyaliseLlanowarsFury.java +++ b/Mage.Sets/src/mage/cards/f/FreyaliseLlanowarsFury.java @@ -4,7 +4,7 @@ package mage.cards.f; import mage.ObjectColor; import mage.abilities.LoyaltyAbility; import mage.abilities.common.CanBeYourCommanderAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.DestroyTargetEffect; @@ -39,7 +39,7 @@ public final class FreyaliseLlanowarsFury extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.FREYALISE); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3)); // +2: Create a 1/1 green Elf Druid creature token with "{T}: Add {G}." this.addAbility(new LoyaltyAbility(new CreateTokenEffect(new FreyaliseLlanowarsFuryToken()), 2)); diff --git a/Mage.Sets/src/mage/cards/g/GarrukApexPredator.java b/Mage.Sets/src/mage/cards/g/GarrukApexPredator.java index a3e536d6600..58e8d5284b5 100644 --- a/Mage.Sets/src/mage/cards/g/GarrukApexPredator.java +++ b/Mage.Sets/src/mage/cards/g/GarrukApexPredator.java @@ -4,7 +4,7 @@ package mage.cards.g; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateTokenEffect; @@ -43,7 +43,7 @@ public final class GarrukApexPredator extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.GARRUK); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(5)); // +1: Destroy another target planeswalker. LoyaltyAbility ability = new LoyaltyAbility(new DestroyTargetEffect(), 1); diff --git a/Mage.Sets/src/mage/cards/g/GarrukCallerOfBeasts.java b/Mage.Sets/src/mage/cards/g/GarrukCallerOfBeasts.java index d206045a730..501ee354628 100644 --- a/Mage.Sets/src/mage/cards/g/GarrukCallerOfBeasts.java +++ b/Mage.Sets/src/mage/cards/g/GarrukCallerOfBeasts.java @@ -4,7 +4,7 @@ package mage.cards.g; import java.util.UUID; import mage.ObjectColor; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.common.GetEmblemEffect; import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.abilities.effects.common.RevealLibraryPutIntoHandEffect; @@ -35,7 +35,7 @@ public final class GarrukCallerOfBeasts extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.GARRUK); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(4)); // +1: Reveal the top 5 cards of your library. Put all creature cards revealed this way into your hand and the rest on the bottom of your library in any order. this.addAbility(new LoyaltyAbility(new RevealLibraryPutIntoHandEffect(5, new FilterCreatureCard("creature cards"), Zone.LIBRARY), 1)); diff --git a/Mage.Sets/src/mage/cards/g/GarrukPrimalHunter.java b/Mage.Sets/src/mage/cards/g/GarrukPrimalHunter.java index 7b3409d9373..680b42dc5cd 100644 --- a/Mage.Sets/src/mage/cards/g/GarrukPrimalHunter.java +++ b/Mage.Sets/src/mage/cards/g/GarrukPrimalHunter.java @@ -4,7 +4,7 @@ package mage.cards.g; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateTokenEffect; @@ -36,7 +36,7 @@ public final class GarrukPrimalHunter extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.GARRUK); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3)); // +1: Create a 3/3 green Beast creature token. this.addAbility(new LoyaltyAbility(new CreateTokenEffect(new BeastToken()), 1)); diff --git a/Mage.Sets/src/mage/cards/g/GarrukRelentless.java b/Mage.Sets/src/mage/cards/g/GarrukRelentless.java index 3041ebace1b..53c06b35184 100644 --- a/Mage.Sets/src/mage/cards/g/GarrukRelentless.java +++ b/Mage.Sets/src/mage/cards/g/GarrukRelentless.java @@ -1,48 +1,44 @@ package mage.cards.g; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.TriggeredAbilityImpl; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.StateTriggeredAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.TransformSourceEffect; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.SubType; -import mage.constants.Outcome; -import mage.constants.SuperType; -import mage.constants.Zone; +import mage.constants.*; import mage.counters.CounterType; 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.WolfToken; import mage.target.common.TargetCreaturePermanent; +import java.util.UUID; + /** * @author nantuko */ public final class GarrukRelentless extends CardImpl { public GarrukRelentless(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.PLANESWALKER},"{3}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{3}{G}"); this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.GARRUK); this.transformable = true; this.secondSideCardClazz = GarrukTheVeilCursed.class; - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3)); // When Garruk Relentless has two or fewer loyalty counters on him, transform him. this.addAbility(new TransformAbility()); - this.addAbility(new GarrukRelentlessTriggeredAbility()); + this.addAbility(new GarrukRelentlessStateTrigger()); // 0: Garruk Relentless deals 3 damage to target creature. That creature deals damage equal to its power to him LoyaltyAbility ability1 = new LoyaltyAbility(new GarrukRelentlessDamageEffect(), 0); @@ -64,40 +60,30 @@ public final class GarrukRelentless extends CardImpl { } } -class GarrukRelentlessTriggeredAbility extends TriggeredAbilityImpl { +class GarrukRelentlessStateTrigger extends StateTriggeredAbility { - public GarrukRelentlessTriggeredAbility() { - super(Zone.BATTLEFIELD, new TransformSourceEffect(true), false); + public GarrukRelentlessStateTrigger() { + super(Zone.BATTLEFIELD, new TransformSourceEffect(true)); } - public GarrukRelentlessTriggeredAbility(GarrukRelentlessTriggeredAbility ability) { + public GarrukRelentlessStateTrigger(final GarrukRelentlessStateTrigger ability) { super(ability); } @Override - public GarrukRelentlessTriggeredAbility copy() { - return new GarrukRelentlessTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == EventType.DAMAGED_PLANESWALKER; + public GarrukRelentlessStateTrigger copy() { + return new GarrukRelentlessStateTrigger(this); } @Override public boolean checkTrigger(GameEvent event, Game game) { - if (event.getTargetId().equals(sourceId)) { - Permanent permanent = game.getPermanent(sourceId); - if (permanent != null && !permanent.isTransformed() && permanent.getCounters(game).getCount(CounterType.LOYALTY) <= 2) { - return true; - } - } - return false; + Permanent permanent = game.getPermanent(getSourceId()); + return permanent != null && permanent.getCounters(game).getCount(CounterType.LOYALTY) < 3; } @Override public String getRule() { - return "When Garruk Relentless has two or fewer loyalty counters on him, transform him."; + return "When {this} has two or fewer loyalty counters on him, transform him."; } } @@ -105,7 +91,7 @@ class GarrukRelentlessDamageEffect extends OneShotEffect { public GarrukRelentlessDamageEffect() { super(Outcome.Damage); - staticText = "Garruk Relentless deals 3 damage to target creature. That creature deals damage equal to its power to him"; + staticText = "{this} deals 3 damage to target creature. That creature deals damage equal to its power to him"; } public GarrukRelentlessDamageEffect(GarrukRelentlessDamageEffect effect) { diff --git a/Mage.Sets/src/mage/cards/g/GarrukWildspeaker.java b/Mage.Sets/src/mage/cards/g/GarrukWildspeaker.java index ed33dfd6779..ea38f29d9ea 100644 --- a/Mage.Sets/src/mage/cards/g/GarrukWildspeaker.java +++ b/Mage.Sets/src/mage/cards/g/GarrukWildspeaker.java @@ -3,7 +3,7 @@ package mage.cards.g; import java.util.UUID; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.Effects; import mage.abilities.effects.common.CreateTokenEffect; @@ -34,7 +34,7 @@ public final class GarrukWildspeaker extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.GARRUK); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3)); // +1: Untap two target lands. LoyaltyAbility ability1 = new LoyaltyAbility(new UntapTargetEffect(), 1); diff --git a/Mage.Sets/src/mage/cards/g/GeierReachBandit.java b/Mage.Sets/src/mage/cards/g/GeierReachBandit.java index d1d7d42b1a9..3c5b42f1696 100644 --- a/Mage.Sets/src/mage/cards/g/GeierReachBandit.java +++ b/Mage.Sets/src/mage/cards/g/GeierReachBandit.java @@ -2,6 +2,7 @@ package mage.cards.g; import java.util.UUID; + import mage.MageInt; import mage.abilities.TriggeredAbility; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; @@ -12,19 +13,17 @@ import mage.abilities.keyword.HasteAbility; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.v.VildinPackAlpha; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.TargetController; /** - * * @author LevelX2 */ public final class GeierReachBandit extends CardImpl { public GeierReachBandit(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.ROGUE); this.subtype.add(SubType.WEREWOLF); @@ -32,7 +31,7 @@ public final class GeierReachBandit extends CardImpl { this.toughness = new MageInt(2); this.transformable = true; - this.secondSideCardClazz = VildinPackAlpha.class; + this.secondSideCardClazz = mage.cards.v.VildinPackAlpha.class; // Haste this.addAbility(HasteAbility.getInstance()); @@ -51,4 +50,4 @@ public final class GeierReachBandit extends CardImpl { public GeierReachBandit copy() { return new GeierReachBandit(this); } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/g/GethLordOfTheVault.java b/Mage.Sets/src/mage/cards/g/GethLordOfTheVault.java index 58c1bc35534..ce931358a90 100644 --- a/Mage.Sets/src/mage/cards/g/GethLordOfTheVault.java +++ b/Mage.Sets/src/mage/cards/g/GethLordOfTheVault.java @@ -14,7 +14,6 @@ import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Outcome; import mage.constants.SuperType; -import mage.constants.TargetAdjustment; import mage.constants.TargetController; import mage.constants.Zone; import mage.filter.FilterCard; @@ -24,6 +23,7 @@ import mage.filter.predicate.other.OwnerPredicate; import mage.game.Game; import mage.players.Player; import mage.target.common.TargetCardInGraveyard; +import mage.target.targetadjustment.XCMCGraveyardAdjuster; /** * @author nantuko @@ -52,7 +52,7 @@ public final class GethLordOfTheVault extends CardImpl { // {X}{B}: Put target artifact or creature card with converted mana cost X from an opponent's graveyard onto the battlefield under your control tapped. // Then that player puts the top X cards of their library into their graveyard. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GethLordOfTheVaultEffect(), new ManaCostsImpl("{X}{B}")); - ability.setTargetAdjustment(TargetAdjustment.X_CMC_EQUAL_GY_CARD); + ability.setTargetAdjuster(XCMCGraveyardAdjuster.instance); ability.addTarget(new TargetCardInGraveyard(filter)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/g/GideonAllyOfZendikar.java b/Mage.Sets/src/mage/cards/g/GideonAllyOfZendikar.java index a6e73e91fe4..c7a55a17e5d 100644 --- a/Mage.Sets/src/mage/cards/g/GideonAllyOfZendikar.java +++ b/Mage.Sets/src/mage/cards/g/GideonAllyOfZendikar.java @@ -4,7 +4,7 @@ package mage.cards.g; import java.util.UUID; import mage.MageInt; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.GetEmblemEffect; @@ -20,7 +20,6 @@ import mage.constants.SuperType; import mage.game.command.emblems.GideonAllyOfZendikarEmblem; import mage.game.permanent.token.KnightAllyToken; import mage.game.permanent.token.TokenImpl; -import mage.game.permanent.token.Token; /** * @@ -33,7 +32,7 @@ public final class GideonAllyOfZendikar extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.GIDEON); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(4)); // +1: Until end of turn, Gideon, Ally of Zendikar becomes a 5/5 Human Soldier Ally creature with indestructible that's still a planeswalker. Prevent all damage that would be dealt to him this turn. LoyaltyAbility ability = new LoyaltyAbility(new BecomesCreatureSourceEffect(new GideonAllyOfZendikarToken(), "planeswalker", Duration.EndOfTurn), 1); diff --git a/Mage.Sets/src/mage/cards/g/GideonBattleForged.java b/Mage.Sets/src/mage/cards/g/GideonBattleForged.java index 95072064241..79b48010596 100644 --- a/Mage.Sets/src/mage/cards/g/GideonBattleForged.java +++ b/Mage.Sets/src/mage/cards/g/GideonBattleForged.java @@ -6,7 +6,7 @@ import mage.MageInt; import mage.MageObjectReference; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.RequirementEffect; import mage.abilities.effects.common.PreventAllDamageToSourceEffect; @@ -27,7 +27,6 @@ import mage.filter.predicate.permanent.ControllerPredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.permanent.token.TokenImpl; -import mage.game.permanent.token.Token; import mage.target.common.TargetCreaturePermanent; /** @@ -52,7 +51,7 @@ public final class GideonBattleForged extends CardImpl { this.nightCard = true; this.transformable = true; - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3)); // +2: Up to one target creature an opponent controls attacks Gideon, Battle-Forged during its controller's next turn if able. LoyaltyAbility loyaltyAbility = new LoyaltyAbility(new GideonBattleForgedAttacksIfAbleTargetEffect(Duration.Custom), 2); diff --git a/Mage.Sets/src/mage/cards/g/GideonChampionOfJustice.java b/Mage.Sets/src/mage/cards/g/GideonChampionOfJustice.java index f4afdfc3a74..2b479ffe998 100644 --- a/Mage.Sets/src/mage/cards/g/GideonChampionOfJustice.java +++ b/Mage.Sets/src/mage/cards/g/GideonChampionOfJustice.java @@ -5,7 +5,7 @@ import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.dynamicvalue.LockedInDynamicValue; import mage.abilities.dynamicvalue.common.CountersSourceCount; import mage.abilities.dynamicvalue.common.PermanentsTargetOpponentControlsCount; @@ -26,7 +26,6 @@ import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.permanent.token.TokenImpl; -import mage.game.permanent.token.Token; import mage.target.common.TargetOpponent; /** @@ -40,7 +39,7 @@ public final class GideonChampionOfJustice extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.GIDEON); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(4)); // +1: Put a loyalty counter on Gideon, Champion of Justice for each creature target opponent controls. LoyaltyAbility ability1 = new LoyaltyAbility( diff --git a/Mage.Sets/src/mage/cards/g/GideonJura.java b/Mage.Sets/src/mage/cards/g/GideonJura.java index d4890e31143..d18f5028910 100644 --- a/Mage.Sets/src/mage/cards/g/GideonJura.java +++ b/Mage.Sets/src/mage/cards/g/GideonJura.java @@ -5,7 +5,7 @@ import mage.MageInt; import mage.MageObjectReference; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.RequirementEffect; import mage.abilities.effects.common.DestroyTargetEffect; @@ -43,7 +43,7 @@ public final class GideonJura extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.GIDEON); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(6)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(6)); // +2: During target opponent's next turn, creatures that player controls attack Gideon Jura if able. LoyaltyAbility ability1 = new LoyaltyAbility(new GideonJuraEffect(), 2); diff --git a/Mage.Sets/src/mage/cards/g/GideonMartialParagon.java b/Mage.Sets/src/mage/cards/g/GideonMartialParagon.java index 324f922d3f6..3123d40b2cb 100644 --- a/Mage.Sets/src/mage/cards/g/GideonMartialParagon.java +++ b/Mage.Sets/src/mage/cards/g/GideonMartialParagon.java @@ -4,7 +4,7 @@ package mage.cards.g; import java.util.UUID; import mage.MageInt; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.common.PreventAllDamageToSourceEffect; import mage.abilities.effects.common.TapAllEffect; @@ -21,7 +21,6 @@ import mage.constants.SuperType; import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.common.FilterOpponentsCreaturePermanent; import mage.game.permanent.token.TokenImpl; -import mage.game.permanent.token.Token; /** * @@ -35,7 +34,7 @@ public final class GideonMartialParagon extends CardImpl { this.subtype.add(SubType.GIDEON); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(5)); // +2: Untap all creatures you control. Those creatures get +1/+1 until end of turn. LoyaltyAbility ability = new LoyaltyAbility(new UntapAllEffect(new FilterControlledCreaturePermanent()), 2); diff --git a/Mage.Sets/src/mage/cards/g/GideonOfTheTrials.java b/Mage.Sets/src/mage/cards/g/GideonOfTheTrials.java index bdb15746be7..46fe7dcc164 100644 --- a/Mage.Sets/src/mage/cards/g/GideonOfTheTrials.java +++ b/Mage.Sets/src/mage/cards/g/GideonOfTheTrials.java @@ -4,7 +4,7 @@ package mage.cards.g; import java.util.UUID; import mage.MageInt; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.common.GetEmblemEffect; import mage.abilities.effects.common.PreventAllDamageToSourceEffect; @@ -19,7 +19,6 @@ import mage.constants.Duration; import mage.constants.SuperType; import mage.game.command.emblems.GideonOfTheTrialsEmblem; import mage.game.permanent.token.TokenImpl; -import mage.game.permanent.token.Token; import mage.target.TargetPermanent; /** @@ -34,7 +33,7 @@ public final class GideonOfTheTrials extends CardImpl { this.subtype.add(SubType.GIDEON); //Starting Loyalty: 3 - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3)); // +1: Until your next turn, prevent all damage target permanent would deal. Effect effect = new PreventDamageByTargetEffect(Duration.UntilYourNextTurn); diff --git a/Mage.Sets/src/mage/cards/g/GiselaTheBrokenBlade.java b/Mage.Sets/src/mage/cards/g/GiselaTheBrokenBlade.java index 20d3a59a600..e668ee9d382 100644 --- a/Mage.Sets/src/mage/cards/g/GiselaTheBrokenBlade.java +++ b/Mage.Sets/src/mage/cards/g/GiselaTheBrokenBlade.java @@ -2,6 +2,7 @@ package mage.cards.g; import java.util.UUID; + import mage.MageInt; import mage.abilities.common.BeginningOfEndStepTriggeredAbility; import mage.abilities.condition.common.MeldCondition; @@ -12,7 +13,6 @@ import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.LifelinkAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.b.BriselaVoiceOfNightmares; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Rarity; @@ -20,13 +20,12 @@ import mage.constants.SuperType; import mage.constants.TargetController; /** - * * @author LevelX2 */ public final class GiselaTheBrokenBlade extends CardImpl { public GiselaTheBrokenBlade(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{W}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}{W}"); addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.ANGEL); this.subtype.add(SubType.HORROR); @@ -41,13 +40,13 @@ public final class GiselaTheBrokenBlade extends CardImpl { // Lifelink this.addAbility(LifelinkAbility.getInstance()); - + // At the beginning of your end step, if you both own and control Gisela, the Broken Blade and a creature named Bruna, the Fading Light, exile them, then meld them into Brisela, Voice of Nightmares. this.addAbility(new ConditionalInterveningIfTriggeredAbility( new BeginningOfEndStepTriggeredAbility( new MeldEffect("Bruna, the Fading Light", - new BriselaVoiceOfNightmares(ownerId, - new CardSetInfo("Brisela, Voice of Nightmares", "EMN", "15", Rarity.MYTHIC))), TargetController.YOU, false), + new mage.cards.b.BriselaVoiceOfNightmares(ownerId, + new CardSetInfo("Brisela, Voice of Nightmares", "EMN", "15", Rarity.MYTHIC))), TargetController.YOU, false), new MeldCondition("Bruna, the Fading Light"), "At the beginning of your end step, if you both own and control {this} and a creature named Bruna, the Fading Light, exile them, " + "then meld them into Brisela, Voice of Nightmares.")); @@ -61,4 +60,4 @@ public final class GiselaTheBrokenBlade extends CardImpl { public GiselaTheBrokenBlade copy() { return new GiselaTheBrokenBlade(this); } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/g/GlaiveOfTheGuildpact.java b/Mage.Sets/src/mage/cards/g/GlaiveOfTheGuildpact.java index 58c62ade5d6..632d3e4f302 100644 --- a/Mage.Sets/src/mage/cards/g/GlaiveOfTheGuildpact.java +++ b/Mage.Sets/src/mage/cards/g/GlaiveOfTheGuildpact.java @@ -10,11 +10,11 @@ import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; import mage.abilities.keyword.EquipAbility; import mage.abilities.keyword.MenaceAbility; import mage.abilities.keyword.VigilanceAbility; -import mage.constants.SubType; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.AttachmentType; import mage.constants.CardType; +import mage.constants.SubType; import mage.constants.Zone; import mage.filter.FilterPermanent; import mage.filter.common.FilterControlledPermanent; @@ -52,6 +52,7 @@ public final class GlaiveOfTheGuildpact extends CardImpl { ability.addEffect(new GainAbilityAttachedEffect( new MenaceAbility(), AttachmentType.EQUIPMENT ).setText("and menace")); + this.addAbility(ability); // Equip {3} this.addAbility(new EquipAbility(3)); diff --git a/Mage.Sets/src/mage/cards/g/GlowsporeShaman.java b/Mage.Sets/src/mage/cards/g/GlowsporeShaman.java index 68b831134c2..c069371c391 100644 --- a/Mage.Sets/src/mage/cards/g/GlowsporeShaman.java +++ b/Mage.Sets/src/mage/cards/g/GlowsporeShaman.java @@ -1,27 +1,26 @@ package mage.cards.g; -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.OneShotEffect; -import mage.abilities.effects.common.PutOnLibraryTargetEffect; import mage.abilities.effects.common.PutTopCardOfLibraryIntoGraveControllerEffect; -import mage.constants.SubType; +import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.cards.CardsImpl; import mage.constants.CardType; import mage.constants.Outcome; +import mage.constants.SubType; import mage.filter.common.FilterLandCard; import mage.game.Game; import mage.players.Player; import mage.target.Target; import mage.target.common.TargetCardInYourGraveyard; -import mage.target.targetpointer.FixedTarget; + +import java.util.UUID; /** - * * @author TheElk801 */ public final class GlowsporeShaman extends CardImpl { @@ -35,9 +34,11 @@ public final class GlowsporeShaman extends CardImpl { this.toughness = new MageInt(1); // When Glowspore Shaman enters the battlefield, put the top three cards of your library into your graveyard. You may put a land card from your graveyard on top of your library. - this.addAbility(new EntersBattlefieldTriggeredAbility( + Ability ability = new EntersBattlefieldTriggeredAbility( new PutTopCardOfLibraryIntoGraveControllerEffect(3), false - )); + ); + ability.addEffect(new GlowsporeShamanEffect()); + this.addAbility(ability); } public GlowsporeShaman(final GlowsporeShaman card) { @@ -79,9 +80,10 @@ class GlowsporeShamanEffect extends OneShotEffect { Target target = new TargetCardInYourGraveyard(0, 1, filter, true); if (player.chooseUse(outcome, "Put a land card on top of your library?", source, game) && player.choose(outcome, target, source.getSourceId(), game)) { - Effect effect = new PutOnLibraryTargetEffect(true); - effect.setTargetPointer(new FixedTarget(target.getFirstTarget(), game)); - effect.apply(game, source); + Card card = game.getCard(target.getFirstTarget()); + if (card != null) { + return player.putCardsOnTopOfLibrary(new CardsImpl(card), game, source, false); + } } return true; } diff --git a/Mage.Sets/src/mage/cards/g/GoblinBowlingTeam.java b/Mage.Sets/src/mage/cards/g/GoblinBowlingTeam.java new file mode 100644 index 00000000000..663449e3ae8 --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GoblinBowlingTeam.java @@ -0,0 +1,110 @@ + +package mage.cards.g; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.ReplacementEffectImpl; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.DamageEvent; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.util.CardUtil; + +/** + * + * @author L_J + */ +public final class GoblinBowlingTeam extends CardImpl { + + public GoblinBowlingTeam(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{R}"); + this.subtype.add(SubType.GOBLIN); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // If Goblin Bowling Team would deal damage to a permanent or player, it deals that much damage plus the result of a six-sided die roll to that permanent or player instead. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GoblinBowlingTeamEffect())); + + } + + public GoblinBowlingTeam(final GoblinBowlingTeam card) { + super(card); + } + + @Override + public GoblinBowlingTeam copy() { + return new GoblinBowlingTeam(this); + } +} + +class GoblinBowlingTeamEffect extends ReplacementEffectImpl { + + public GoblinBowlingTeamEffect() { + super(Duration.WhileOnBattlefield, Outcome.Damage); + staticText = "If {this} would deal damage to a permanent or player, it deals that much damage plus the result of a six-sided die roll to that permanent or player instead"; + } + + public GoblinBowlingTeamEffect(final GoblinBowlingTeamEffect effect) { + super(effect); + } + + @Override + public GoblinBowlingTeamEffect copy() { + return new GoblinBowlingTeamEffect(this); + } + + @Override + public boolean checksEventType(GameEvent event, Game game) { + switch (event.getType()) { + case DAMAGE_CREATURE: + case DAMAGE_PLAYER: + case DAMAGE_PLANESWALKER: + return true; + default: + return false; + } + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + return event.getSourceId().equals(source.getSourceId()); + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public boolean replaceEvent(GameEvent event, Ability source, Game game) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + DamageEvent damageEvent = (DamageEvent) event; + if (damageEvent.getType() == EventType.DAMAGE_PLAYER) { + Player targetPlayer = game.getPlayer(event.getTargetId()); + if (targetPlayer != null) { + targetPlayer.damage(CardUtil.addWithOverflowCheck(damageEvent.getAmount(), controller.rollDice(game, 6)), damageEvent.getSourceId(), game, damageEvent.isCombatDamage(), damageEvent.isPreventable(), event.getAppliedEffects()); + return true; + } + } else { + Permanent targetPermanent = game.getPermanent(event.getTargetId()); + if (targetPermanent != null) { + targetPermanent.damage(CardUtil.addWithOverflowCheck(damageEvent.getAmount(), controller.rollDice(game, 6)), damageEvent.getSourceId(), game, damageEvent.isCombatDamage(), damageEvent.isPreventable(), event.getAppliedEffects()); + return true; + } + } + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/g/GoblinBruiser.java b/Mage.Sets/src/mage/cards/g/GoblinBruiser.java new file mode 100644 index 00000000000..ab4b7acfe0c --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GoblinBruiser.java @@ -0,0 +1,33 @@ +package mage.cards.g; + +import mage.MageInt; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; + +import java.util.UUID; + +/** + * @author JayDi85 + */ +public final class GoblinBruiser extends CardImpl { + + public GoblinBruiser(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}{R}"); + this.subtype.add(SubType.GOBLIN); + this.subtype.add(SubType.WARRIOR); + + this.power = new MageInt(3); + this.toughness = new MageInt(3); + } + + public GoblinBruiser(final GoblinBruiser card) { + super(card); + } + + @Override + public GoblinBruiser copy() { + return new GoblinBruiser(this); + } +} diff --git a/Mage.Sets/src/mage/cards/g/GoblinCratermaker.java b/Mage.Sets/src/mage/cards/g/GoblinCratermaker.java index e88dccd4cee..bfd07f08b78 100644 --- a/Mage.Sets/src/mage/cards/g/GoblinCratermaker.java +++ b/Mage.Sets/src/mage/cards/g/GoblinCratermaker.java @@ -9,10 +9,10 @@ import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.DestroyTargetEffect; -import mage.constants.SubType; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.SubType; import mage.filter.FilterPermanent; import mage.filter.common.FilterNonlandPermanent; import mage.filter.predicate.mageobject.ColorlessPredicate; @@ -40,7 +40,7 @@ public final class GoblinCratermaker extends CardImpl { this.power = new MageInt(2); this.toughness = new MageInt(2); - // {1}, Sacrifice Goblin Cratermaker: Choose one — + // {1}, Sacrifice Goblin Cratermaker: Choose one — // • Goblin Cratermaker deals 2 damage to target creature. Ability ability = new SimpleActivatedAbility( new DamageTargetEffect(2), new GenericManaCost(1) @@ -51,7 +51,7 @@ public final class GoblinCratermaker extends CardImpl { // • Destroy target colorless nonland permanent. Mode mode = new Mode(); mode.getEffects().add(new DestroyTargetEffect()); - mode.getTargets().add(new TargetPermanent()); + mode.getTargets().add(new TargetPermanent(filter)); ability.addMode(mode); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/g/GoblinGangLeader.java b/Mage.Sets/src/mage/cards/g/GoblinGangLeader.java new file mode 100644 index 00000000000..db0e80fc8bd --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GoblinGangLeader.java @@ -0,0 +1,39 @@ +package mage.cards.g; + +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.game.permanent.token.GoblinToken; + +import java.util.UUID; + +/** + * + * @author JayDi85 + */ +public final class GoblinGangLeader extends CardImpl { + + public GoblinGangLeader(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{R}{R}"); + this.subtype.add(SubType.GOBLIN, SubType.WARRIOR); + + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // When Goblin Gang Leader enters the battlefield, create two 1/1 red Goblin creature tokens. + this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new GoblinToken("ANA"), 2))); + } + + public GoblinGangLeader(final GoblinGangLeader card) { + super(card); + } + + @Override + public GoblinGangLeader copy() { + return new GoblinGangLeader(this); + } +} diff --git a/Mage.Sets/src/mage/cards/g/GoblinSecretAgent.java b/Mage.Sets/src/mage/cards/g/GoblinSecretAgent.java new file mode 100644 index 00000000000..3599c2e2c7e --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GoblinSecretAgent.java @@ -0,0 +1,83 @@ + +package mage.cards.g; + +import java.util.UUID; +import mage.MageInt; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.keyword.FirstStrikeAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.CardsImpl; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Outcome; +import mage.constants.TargetController; +import mage.game.Game; +import mage.players.Player; +/** + * + * @author L_J + */ +public final class GoblinSecretAgent extends CardImpl { + + public GoblinSecretAgent(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{R}"); + this.subtype.add(SubType.GOBLIN); + this.subtype.add(SubType.ROGUE); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // First strike + this.addAbility(FirstStrikeAbility.getInstance()); + + // At the beginning of your upkeep, reveal a card from your hand at random. + this.addAbility(new BeginningOfUpkeepTriggeredAbility(new GoblinSecretAgentEffect(), TargetController.YOU, false)); + } + + public GoblinSecretAgent(final GoblinSecretAgent card) { + super(card); + } + + @Override + public GoblinSecretAgent copy() { + return new GoblinSecretAgent(this); + } +} + +class GoblinSecretAgentEffect extends OneShotEffect { + + public GoblinSecretAgentEffect() { + super(Outcome.Detriment); + this.staticText = "reveal a card from your hand at random"; + } + + public GoblinSecretAgentEffect(final GoblinSecretAgentEffect effect) { + super(effect); + } + + @Override + public GoblinSecretAgentEffect copy() { + return new GoblinSecretAgentEffect(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) { + if (!controller.getHand().isEmpty()) { + CardsImpl randomCard = new CardsImpl(); + Card card = controller.getHand().getRandom(game); + randomCard.add(card); + controller.revealCards(sourceObject.getIdName(), randomCard, game); + } + return true; + } + return false; + } + +} diff --git a/Mage.Sets/src/mage/cards/g/GorillaShaman.java b/Mage.Sets/src/mage/cards/g/GorillaShaman.java index ee101c183bb..f99db1acd93 100644 --- a/Mage.Sets/src/mage/cards/g/GorillaShaman.java +++ b/Mage.Sets/src/mage/cards/g/GorillaShaman.java @@ -1,4 +1,3 @@ - package mage.cards.g; import java.util.UUID; @@ -11,12 +10,12 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.constants.TargetAdjustment; import mage.constants.Zone; import mage.filter.FilterPermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.CardTypePredicate; import mage.target.TargetPermanent; +import mage.target.targetadjustment.XCMCPermanentAdjuster; /** * @@ -41,7 +40,7 @@ public final class GorillaShaman extends CardImpl { // {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(filter)); - ability.setTargetAdjustment(TargetAdjustment.X_CMC_EQUAL_PERM); + ability.setTargetAdjuster(XCMCPermanentAdjuster.instance); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/g/GrafRats.java b/Mage.Sets/src/mage/cards/g/GrafRats.java index 339fa36f5b2..f4a11010156 100644 --- a/Mage.Sets/src/mage/cards/g/GrafRats.java +++ b/Mage.Sets/src/mage/cards/g/GrafRats.java @@ -2,6 +2,7 @@ package mage.cards.g; import java.util.UUID; + import mage.MageInt; import mage.abilities.common.BeginningOfCombatTriggeredAbility; import mage.abilities.condition.common.MeldCondition; @@ -9,27 +10,25 @@ import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.MeldEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.c.ChitteringHost; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Rarity; import mage.constants.TargetController; /** - * * @author emerald000 */ public final class GrafRats extends CardImpl { public GrafRats(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}"); this.subtype.add(SubType.RAT); this.power = new MageInt(2); this.toughness = new MageInt(1); // At the beginning of combat on your turn, if you both own and control Graf Rats and a creature named Midnight Scavengers, exile them, then meld them into Chittering Host. this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new BeginningOfCombatTriggeredAbility(new MeldEffect("Midnight Scavengers", new ChitteringHost(ownerId, new CardSetInfo("Chittering Host", "EMN", "96", Rarity.COMMON))), TargetController.YOU, false), + new BeginningOfCombatTriggeredAbility(new MeldEffect("Midnight Scavengers", new mage.cards.c.ChitteringHost(ownerId, new CardSetInfo("Chittering Host", "EMN", "96", Rarity.COMMON))), TargetController.YOU, false), new MeldCondition("Midnight Scavengers"), "At the beginning of combat on your turn, if you both own and control {this} and a creature named Midnight Scavengers, exile them, then meld them into Chittering Host.")); } @@ -42,4 +41,4 @@ public final class GrafRats extends CardImpl { public GrafRats copy() { return new GrafRats(this); } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/g/GraveScrabbler.java b/Mage.Sets/src/mage/cards/g/GraveScrabbler.java index a51594e9a77..b712d2c8690 100644 --- a/Mage.Sets/src/mage/cards/g/GraveScrabbler.java +++ b/Mage.Sets/src/mage/cards/g/GraveScrabbler.java @@ -32,7 +32,7 @@ public final class GraveScrabbler extends CardImpl { //you may return target creature card from a graveyard to its owner's hand. TriggeredAbility ability = new EntersBattlefieldTriggeredAbility(new ReturnToHandTargetEffect(), true); ability.addTarget(new TargetCardInGraveyard(new FilterCreatureCard("creature card in a graveyard"))); - this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability, MadnessAbility.GetCondition(), + this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability, MadnessAbility.getCondition(), "When {this} enters the battlefield, if its madness cost was paid, you may return target creature card from a graveyard to its owner's hand.")); } diff --git a/Mage.Sets/src/mage/cards/g/GraviticPunch.java b/Mage.Sets/src/mage/cards/g/GraviticPunch.java new file mode 100644 index 00000000000..cfd36819b70 --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GraviticPunch.java @@ -0,0 +1,73 @@ +package mage.cards.g; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.keyword.JumpStartAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.TargetPlayer; +import mage.target.common.TargetControlledCreaturePermanent; + +/** + * + * @author TheElk801 + */ +public final class GraviticPunch extends CardImpl { + + public GraviticPunch(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{R}"); + + // Target creature you control deals damage equal to its power to target player. + this.getSpellAbility().addEffect(new GraviticPunchEffect()); + this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent()); + this.getSpellAbility().addTarget(new TargetPlayer()); + + // Jump-start + this.addAbility(new JumpStartAbility(this)); + + } + + public GraviticPunch(final GraviticPunch card) { + super(card); + } + + @Override + public GraviticPunch copy() { + return new GraviticPunch(this); + } +} + +class GraviticPunchEffect extends OneShotEffect { + + public GraviticPunchEffect() { + super(Outcome.Benefit); + this.staticText = "Target creature you control deals damage " + + "equal to its power to target player."; + } + + public GraviticPunchEffect(final GraviticPunchEffect effect) { + super(effect); + } + + @Override + public GraviticPunchEffect copy() { + return new GraviticPunchEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent controlledCreature = game.getPermanentOrLKIBattlefield(getTargetPointer().getFirst(game, source)); + Player player = game.getPlayer(source.getTargets().get(1).getFirstTarget()); + if (player == null || controlledCreature == null) { + return false; + } + player.damage(controlledCreature.getPower().getValue(), controlledCreature.getId(), game, false, true); + return true; + } +} diff --git a/Mage.Sets/src/mage/cards/g/GrizzledOutcasts.java b/Mage.Sets/src/mage/cards/g/GrizzledOutcasts.java index d5093a40a92..e7230204733 100644 --- a/Mage.Sets/src/mage/cards/g/GrizzledOutcasts.java +++ b/Mage.Sets/src/mage/cards/g/GrizzledOutcasts.java @@ -2,6 +2,7 @@ package mage.cards.g; import java.util.UUID; + import mage.MageInt; import mage.abilities.TriggeredAbility; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; @@ -11,7 +12,6 @@ import mage.abilities.effects.common.TransformSourceEffect; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.k.KrallenhordeWantons; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.TargetController; @@ -22,12 +22,12 @@ import mage.constants.TargetController; public final class GrizzledOutcasts extends CardImpl { public GrizzledOutcasts(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{G}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.WEREWOLF); this.transformable = true; - this.secondSideCardClazz = KrallenhordeWantons.class; + this.secondSideCardClazz = mage.cards.k.KrallenhordeWantons.class; this.power = new MageInt(4); this.toughness = new MageInt(4); @@ -46,4 +46,4 @@ public final class GrizzledOutcasts extends CardImpl { public GrizzledOutcasts copy() { return new GrizzledOutcasts(this); } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/g/GrowingRitesOfItlimoc.java b/Mage.Sets/src/mage/cards/g/GrowingRitesOfItlimoc.java index b749f1410e0..40544baff56 100644 --- a/Mage.Sets/src/mage/cards/g/GrowingRitesOfItlimoc.java +++ b/Mage.Sets/src/mage/cards/g/GrowingRitesOfItlimoc.java @@ -12,7 +12,6 @@ import mage.abilities.effects.common.TransformSourceEffect; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.i.ItlimocCradleOfTheSun; import mage.constants.CardType; import mage.constants.ComparisonType; import mage.constants.SuperType; @@ -23,7 +22,6 @@ import mage.filter.StaticFilters; import mage.filter.predicate.mageobject.CardTypePredicate; /** - * * @author JRHerlehy */ public final class GrowingRitesOfItlimoc extends CardImpl { @@ -40,7 +38,7 @@ public final class GrowingRitesOfItlimoc extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.transformable = true; - this.secondSideCardClazz = ItlimocCradleOfTheSun.class; + this.secondSideCardClazz = mage.cards.i.ItlimocCradleOfTheSun.class; // When Growing Rites of Itlimoc enters the battlefield, look at the top four cards of your library. // You may reveal a creature card from among them and put it into your hand. @@ -63,4 +61,4 @@ public final class GrowingRitesOfItlimoc extends CardImpl { public GrowingRitesOfItlimoc copy() { return new GrowingRitesOfItlimoc(this); } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/g/GuildmagesForum.java b/Mage.Sets/src/mage/cards/g/GuildmagesForum.java new file mode 100644 index 00000000000..1a1792352e0 --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GuildmagesForum.java @@ -0,0 +1,142 @@ +package mage.cards.g; + +import java.util.UUID; +import mage.MageObject; +import mage.MageObjectReference; +import mage.abilities.Ability; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.ReplacementEffectImpl; +import mage.abilities.mana.AnyColorManaAbility; +import mage.abilities.mana.ColorlessManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.WatcherScope; +import mage.counters.CounterType; +import mage.game.Game; +import mage.game.events.EntersTheBattlefieldEvent; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; +import mage.game.permanent.Permanent; +import mage.game.stack.Spell; +import mage.watchers.Watcher; + +/** + * + * @author LevelX2 + */ +public final class GuildmagesForum extends CardImpl { + + public GuildmagesForum(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); + + // {T}: Add {C}. + this.addAbility(new ColorlessManaAbility()); + + // {1}, {T}: Add one mana of any color. If that mana is spent on a multicolored creature spell, that creature enters the battlefield with an additional +1/+1 counter on it. + Ability ability = new AnyColorManaAbility(new GenericManaCost(1), true); + ability.getEffects().get(0).setText("Add one mana of any color. If that mana is spent on a multicolored creature spell, that creature enters the battlefield with an additional +1/+1 counter on it"); + ability.addCost(new TapSourceCost()); + this.addAbility(ability, new GuildmagesForumWatcher(ability)); + } + + public GuildmagesForum(final GuildmagesForum card) { + super(card); + } + + @Override + public GuildmagesForum copy() { + return new GuildmagesForum(this); + } +} + +class GuildmagesForumWatcher extends Watcher { + + private final Ability source; + + GuildmagesForumWatcher(Ability source) { + super("GuildmagesForumWatcher", WatcherScope.CARD); + this.source = source; + } + + GuildmagesForumWatcher(final GuildmagesForumWatcher watcher) { + super(watcher); + this.source = watcher.source; + } + + @Override + public GuildmagesForumWatcher copy() { + return new GuildmagesForumWatcher(this); + } + + @Override + public void watch(GameEvent event, Game game) { + if (event.getType() == EventType.MANA_PAID) { + MageObject target = game.getObject(event.getTargetId()); + if (event.getSourceId() != null + && event.getSourceId().equals(this.getSourceId()) + && target != null && target.isCreature() && target.getColor(game).isMulticolored() + && event.getFlag()) { + if (target instanceof Spell) { + game.getState().addEffect(new GuildmagesForumEntersBattlefieldEffect( + new MageObjectReference(((Spell) target).getSourceId(), target.getZoneChangeCounter(game), game)), source); + } + } + } + } + + @Override + public void reset() { + super.reset(); + } + +} + +class GuildmagesForumEntersBattlefieldEffect extends ReplacementEffectImpl { + + private final MageObjectReference mor; + + public GuildmagesForumEntersBattlefieldEffect(MageObjectReference mor) { + super(Duration.EndOfTurn, Outcome.BoostCreature); + this.staticText = "If that mana is spent on a multicolored creature spell, that creature enters the battlefield with an additional +1/+1 counter on it"; + this.mor = mor; + } + + public GuildmagesForumEntersBattlefieldEffect(GuildmagesForumEntersBattlefieldEffect effect) { + super(effect); + this.mor = effect.mor; + } + + @Override + public boolean checksEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + Permanent permanent = ((EntersTheBattlefieldEvent) event).getTarget(); + return permanent != null && mor.refersTo(permanent, game); + } + + @Override + public boolean apply(Game game, Ability source) { + return false; + } + + @Override + public boolean replaceEvent(GameEvent event, Ability source, Game game) { + Permanent target = ((EntersTheBattlefieldEvent) event).getTarget(); + if (target != null) { + target.addCounters(CounterType.P1P1.createInstance(), source, game, event.getAppliedEffects()); + } + return false; + } + + @Override + public GuildmagesForumEntersBattlefieldEffect copy() { + return new GuildmagesForumEntersBattlefieldEffect(this); + } +} diff --git a/Mage.Sets/src/mage/cards/h/HadanasClimb.java b/Mage.Sets/src/mage/cards/h/HadanasClimb.java index 129d75a857e..e29d6f4f65a 100644 --- a/Mage.Sets/src/mage/cards/h/HadanasClimb.java +++ b/Mage.Sets/src/mage/cards/h/HadanasClimb.java @@ -2,6 +2,7 @@ package mage.cards.h; import java.util.UUID; + import mage.abilities.Ability; import mage.abilities.common.BeginningOfCombatTriggeredAbility; import mage.abilities.condition.common.TargetHasCounterCondition; @@ -11,7 +12,6 @@ import mage.abilities.effects.common.counter.AddCountersTargetEffect; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.w.WingedTempleOfOrazca; import mage.constants.CardType; import mage.constants.SuperType; import mage.constants.TargetController; @@ -19,7 +19,6 @@ import mage.counters.CounterType; import mage.target.common.TargetControlledCreaturePermanent; /** - * * @author LevelX2 */ public final class HadanasClimb extends CardImpl { @@ -30,7 +29,7 @@ public final class HadanasClimb extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.transformable = true; - this.secondSideCardClazz = WingedTempleOfOrazca.class; + this.secondSideCardClazz = mage.cards.w.WingedTempleOfOrazca.class; // At the beginning of combat on your turn, put a +1/+1 counter on target creature you control. Then if that creature has three or more +1/+1 counters on it, transform Hadana's Climb. this.addAbility(new TransformAbility()); diff --git a/Mage.Sets/src/mage/cards/h/HammerJammer.java b/Mage.Sets/src/mage/cards/h/HammerJammer.java new file mode 100644 index 00000000000..52e51e3d4b7 --- /dev/null +++ b/Mage.Sets/src/mage/cards/h/HammerJammer.java @@ -0,0 +1,154 @@ + +package mage.cards.h; + +import java.util.ArrayList; +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.EntersBattlefieldWithXCountersEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.counters.Counter; +import mage.counters.CounterType; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.players.Player; + +/** + * + * @author spjspj & L_J + */ +public final class HammerJammer extends CardImpl { + + public HammerJammer(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}"); + this.subtype.add(SubType.GOBLIN); + this.subtype.add(SubType.WARRIOR); + this.power = new MageInt(0); + this.toughness = new MageInt(0); + + // As Hammer Jammer enters the battlefield, roll a six-sided die. Hammer Jammer enters the battlefield with a number of +1/+1 counters on it equal to the result. + this.addAbility(new EntersBattlefieldAbility(new HammerJammerEntersEffect(CounterType.P1P1.createInstance()))); + + // Whenever you roll a die, remove all +1/+1 counters from Hammer Jammer, then put a number of +1/+1 counters on it equal to the result. + this.addAbility(new HammerJammerTriggeredAbility()); + + } + + public HammerJammer(final HammerJammer card) { + super(card); + } + + @Override + public HammerJammer copy() { + return new HammerJammer(this); + } +} + +class HammerJammerEntersEffect extends EntersBattlefieldWithXCountersEffect { + + public HammerJammerEntersEffect(Counter counter) { + super(counter); + } + + public HammerJammerEntersEffect(EntersBattlefieldWithXCountersEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + Permanent permanent = game.getPermanentEntering(source.getSourceId()); + if (controller != null && permanent != null) { + int amount = controller.rollDice(game, 6); + ArrayList appliedEffects = (ArrayList) this.getValue("appliedEffects"); // the basic event is the EntersBattlefieldEvent, so use already applied replacement effects from that event + permanent.addCounters(CounterType.P1P1.createInstance(amount), source, game, appliedEffects); + return super.apply(game, source); + } + return false; + } + + @Override + public EntersBattlefieldWithXCountersEffect copy() { + return new HammerJammerEntersEffect(this); + } +} + +class HammerJammerTriggeredAbility extends TriggeredAbilityImpl { + + public HammerJammerTriggeredAbility() { + super(Zone.BATTLEFIELD, new HammerJammerEffect(), false); + } + + public HammerJammerTriggeredAbility(final HammerJammerTriggeredAbility ability) { + super(ability); + } + + @Override + public HammerJammerTriggeredAbility copy() { + return new HammerJammerTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.DICE_ROLLED; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (this.getControllerId().equals(event.getPlayerId()) && event.getFlag()) { + for (Effect effect : this.getEffects()) { + effect.setValue("rolled", event.getAmount()); + } + return true; + } + return false; + } + + @Override + public String getRule() { + return "Whenever you roll a die, " + super.getRule(); + } +} + +class HammerJammerEffect extends OneShotEffect { + + public HammerJammerEffect() { + super(Outcome.Benefit); + this.staticText = "remove all +1/+1 counters from {this}, then put a number of +1/+1 counters on it equal to the result"; + } + + public HammerJammerEffect(final HammerJammerEffect effect) { + super(effect); + } + + @Override + public HammerJammerEffect copy() { + return new HammerJammerEffect(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) { + if (getValue("rolled") != null) { + int amount = (Integer) getValue("rolled"); + permanent.removeCounters(CounterType.P1P1.createInstance(permanent.getCounters(game).getCount(CounterType.P1P1)), game); + permanent.addCounters(CounterType.P1P1.createInstance(amount), source, game); + return true; + } + } + return false; + + } +} diff --git a/Mage.Sets/src/mage/cards/h/HanweirMilitiaCaptain.java b/Mage.Sets/src/mage/cards/h/HanweirMilitiaCaptain.java index 26b44fac7b8..2ff6dd1e1ce 100644 --- a/Mage.Sets/src/mage/cards/h/HanweirMilitiaCaptain.java +++ b/Mage.Sets/src/mage/cards/h/HanweirMilitiaCaptain.java @@ -2,6 +2,7 @@ package mage.cards.h; import java.util.UUID; + import mage.MageInt; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; @@ -10,7 +11,6 @@ import mage.abilities.effects.common.TransformSourceEffect; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.w.WestvaleCultLeader; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.ComparisonType; @@ -18,7 +18,6 @@ import mage.constants.TargetController; import mage.filter.common.FilterControlledCreaturePermanent; /** - * * @author fireshoes */ public final class HanweirMilitiaCaptain extends CardImpl { @@ -26,14 +25,14 @@ public final class HanweirMilitiaCaptain extends CardImpl { private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("if you control four or more creatures"); public HanweirMilitiaCaptain(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.SOLDIER); this.power = new MageInt(2); this.toughness = new MageInt(2); this.transformable = true; - this.secondSideCardClazz = WestvaleCultLeader.class; + this.secondSideCardClazz = mage.cards.w.WestvaleCultLeader.class; // At the beginning of your upkeep, if you control four or more creatures, transform Hanweir Militia Captain. this.addAbility(new TransformAbility()); diff --git a/Mage.Sets/src/mage/cards/h/HanweirWatchkeep.java b/Mage.Sets/src/mage/cards/h/HanweirWatchkeep.java index 463a9b84094..04906ce2c90 100644 --- a/Mage.Sets/src/mage/cards/h/HanweirWatchkeep.java +++ b/Mage.Sets/src/mage/cards/h/HanweirWatchkeep.java @@ -2,6 +2,7 @@ package mage.cards.h; import java.util.UUID; + import mage.MageInt; import mage.abilities.TriggeredAbility; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; @@ -12,7 +13,6 @@ import mage.abilities.keyword.DefenderAbility; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.b.BaneOfHanweir; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.TargetController; @@ -23,13 +23,13 @@ import mage.constants.TargetController; public final class HanweirWatchkeep extends CardImpl { public HanweirWatchkeep(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.WARRIOR); this.subtype.add(SubType.WEREWOLF); this.transformable = true; - this.secondSideCardClazz = BaneOfHanweir.class; + this.secondSideCardClazz = mage.cards.b.BaneOfHanweir.class; this.power = new MageInt(1); this.toughness = new MageInt(5); diff --git a/Mage.Sets/src/mage/cards/h/HarvestHand.java b/Mage.Sets/src/mage/cards/h/HarvestHand.java index 82c60fd0b12..7661170773f 100644 --- a/Mage.Sets/src/mage/cards/h/HarvestHand.java +++ b/Mage.Sets/src/mage/cards/h/HarvestHand.java @@ -2,6 +2,7 @@ package mage.cards.h; import java.util.UUID; + import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.DiesTriggeredAbility; @@ -10,7 +11,6 @@ import mage.abilities.keyword.TransformAbility; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.s.ScroungedScythe; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Outcome; @@ -19,19 +19,18 @@ import mage.game.Game; import mage.players.Player; /** - * * @author halljared */ public final class HarvestHand extends CardImpl { public HarvestHand(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT,CardType.CREATURE},"{3}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{3}"); this.subtype.add(SubType.SCARECROW); this.power = new MageInt(2); this.toughness = new MageInt(2); this.transformable = true; - this.secondSideCardClazz = ScroungedScythe.class; + this.secondSideCardClazz = mage.cards.s.ScroungedScythe.class; // When Harvest Hand dies, return it to the battlefield transformed under your control. this.addAbility(new TransformAbility()); diff --git a/Mage.Sets/src/mage/cards/h/HatcherySpider.java b/Mage.Sets/src/mage/cards/h/HatcherySpider.java index ac3d189cc34..916d6bff05c 100644 --- a/Mage.Sets/src/mage/cards/h/HatcherySpider.java +++ b/Mage.Sets/src/mage/cards/h/HatcherySpider.java @@ -84,7 +84,7 @@ class HatcherySpiderEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getFirstTarget()); + Player player = game.getPlayer(source.getControllerId()); if (player == null) { return false; } diff --git a/Mage.Sets/src/mage/cards/h/HearthKami.java b/Mage.Sets/src/mage/cards/h/HearthKami.java index 0d2eeb8b9b4..0d09cdf93df 100644 --- a/Mage.Sets/src/mage/cards/h/HearthKami.java +++ b/Mage.Sets/src/mage/cards/h/HearthKami.java @@ -1,4 +1,3 @@ - package mage.cards.h; import java.util.UUID; @@ -12,11 +11,11 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.constants.TargetAdjustment; import mage.constants.Zone; import mage.filter.FilterPermanent; import mage.filter.predicate.mageobject.CardTypePredicate; import mage.target.TargetPermanent; +import mage.target.targetadjustment.XCMCPermanentAdjuster; /** * @author Loki @@ -40,7 +39,7 @@ public final class HearthKami extends CardImpl { Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DestroyTargetEffect(), new ManaCostsImpl("{X}")); ability.addCost(new SacrificeSourceCost()); ability.addTarget(new TargetPermanent(filter)); - ability.setTargetAdjustment(TargetAdjustment.X_CMC_EQUAL_PERM); + ability.setTargetAdjuster(XCMCPermanentAdjuster.instance); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/h/HellkiteWhelp.java b/Mage.Sets/src/mage/cards/h/HellkiteWhelp.java index a96308cbdba..3baa8970d36 100644 --- a/Mage.Sets/src/mage/cards/h/HellkiteWhelp.java +++ b/Mage.Sets/src/mage/cards/h/HellkiteWhelp.java @@ -33,7 +33,7 @@ public final class HellkiteWhelp extends CardImpl { this.subtype.add(SubType.DRAGON); this.power = new MageInt(3); - this.toughness = new MageInt(34); + this.toughness = new MageInt(3); // Flying this.addAbility(FlyingAbility.getInstance()); diff --git a/Mage.Sets/src/mage/cards/h/HermitOfTheNatterknolls.java b/Mage.Sets/src/mage/cards/h/HermitOfTheNatterknolls.java index d59c7c88943..a1fe62de6bc 100644 --- a/Mage.Sets/src/mage/cards/h/HermitOfTheNatterknolls.java +++ b/Mage.Sets/src/mage/cards/h/HermitOfTheNatterknolls.java @@ -2,6 +2,7 @@ package mage.cards.h; import java.util.UUID; + import mage.MageInt; import mage.abilities.TriggeredAbility; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; @@ -15,27 +16,25 @@ import mage.abilities.effects.common.TransformSourceEffect; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.l.LoneWolfOfTheNatterknolls; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.TargetController; import mage.filter.FilterSpell; /** - * * @author LevelX2 */ public final class HermitOfTheNatterknolls extends CardImpl { public HermitOfTheNatterknolls(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.WEREWOLF); this.power = new MageInt(2); this.toughness = new MageInt(3); this.transformable = true; - this.secondSideCardClazz = LoneWolfOfTheNatterknolls.class; + this.secondSideCardClazz = mage.cards.l.LoneWolfOfTheNatterknolls.class; // Whenever an opponent casts a spell during your turn, draw a card. this.addAbility(new ConditionalTriggeredAbility( diff --git a/Mage.Sets/src/mage/cards/h/HinterlandLogger.java b/Mage.Sets/src/mage/cards/h/HinterlandLogger.java index 6634e00414a..9c7a8da1ab5 100644 --- a/Mage.Sets/src/mage/cards/h/HinterlandLogger.java +++ b/Mage.Sets/src/mage/cards/h/HinterlandLogger.java @@ -2,6 +2,7 @@ package mage.cards.h; import java.util.UUID; + import mage.MageInt; import mage.abilities.TriggeredAbility; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; @@ -11,26 +12,24 @@ import mage.abilities.effects.common.TransformSourceEffect; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.t.TimberShredder; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.TargetController; /** - * * @author fireshoes */ public final class HinterlandLogger extends CardImpl { public HinterlandLogger(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.WEREWOLF); this.power = new MageInt(2); this.toughness = new MageInt(1); this.transformable = true; - this.secondSideCardClazz = TimberShredder.class; + this.secondSideCardClazz = mage.cards.t.TimberShredder.class; // At the beginning of each upkeep, if no spells were cast last turn, transform Hinterland Logger. this.addAbility(new TransformAbility()); diff --git a/Mage.Sets/src/mage/cards/h/HuatliDinosaurKnight.java b/Mage.Sets/src/mage/cards/h/HuatliDinosaurKnight.java index eeb550f4912..1dce1556a24 100644 --- a/Mage.Sets/src/mage/cards/h/HuatliDinosaurKnight.java +++ b/Mage.Sets/src/mage/cards/h/HuatliDinosaurKnight.java @@ -4,7 +4,7 @@ package mage.cards.h; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.common.DamageWithPowerTargetEffect; import mage.abilities.effects.common.continuous.BoostControlledEffect; import mage.abilities.effects.common.counter.AddCountersTargetEffect; @@ -45,7 +45,7 @@ public final class HuatliDinosaurKnight extends CardImpl { addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.HUATLI); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(4)); // +2: Put two +1/+1 counters on up to one target Dinosaur you control. Ability ability = new LoyaltyAbility(new AddCountersTargetEffect(CounterType.P1P1.createInstance(2)) diff --git a/Mage.Sets/src/mage/cards/h/HuatliRadiantChampion.java b/Mage.Sets/src/mage/cards/h/HuatliRadiantChampion.java index 68ac6efba40..d873f788700 100644 --- a/Mage.Sets/src/mage/cards/h/HuatliRadiantChampion.java +++ b/Mage.Sets/src/mage/cards/h/HuatliRadiantChampion.java @@ -3,7 +3,7 @@ package mage.cards.h; import java.util.UUID; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; import mage.abilities.effects.common.GetEmblemEffect; import mage.abilities.effects.common.continuous.BoostTargetEffect; @@ -30,7 +30,7 @@ public final class HuatliRadiantChampion extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.HUATLI); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3)); // +1: Put a loyalty counter on Huatli, Radiant Champion for each creature you control. this.addAbility(new LoyaltyAbility(new AddCountersSourceEffect(CounterType.LOYALTY.createInstance(0), diff --git a/Mage.Sets/src/mage/cards/h/HuatliWarriorPoet.java b/Mage.Sets/src/mage/cards/h/HuatliWarriorPoet.java index 4bf79da2957..2cc5bf6d79b 100644 --- a/Mage.Sets/src/mage/cards/h/HuatliWarriorPoet.java +++ b/Mage.Sets/src/mage/cards/h/HuatliWarriorPoet.java @@ -5,7 +5,7 @@ import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; import mage.abilities.Mode; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.costs.Cost; import mage.abilities.costs.common.PayVariableLoyaltyCost; import mage.abilities.dynamicvalue.DynamicValue; @@ -26,7 +26,6 @@ import mage.constants.SuperType; import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.permanent.token.DinosaurToken; -import mage.players.Player; import mage.target.Target; import mage.target.common.TargetCreaturePermanentAmount; import mage.target.targetpointer.FixedTarget; @@ -43,7 +42,7 @@ public final class HuatliWarriorPoet extends CardImpl { addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.HUATLI); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3)); // +2: You gain life equal to the greatest power among creatures you control. this.addAbility(new LoyaltyAbility(new GainLifeEffect(new GreatestPowerAmongControlledCreaturesValue(), "You gain life equal to the greatest power among creatures you control"), 2)); diff --git a/Mage.Sets/src/mage/cards/h/HuntmasterOfTheFells.java b/Mage.Sets/src/mage/cards/h/HuntmasterOfTheFells.java index 9da3929dfe7..f639adeb9af 100644 --- a/Mage.Sets/src/mage/cards/h/HuntmasterOfTheFells.java +++ b/Mage.Sets/src/mage/cards/h/HuntmasterOfTheFells.java @@ -2,6 +2,7 @@ package mage.cards.h; import java.util.UUID; + import mage.MageInt; import mage.abilities.TriggeredAbility; import mage.abilities.TriggeredAbilityImpl; @@ -14,7 +15,6 @@ import mage.abilities.effects.common.TransformSourceEffect; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.r.RavagerOfTheFells; import mage.constants.*; import mage.game.Game; import mage.game.events.GameEvent; @@ -22,18 +22,17 @@ import mage.game.permanent.Permanent; import mage.game.permanent.token.WolfToken; /** - * * @author BetaSteward */ public final class HuntmasterOfTheFells extends CardImpl { public HuntmasterOfTheFells(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{R}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}{G}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.WEREWOLF); this.transformable = true; - this.secondSideCardClazz = RavagerOfTheFells.class; + this.secondSideCardClazz = mage.cards.r.RavagerOfTheFells.class; this.power = new MageInt(2); this.toughness = new MageInt(2); diff --git a/Mage.Sets/src/mage/cards/i/IceCauldron.java b/Mage.Sets/src/mage/cards/i/IceCauldron.java index bacaf44c115..9a340d91e9a 100644 --- a/Mage.Sets/src/mage/cards/i/IceCauldron.java +++ b/Mage.Sets/src/mage/cards/i/IceCauldron.java @@ -158,7 +158,7 @@ class IceCauldronCastFromExileEffect extends AsThoughEffectImpl { class IceCauldronNoteManaEffect extends OneShotEffect { - private static String manaUsedString; + private String manaUsedString; public IceCauldronNoteManaEffect() { super(Outcome.Benefit); @@ -167,6 +167,7 @@ class IceCauldronNoteManaEffect extends OneShotEffect { public IceCauldronNoteManaEffect(final IceCauldronNoteManaEffect effect) { super(effect); + manaUsedString = effect.manaUsedString; } @Override @@ -190,8 +191,8 @@ class IceCauldronNoteManaEffect extends OneShotEffect { class IceCauldronAddManaEffect extends ManaEffect { - private static Mana storedMana; - private static MageObjectReference exiledCardMor; + private Mana storedMana; + private MageObjectReference exiledCardMor; IceCauldronAddManaEffect() { super(); @@ -200,6 +201,8 @@ class IceCauldronAddManaEffect extends ManaEffect { IceCauldronAddManaEffect(IceCauldronAddManaEffect effect) { super(effect); + storedMana = effect.storedMana.copy(); + exiledCardMor = effect.exiledCardMor; } @Override diff --git a/Mage.Sets/src/mage/cards/i/InescapableBlaze.java b/Mage.Sets/src/mage/cards/i/InescapableBlaze.java index ddb5da25ab9..2aa756c1baf 100644 --- a/Mage.Sets/src/mage/cards/i/InescapableBlaze.java +++ b/Mage.Sets/src/mage/cards/i/InescapableBlaze.java @@ -17,8 +17,8 @@ public final class InescapableBlaze extends CardImpl { public InescapableBlaze(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{4}{R}{R}"); - // This spell can't be countered. - this.addAbility(new CantBeCounteredAbility()); + // This spell can't be countered. + this.addAbility(new CantBeCounteredAbility().setRuleAtTheTop(true)); // Inescapable Flame deals 6 damage to any target. this.getSpellAbility().addEffect(new DamageTargetEffect(6)); diff --git a/Mage.Sets/src/mage/cards/i/InspiringCommander.java b/Mage.Sets/src/mage/cards/i/InspiringCommander.java new file mode 100644 index 00000000000..ad50beeafcd --- /dev/null +++ b/Mage.Sets/src/mage/cards/i/InspiringCommander.java @@ -0,0 +1,59 @@ +package mage.cards.i; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.GainLifeEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.ComparisonType; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.mageobject.PowerPredicate; +import mage.filter.predicate.permanent.AnotherPredicate; + +import java.util.UUID; + +/** + * @author JayDi85 + */ +public final class InspiringCommander extends CardImpl { + + private static final FilterPermanent filter = new FilterControlledCreaturePermanent("another creature with power 2 or less"); + + static { + filter.add(new AnotherPredicate()); + filter.add(new PowerPredicate(ComparisonType.FEWER_THAN, 3)); + } + + public InspiringCommander(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{W}{W}"); + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.SOLDIER); + + this.power = new MageInt(1); + this.toughness = new MageInt(4); + + // Whenever another creature with power 2 or less enters the battlefield under your control, you gain 1 life and draw a card. + Effect effect1 = new GainLifeEffect(1); + Effect effect2 = new DrawCardSourceControllerEffect(1); + Ability ability = new EntersBattlefieldControlledTriggeredAbility( + Zone.BATTLEFIELD, effect1, filter, false); + ability.addEffect(effect2.setText("and draw a card")); + this.addAbility(ability); + } + + public InspiringCommander(final InspiringCommander card) { + super(card); + } + + @Override + public InspiringCommander copy() { + return new InspiringCommander(this); + } +} diff --git a/Mage.Sets/src/mage/cards/i/InstigatorGang.java b/Mage.Sets/src/mage/cards/i/InstigatorGang.java index acd165ce41e..7573aa13d2d 100644 --- a/Mage.Sets/src/mage/cards/i/InstigatorGang.java +++ b/Mage.Sets/src/mage/cards/i/InstigatorGang.java @@ -2,6 +2,7 @@ package mage.cards.i; import java.util.UUID; + import mage.MageInt; import mage.abilities.TriggeredAbility; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; @@ -15,7 +16,6 @@ import mage.abilities.effects.common.continuous.BoostControlledEffect; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.w.WildbloodPack; import mage.constants.*; import mage.filter.common.FilterAttackingCreature; @@ -25,20 +25,20 @@ import mage.filter.common.FilterAttackingCreature; public final class InstigatorGang extends CardImpl { public InstigatorGang(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.WEREWOLF); this.transformable = true; - this.secondSideCardClazz = WildbloodPack.class; + this.secondSideCardClazz = mage.cards.w.WildbloodPack.class; this.power = new MageInt(2); this.toughness = new MageInt(3); // Attacking creatures you control get +1/+0. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, - new ConditionalContinuousEffect(new BoostControlledEffect(1, 0, Duration.WhileOnBattlefield, new FilterAttackingCreature()), - new TransformedCondition(true), "Attacking creatures you control get +1/+0"))); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, + new ConditionalContinuousEffect(new BoostControlledEffect(1, 0, Duration.WhileOnBattlefield, new FilterAttackingCreature()), + new TransformedCondition(true), "Attacking creatures you control get +1/+0"))); // At the beginning of each upkeep, if no spells were cast last turn, transform Instigator Gang. diff --git a/Mage.Sets/src/mage/cards/i/IntegrityIntervention.java b/Mage.Sets/src/mage/cards/i/IntegrityIntervention.java index 0948c19d2fd..f258e069e84 100644 --- a/Mage.Sets/src/mage/cards/i/IntegrityIntervention.java +++ b/Mage.Sets/src/mage/cards/i/IntegrityIntervention.java @@ -33,7 +33,7 @@ public final class IntegrityIntervention extends SplitCard { // Intervention // Intervention deals 3 damage to any target and you gain 3 life. this.getRightHalfCard().getSpellAbility().addEffect( - new DamageTargetEffect(3) + new DamageTargetEffect(3).setText("Intervention deals 3 damage to any target") ); this.getRightHalfCard().getSpellAbility().addEffect( new GainLifeEffect(3).setText("and you gain 3 life") diff --git a/Mage.Sets/src/mage/cards/i/IntrusivePackbeast.java b/Mage.Sets/src/mage/cards/i/IntrusivePackbeast.java new file mode 100644 index 00000000000..622ac416ae6 --- /dev/null +++ b/Mage.Sets/src/mage/cards/i/IntrusivePackbeast.java @@ -0,0 +1,45 @@ +package mage.cards.i; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.TapTargetEffect; +import mage.constants.SubType; +import mage.abilities.keyword.VigilanceAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.target.common.TargetOpponentsCreaturePermanent; + +/** + * + * @author TheElk801 + */ +public final class IntrusivePackbeast extends CardImpl { + + public IntrusivePackbeast(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{W}"); + + this.subtype.add(SubType.BEAST); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Vigilance + this.addAbility(VigilanceAbility.getInstance()); + + // When Intrusive Packbeast enters the battlefield, tap up to two target creatures your opponents control. + Ability ability = new EntersBattlefieldTriggeredAbility(new TapTargetEffect()); + ability.addTarget(new TargetOpponentsCreaturePermanent(0, 2)); + this.addAbility(ability); + } + + public IntrusivePackbeast(final IntrusivePackbeast card) { + super(card); + } + + @Override + public IntrusivePackbeast copy() { + return new IntrusivePackbeast(this); + } +} diff --git a/Mage.Sets/src/mage/cards/i/InvertInvent.java b/Mage.Sets/src/mage/cards/i/InvertInvent.java index 9c957b4b044..fbeccdf652d 100644 --- a/Mage.Sets/src/mage/cards/i/InvertInvent.java +++ b/Mage.Sets/src/mage/cards/i/InvertInvent.java @@ -71,7 +71,7 @@ class InvertEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - for (UUID targetId : source.getTargets().get(0).getTargets()) { + for (UUID targetId : targetPointer.getTargets(game, source)) { ContinuousEffect effect = new SwitchPowerToughnessTargetEffect(Duration.EndOfTurn); effect.setTargetPointer(new FixedTarget(targetId, game)); game.addEffect(effect, source); diff --git a/Mage.Sets/src/mage/cards/i/Ionize.java b/Mage.Sets/src/mage/cards/i/Ionize.java index 4c89881a47e..ac7a6c3d469 100644 --- a/Mage.Sets/src/mage/cards/i/Ionize.java +++ b/Mage.Sets/src/mage/cards/i/Ionize.java @@ -9,7 +9,9 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; import mage.game.Game; +import mage.game.stack.Spell; import mage.players.Player; +import mage.target.TargetSpell; /** * @@ -21,6 +23,7 @@ public final class Ionize extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{U}{R}"); // Counter target spell. Ionize deals 2 damage to that spell's controller. + this.getSpellAbility().addTarget(new TargetSpell()); this.getSpellAbility().addEffect(new IonizeEffect()); } @@ -53,11 +56,16 @@ class IonizeEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(game.getControllerId(source.getSourceId())); - new CounterTargetEffect().apply(game, source); - if (player == null) { - return false; + boolean result = false; + Spell spell = game.getStack().getSpell(source.getFirstTarget()); + if (spell != null) { + Player spellController = game.getPlayer(spell.getControllerId()); + + result = game.getStack().counter(source.getFirstTarget(), source.getSourceId(), game); + if (spellController != null) { + spellController.damage(2, source.getSourceId(), game, false, true); + } } - return player.damage(2, source.getSourceId(), game, false, true) > 0; + return result; } } diff --git a/Mage.Sets/src/mage/cards/i/IsamaruHoundofKonda.java b/Mage.Sets/src/mage/cards/i/IsamaruHoundOfKonda.java similarity index 57% rename from Mage.Sets/src/mage/cards/i/IsamaruHoundofKonda.java rename to Mage.Sets/src/mage/cards/i/IsamaruHoundOfKonda.java index b37e399e450..35296f3e40e 100644 --- a/Mage.Sets/src/mage/cards/i/IsamaruHoundofKonda.java +++ b/Mage.Sets/src/mage/cards/i/IsamaruHoundOfKonda.java @@ -3,6 +3,7 @@ package mage.cards.i; import java.util.UUID; + import mage.MageInt; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -11,13 +12,12 @@ import mage.constants.SubType; import mage.constants.SuperType; /** - * * @author Loki */ -public final class IsamaruHoundofKonda extends CardImpl { +public final class IsamaruHoundOfKonda extends CardImpl { - public IsamaruHoundofKonda (UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{W}"); + public IsamaruHoundOfKonda(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{W}"); this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.HOUND); @@ -25,13 +25,13 @@ public final class IsamaruHoundofKonda extends CardImpl { this.toughness = new MageInt(2); } - public IsamaruHoundofKonda (final IsamaruHoundofKonda card) { + public IsamaruHoundOfKonda(final IsamaruHoundOfKonda card) { super(card); } @Override - public IsamaruHoundofKonda copy() { - return new IsamaruHoundofKonda(this); + public IsamaruHoundOfKonda copy() { + return new IsamaruHoundOfKonda(this); } } diff --git a/Mage.Sets/src/mage/cards/j/JaceArchitectOfThought.java b/Mage.Sets/src/mage/cards/j/JaceArchitectOfThought.java index efd444476fe..09ebb7644ef 100644 --- a/Mage.Sets/src/mage/cards/j/JaceArchitectOfThought.java +++ b/Mage.Sets/src/mage/cards/j/JaceArchitectOfThought.java @@ -8,7 +8,7 @@ import mage.MageObjectReference; import mage.abilities.Ability; import mage.abilities.DelayedTriggeredAbility; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.continuous.BoostTargetEffect; @@ -50,7 +50,7 @@ public final class JaceArchitectOfThought extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.JACE); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(4)); // +1: Until your next turn, whenever a creature an opponent controls attacks, it gets -1/-0 until end of turn. this.addAbility(new LoyaltyAbility(new JaceArchitectOfThoughtStartEffect1(), 1)); diff --git a/Mage.Sets/src/mage/cards/j/JaceBeleren.java b/Mage.Sets/src/mage/cards/j/JaceBeleren.java index 984abe74533..03be57089d2 100644 --- a/Mage.Sets/src/mage/cards/j/JaceBeleren.java +++ b/Mage.Sets/src/mage/cards/j/JaceBeleren.java @@ -3,7 +3,7 @@ package mage.cards.j; import java.util.UUID; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.common.DrawCardAllEffect; import mage.abilities.effects.common.DrawCardTargetEffect; import mage.abilities.effects.common.PutLibraryIntoGraveTargetEffect; @@ -25,7 +25,7 @@ public final class JaceBeleren extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.JACE); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3)); // +2: Each player draws a card. this.addAbility(new LoyaltyAbility(new DrawCardAllEffect(1), 2)); diff --git a/Mage.Sets/src/mage/cards/j/JaceCunningCastaway.java b/Mage.Sets/src/mage/cards/j/JaceCunningCastaway.java index e5b52f876da..f4bd134f436 100644 --- a/Mage.Sets/src/mage/cards/j/JaceCunningCastaway.java +++ b/Mage.Sets/src/mage/cards/j/JaceCunningCastaway.java @@ -7,7 +7,7 @@ import java.util.UUID; import mage.abilities.Ability; import mage.abilities.DelayedTriggeredAbility; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.DrawDiscardControllerEffect; @@ -38,7 +38,7 @@ public final class JaceCunningCastaway extends CardImpl { addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.JACE); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3)); // +1: Whenever one or more creatures you control deal combat damage to a player this turn, draw a card, then discard a card. this.addAbility(new LoyaltyAbility(new JaceCunningCastawayEffect1(), 1)); diff --git a/Mage.Sets/src/mage/cards/j/JaceIngeniousMindMage.java b/Mage.Sets/src/mage/cards/j/JaceIngeniousMindMage.java index 23e7d33494b..19068d72eca 100644 --- a/Mage.Sets/src/mage/cards/j/JaceIngeniousMindMage.java +++ b/Mage.Sets/src/mage/cards/j/JaceIngeniousMindMage.java @@ -4,7 +4,7 @@ package mage.cards.j; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.UntapAllControllerEffect; import mage.abilities.effects.common.continuous.GainControlTargetEffect; @@ -29,7 +29,7 @@ public final class JaceIngeniousMindMage extends CardImpl { addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.JACE); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(5)); // +1: Draw a card. this.addAbility(new LoyaltyAbility(new DrawCardSourceControllerEffect(1), 1)); diff --git a/Mage.Sets/src/mage/cards/j/JaceMemoryAdept.java b/Mage.Sets/src/mage/cards/j/JaceMemoryAdept.java index 6bd0ceee32a..dea93de4faf 100644 --- a/Mage.Sets/src/mage/cards/j/JaceMemoryAdept.java +++ b/Mage.Sets/src/mage/cards/j/JaceMemoryAdept.java @@ -5,7 +5,7 @@ import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; import mage.abilities.Mode; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.DrawCardTargetEffect; import mage.abilities.effects.common.PutLibraryIntoGraveTargetEffect; @@ -28,7 +28,7 @@ public final class JaceMemoryAdept extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.JACE); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(4)); // +1: Draw a card. Target player puts the top card of their library into their graveyard. LoyaltyAbility ability1 = new LoyaltyAbility(new DrawCardSourceControllerEffect(1), 1); diff --git a/Mage.Sets/src/mage/cards/j/JaceTelepathUnbound.java b/Mage.Sets/src/mage/cards/j/JaceTelepathUnbound.java index 14e02e4074c..e9504663f37 100644 --- a/Mage.Sets/src/mage/cards/j/JaceTelepathUnbound.java +++ b/Mage.Sets/src/mage/cards/j/JaceTelepathUnbound.java @@ -4,7 +4,7 @@ package mage.cards.j; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.AsThoughEffectImpl; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.Effect; @@ -47,7 +47,7 @@ public final class JaceTelepathUnbound extends CardImpl { this.nightCard = true; this.transformable = true; - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(5)); // +1: Up to one target creature gets -2/-0 until your next turn. Effect effect = new BoostTargetEffect(-2, 0, Duration.UntilYourNextTurn); diff --git a/Mage.Sets/src/mage/cards/j/JaceTheLivingGuildpact.java b/Mage.Sets/src/mage/cards/j/JaceTheLivingGuildpact.java index bf09d707176..089eb700031 100644 --- a/Mage.Sets/src/mage/cards/j/JaceTheLivingGuildpact.java +++ b/Mage.Sets/src/mage/cards/j/JaceTheLivingGuildpact.java @@ -2,7 +2,7 @@ package mage.cards.j; import java.util.UUID; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.Effect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; @@ -38,7 +38,7 @@ public final class JaceTheLivingGuildpact extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.JACE); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(5)); // +1: Look at the top two cards of your library. Put one of them into your graveyard. Effect effect = new LookLibraryAndPickControllerEffect( diff --git a/Mage.Sets/src/mage/cards/j/JaceTheMindSculptor.java b/Mage.Sets/src/mage/cards/j/JaceTheMindSculptor.java index 67f7da7865e..a823f6d0305 100644 --- a/Mage.Sets/src/mage/cards/j/JaceTheMindSculptor.java +++ b/Mage.Sets/src/mage/cards/j/JaceTheMindSculptor.java @@ -4,7 +4,7 @@ package mage.cards.j; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.BrainstormEffect; import mage.abilities.effects.common.ReturnToHandTargetEffect; @@ -33,7 +33,7 @@ public final class JaceTheMindSculptor extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.JACE); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3)); // +2: Look at the top card of target player's library. You may put that card on the bottom of that player's library. LoyaltyAbility ability1 = new LoyaltyAbility(new JaceTheMindSculptorEffect1(), 2); diff --git a/Mage.Sets/src/mage/cards/j/JaceUnravelerOfSecrets.java b/Mage.Sets/src/mage/cards/j/JaceUnravelerOfSecrets.java index c54f4d29cdc..befc49112ba 100644 --- a/Mage.Sets/src/mage/cards/j/JaceUnravelerOfSecrets.java +++ b/Mage.Sets/src/mage/cards/j/JaceUnravelerOfSecrets.java @@ -4,7 +4,7 @@ package mage.cards.j; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.GetEmblemEffect; @@ -31,7 +31,7 @@ public final class JaceUnravelerOfSecrets extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.JACE); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(5)); // +1: Scry 1, then draw a card. Ability ability = new LoyaltyAbility(new ScryEffect(1), 1); diff --git a/Mage.Sets/src/mage/cards/j/JalumGrifter.java b/Mage.Sets/src/mage/cards/j/JalumGrifter.java new file mode 100644 index 00000000000..170fcb2cd06 --- /dev/null +++ b/Mage.Sets/src/mage/cards/j/JalumGrifter.java @@ -0,0 +1,142 @@ + +package mage.cards.j; + +import java.util.ArrayList; +import java.util.Collections; +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.CardSetInfo; +import mage.cards.CardsImpl; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Outcome; +import mage.constants.SuperType; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.common.FilterControlledLandPermanent; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.Target; +import mage.target.TargetCard; +import mage.target.TargetPermanent; +import mage.target.common.TargetControlledPermanent; +import mage.target.common.TargetOpponent; + +/** + * + * @author L_J + */ +public final class JalumGrifter extends CardImpl { + + public JalumGrifter(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{R}{R}"); + this.addSuperType(SuperType.LEGENDARY); + this.subtype.add(SubType.DEVIL); + this.power = new MageInt(3); + this.toughness = new MageInt(5); + + // {1}{R}, {T}: Shuffle Jalum Grifter and two lands you control face down. Target opponent chooses one of those cards. Turn the cards face up. If they chose Jalum Grifter, sacrifice it. Otherwise, destroy target permanent. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new JalumGrifterEffect(), new ManaCostsImpl("{1}{R}")); + ability.addCost(new TapSourceCost()); + ability.addTarget(new TargetOpponent()); + ability.addTarget(new TargetPermanent()); + this.addAbility(ability); + } + + public JalumGrifter(final JalumGrifter card) { + super(card); + } + + @Override + public JalumGrifter copy() { + return new JalumGrifter(this); + } +} + +class JalumGrifterEffect extends OneShotEffect { + + public JalumGrifterEffect() { + super(Outcome.DestroyPermanent); + this.staticText = "Shuffle {this} and two lands you control face down. Target opponent chooses one of those cards. Turn the cards face up. If they chose {this}, sacrifice it. Otherwise, destroy target permanent"; + } + + public JalumGrifterEffect(final JalumGrifterEffect effect) { + super(effect); + } + + @Override + public JalumGrifterEffect copy() { + return new JalumGrifterEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + + Player controller = game.getPlayer(source.getControllerId()); + Player opponent = game.getPlayer(source.getTargets().get(0).getFirstTarget()); + if (controller != null && opponent != null) { + List shellGamePile = new ArrayList<>(); + Card sourceCard = game.getCard(source.getSourceId()); + if (sourceCard != null) { + sourceCard = sourceCard.copy(); + sourceCard.setFaceDown(true, game); + shellGamePile.add(sourceCard); + game.informPlayers(controller.getLogName() + " turns " + sourceCard.getLogName() + " face down"); + } + + Target target = new TargetControlledPermanent(2, 2, new FilterControlledLandPermanent(), true); + if (target.canChoose(source.getSourceId(), controller.getId(), game)) { + while (!target.isChosen() && target.canChoose(controller.getId(), game) && controller.canRespond()) { + controller.chooseTarget(outcome, target, source, game); + } + } + + for (UUID cardId: target.getTargets()) { + Card card = game.getCard(cardId); + if (card != null) { + card = card.copy(); + card.setFaceDown(true, game); + shellGamePile.add(card); + game.informPlayers(controller.getLogName() + " turns " + card.getLogName() + " face down"); + } + } + if (shellGamePile.isEmpty()) { + return true; + } + Collections.shuffle(shellGamePile); + game.informPlayers(controller.getLogName() + " shuffles the face-down pile"); + TargetCard targetCard = new TargetCard(Zone.HAND, new FilterCard()); + CardsImpl cards = new CardsImpl(); + cards.addAll(shellGamePile); + if (opponent.choose(Outcome.Sacrifice, cards, targetCard, game)) { + Card card = game.getCard(targetCard.getFirstTarget()); + if (card != null) { + card.setFaceDown(false, game); + game.informPlayers(opponent.getLogName() + " reveals " + card.getLogName()); + if (card.getId().equals(sourceCard.getId())) { + Permanent sourcePermanent = game.getPermanent(source.getSourceId()); + if (sourcePermanent != null) { + sourcePermanent.sacrifice(source.getSourceId(), game); + } + } else { + Permanent permanent = game.getPermanent(source.getTargets().get(1).getFirstTarget()); + if (permanent != null) { + permanent.destroy(source.getSourceId(), game, false); + } + } + } + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/j/JayaBallard.java b/Mage.Sets/src/mage/cards/j/JayaBallard.java index a0a40ce78fe..7d7e86c13e5 100644 --- a/Mage.Sets/src/mage/cards/j/JayaBallard.java +++ b/Mage.Sets/src/mage/cards/j/JayaBallard.java @@ -5,7 +5,7 @@ import java.util.UUID; import mage.Mana; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.mana.AddConditionalManaEffect; import mage.abilities.effects.common.GetEmblemEffect; @@ -35,7 +35,7 @@ public final class JayaBallard extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.JAYA); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(5)); // +1: Add {R}{R}{R}. Spend this mana only to cast instant or sorcery spells. this.addAbility(new LoyaltyAbility(new AddConditionalManaEffect(Mana.RedMana(3), new InstantOrSorcerySpellManaBuilder()), 1)); diff --git a/Mage.Sets/src/mage/cards/j/JeweledAmulet.java b/Mage.Sets/src/mage/cards/j/JeweledAmulet.java index 03605a31054..203b634bdd6 100644 --- a/Mage.Sets/src/mage/cards/j/JeweledAmulet.java +++ b/Mage.Sets/src/mage/cards/j/JeweledAmulet.java @@ -60,7 +60,7 @@ public final class JeweledAmulet extends CardImpl { class JeweledAmuletAddCounterEffect extends OneShotEffect { - private static String manaUsedString; + private String manaUsedString; public JeweledAmuletAddCounterEffect() { super(Outcome.Benefit); @@ -69,6 +69,7 @@ class JeweledAmuletAddCounterEffect extends OneShotEffect { public JeweledAmuletAddCounterEffect(final JeweledAmuletAddCounterEffect effect) { super(effect); + manaUsedString = effect.manaUsedString; } @Override @@ -93,7 +94,7 @@ class JeweledAmuletAddCounterEffect extends OneShotEffect { class JeweledAmuletAddManaEffect extends ManaEffect { - private static Mana storedMana; + private Mana storedMana; JeweledAmuletAddManaEffect() { super(); @@ -102,6 +103,7 @@ class JeweledAmuletAddManaEffect extends ManaEffect { JeweledAmuletAddManaEffect(JeweledAmuletAddManaEffect effect) { super(effect); + storedMana = effect.storedMana; } @Override diff --git a/Mage.Sets/src/mage/cards/j/JiangYanggu.java b/Mage.Sets/src/mage/cards/j/JiangYanggu.java index baea575ed9e..39f6babd294 100644 --- a/Mage.Sets/src/mage/cards/j/JiangYanggu.java +++ b/Mage.Sets/src/mage/cards/j/JiangYanggu.java @@ -4,7 +4,7 @@ package mage.cards.j; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.condition.InvertCondition; import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; import mage.abilities.decorator.ConditionalOneShotEffect; @@ -43,7 +43,7 @@ public final class JiangYanggu extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.YANGGU); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(4)); // +1: Target creature gets +2/+2 until end of turn. Ability ability = new LoyaltyAbility(new BoostTargetEffect(2, 2, Duration.EndOfTurn), 1); diff --git a/Mage.Sets/src/mage/cards/j/JourneyToEternity.java b/Mage.Sets/src/mage/cards/j/JourneyToEternity.java index 365534cf3a5..0f735f1380e 100644 --- a/Mage.Sets/src/mage/cards/j/JourneyToEternity.java +++ b/Mage.Sets/src/mage/cards/j/JourneyToEternity.java @@ -2,6 +2,7 @@ package mage.cards.j; import java.util.UUID; + import mage.abilities.Ability; import mage.abilities.common.DiesAttachedTriggeredAbility; import mage.abilities.effects.OneShotEffect; @@ -12,7 +13,6 @@ import mage.abilities.keyword.TransformAbility; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.a.AtzalCaveOfEternity; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SubType; @@ -24,7 +24,6 @@ import mage.players.Player; import mage.target.TargetPermanent; /** - * * @author LevelX2 */ public final class JourneyToEternity extends CardImpl { @@ -36,7 +35,7 @@ public final class JourneyToEternity extends CardImpl { this.subtype.add(SubType.AURA); this.transformable = true; - this.secondSideCardClazz = AtzalCaveOfEternity.class; + this.secondSideCardClazz = mage.cards.a.AtzalCaveOfEternity.class; // Enchant creature you control TargetPermanent auraTarget = new TargetPermanent(StaticFilters.FILTER_PERMANENT_CREATURE_CONTROLLED); diff --git a/Mage.Sets/src/mage/cards/j/JumboImp.java b/Mage.Sets/src/mage/cards/j/JumboImp.java index 866ac3ed128..027d8f95123 100644 --- a/Mage.Sets/src/mage/cards/j/JumboImp.java +++ b/Mage.Sets/src/mage/cards/j/JumboImp.java @@ -78,7 +78,7 @@ class JumboImpEffect extends EntersBattlefieldWithXCountersEffect { Permanent permanent = game.getPermanentEntering(source.getSourceId()); if (controller != null && permanent != null) { int amount = controller.rollDice(game, 6); - ArrayList appliedEffects = (ArrayList) this.getValue("appldiedEffects"); // the basic event is the EntersBattlefieldEvent, so use already applied replacement effects from that event + ArrayList appliedEffects = (ArrayList) this.getValue("appliedEffects"); // the basic event is the EntersBattlefieldEvent, so use already applied replacement effects from that event permanent.addCounters(CounterType.P1P1.createInstance(amount), source, game, appliedEffects); return super.apply(game, source); } diff --git a/Mage.Sets/src/mage/cards/k/KarnLiberated.java b/Mage.Sets/src/mage/cards/k/KarnLiberated.java index dc7a656eab9..2cecf73c709 100644 --- a/Mage.Sets/src/mage/cards/k/KarnLiberated.java +++ b/Mage.Sets/src/mage/cards/k/KarnLiberated.java @@ -8,7 +8,7 @@ import mage.MageObject; import mage.abilities.Ability; import mage.abilities.DelayedTriggeredAbility; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.ExileTargetForSourceEffect; import mage.cards.Card; @@ -44,7 +44,7 @@ public final class KarnLiberated extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{7}"); this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.KARN); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(6)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(6)); // +4: Target player exiles a card from their hand. LoyaltyAbility ability1 = new LoyaltyAbility(new KarnPlayerExileEffect(), 4); diff --git a/Mage.Sets/src/mage/cards/k/KarnScionOfUrza.java b/Mage.Sets/src/mage/cards/k/KarnScionOfUrza.java index 7fc485e7150..c0a7719c656 100644 --- a/Mage.Sets/src/mage/cards/k/KarnScionOfUrza.java +++ b/Mage.Sets/src/mage/cards/k/KarnScionOfUrza.java @@ -8,7 +8,7 @@ import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateTokenEffect; import mage.cards.Card; @@ -43,7 +43,7 @@ public final class KarnScionOfUrza extends CardImpl { addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.KARN); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(5)); // +1: Reveal the top two cards of your library. An opponent chooses one of them. Put that card into your hand and exile the other with a silver counter on it. LoyaltyAbility ability1 = new LoyaltyAbility(new KarnPlus1Effect(), 1); diff --git a/Mage.Sets/src/mage/cards/k/KayaGhostAssassin.java b/Mage.Sets/src/mage/cards/k/KayaGhostAssassin.java index eb691fcef93..62b4c1298b8 100644 --- a/Mage.Sets/src/mage/cards/k/KayaGhostAssassin.java +++ b/Mage.Sets/src/mage/cards/k/KayaGhostAssassin.java @@ -4,7 +4,7 @@ package mage.cards.k; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.common.delayed.AtTheBeginOfYourNextUpkeepDelayedTriggeredAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; @@ -41,7 +41,7 @@ public final class KayaGhostAssassin extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.KAYA); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(5)); // 0: Exile Kaya, Ghost Assassin or up to one target creature. Return that card to the battlefield under its owner's control at the beginning of your next upkeep. // You lose 2 life. diff --git a/Mage.Sets/src/mage/cards/k/KeeperOfTheLens.java b/Mage.Sets/src/mage/cards/k/KeeperOfTheLens.java index 69e367d07a9..bffa37ce840 100644 --- a/Mage.Sets/src/mage/cards/k/KeeperOfTheLens.java +++ b/Mage.Sets/src/mage/cards/k/KeeperOfTheLens.java @@ -1,7 +1,6 @@ package mage.cards.k; -import java.util.UUID; import mage.MageInt; import mage.MageObject; import mage.abilities.Ability; @@ -12,11 +11,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.cards.Cards; import mage.cards.CardsImpl; -import mage.constants.CardType; -import mage.constants.SubType; -import mage.constants.Outcome; -import mage.constants.TargetController; -import mage.constants.Zone; +import mage.constants.*; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.other.FaceDownPredicate; import mage.filter.predicate.permanent.ControllerPredicate; @@ -25,21 +20,22 @@ import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetCreaturePermanent; +import java.util.UUID; + /** - * * @author LevelX2 */ public final class KeeperOfTheLens extends CardImpl { public KeeperOfTheLens(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT,CardType.CREATURE},"{1}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{1}"); this.subtype.add(SubType.GOLEM); this.power = new MageInt(1); this.toughness = new MageInt(2); // You may look at face-down creatures you don't control. // TODO: this should be a static abilitie and not use activated abilities (because it could than be restriced) - this.addAbility(new KeeperOfTheLensLookFaceDownAbility()); + this.addAbility(new KeeperOfTheLensLookFaceDownAbility()); } public KeeperOfTheLens(final KeeperOfTheLens card) { @@ -82,7 +78,7 @@ class KeeperOfTheLensLookFaceDownEffect extends OneShotEffect { public KeeperOfTheLensLookFaceDownEffect() { super(Outcome.Benefit); - this.staticText = "You may look at face-down creatures you don't control"; + this.staticText = "You may look at face-down creatures you don't control any time"; } public KeeperOfTheLensLookFaceDownEffect(final KeeperOfTheLensLookFaceDownEffect effect) { @@ -96,7 +92,7 @@ class KeeperOfTheLensLookFaceDownEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player controller= game.getPlayer(source.getControllerId()); + Player controller = game.getPlayer(source.getControllerId()); MageObject mageObject = game.getObject(source.getSourceId()); if (controller == null || mageObject == null) { return false; diff --git a/Mage.Sets/src/mage/cards/k/KessigForgemaster.java b/Mage.Sets/src/mage/cards/k/KessigForgemaster.java index 106b0024a52..c8ffa6637f8 100644 --- a/Mage.Sets/src/mage/cards/k/KessigForgemaster.java +++ b/Mage.Sets/src/mage/cards/k/KessigForgemaster.java @@ -2,6 +2,7 @@ package mage.cards.k; import java.util.UUID; + import mage.MageInt; import mage.abilities.TriggeredAbility; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; @@ -13,14 +14,12 @@ import mage.abilities.effects.common.TransformSourceEffect; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.f.FlameheartWerewolf; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.TargetController; import mage.filter.StaticFilters; /** - * * @author LevelX2 */ public final class KessigForgemaster extends CardImpl { @@ -34,7 +33,7 @@ public final class KessigForgemaster extends CardImpl { this.toughness = new MageInt(1); this.transformable = true; - this.secondSideCardClazz = FlameheartWerewolf.class; + this.secondSideCardClazz = mage.cards.f.FlameheartWerewolf.class; // Whenever Kessig Forgemaster blocks or becomes blocked by a creature, Kessig Forgemaster deals 1 damage to that creature. this.addAbility(new BlocksOrBecomesBlockedTriggeredAbility(new DamageTargetEffect(1, true, "that creature"), diff --git a/Mage.Sets/src/mage/cards/k/KessigProwler.java b/Mage.Sets/src/mage/cards/k/KessigProwler.java index 50bfd528d1f..7ead3554b4a 100644 --- a/Mage.Sets/src/mage/cards/k/KessigProwler.java +++ b/Mage.Sets/src/mage/cards/k/KessigProwler.java @@ -2,6 +2,7 @@ package mage.cards.k; import java.util.UUID; + import mage.MageInt; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; @@ -9,26 +10,24 @@ import mage.abilities.effects.common.TransformSourceEffect; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.s.SinuousPredator; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Zone; /** - * * @author fireshoes */ public final class KessigProwler extends CardImpl { public KessigProwler(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{G}"); this.subtype.add(SubType.WEREWOLF); this.subtype.add(SubType.HORROR); this.power = new MageInt(2); this.toughness = new MageInt(1); this.transformable = true; - this.secondSideCardClazz = SinuousPredator.class; + this.secondSideCardClazz = mage.cards.s.SinuousPredator.class; // {4}{G}: Transform Kessig Prowler. this.addAbility(new TransformAbility()); diff --git a/Mage.Sets/src/mage/cards/k/KindlyStranger.java b/Mage.Sets/src/mage/cards/k/KindlyStranger.java index f2456683ba5..5a738cd6c23 100644 --- a/Mage.Sets/src/mage/cards/k/KindlyStranger.java +++ b/Mage.Sets/src/mage/cards/k/KindlyStranger.java @@ -2,6 +2,7 @@ package mage.cards.k; import java.util.UUID; + import mage.MageInt; import mage.abilities.condition.common.DeliriumCondition; import mage.abilities.costs.mana.ManaCostsImpl; @@ -10,25 +11,23 @@ import mage.abilities.effects.common.TransformSourceEffect; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.d.DemonPossessedWitch; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Zone; /** - * * @author fireshoes */ public final class KindlyStranger extends CardImpl { public KindlyStranger(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}"); this.subtype.add(SubType.HUMAN); this.power = new MageInt(2); this.toughness = new MageInt(3); this.transformable = true; - this.secondSideCardClazz = DemonPossessedWitch.class; + this.secondSideCardClazz = mage.cards.d.DemonPossessedWitch.class; // Delirium — {2}{B}: Transform Kindly Stranger. Activate this ability only if there are four or more card types among cards in your graveyard. this.addAbility(new TransformAbility()); diff --git a/Mage.Sets/src/mage/cards/k/KindredCharge.java b/Mage.Sets/src/mage/cards/k/KindredCharge.java index 1f15370a375..7702fbfbb77 100644 --- a/Mage.Sets/src/mage/cards/k/KindredCharge.java +++ b/Mage.Sets/src/mage/cards/k/KindredCharge.java @@ -69,7 +69,7 @@ class KindredChargeEffect extends OneShotEffect { Player controller = game.getPlayer(source.getControllerId()); MageObject sourceObject = game.getObject(source.getSourceId()); if (controller != null && sourceObject != null) { - SubType subType = ChooseCreatureTypeEffect.getChoosenCreatureType(source.getSourceId(), game); + SubType subType = ChooseCreatureTypeEffect.getChosenCreatureType(source.getSourceId(), game); if (subType != null) { FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("creature you control of the chosen type"); filter.add(new SubtypePredicate(subType)); diff --git a/Mage.Sets/src/mage/cards/k/KindredSummons.java b/Mage.Sets/src/mage/cards/k/KindredSummons.java index e317062a4c5..7854b94e6ae 100644 --- a/Mage.Sets/src/mage/cards/k/KindredSummons.java +++ b/Mage.Sets/src/mage/cards/k/KindredSummons.java @@ -70,7 +70,7 @@ class KindredSummonsEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - SubType subType = ChooseCreatureTypeEffect.getChoosenCreatureType(source.getSourceId(), game); + SubType subType = ChooseCreatureTypeEffect.getChosenCreatureType(source.getSourceId(), game); if (subType == null) { return false; } diff --git a/Mage.Sets/src/mage/cards/k/KioraMasterOfTheDepths.java b/Mage.Sets/src/mage/cards/k/KioraMasterOfTheDepths.java index 8bcb8911868..d42bd45c4ac 100644 --- a/Mage.Sets/src/mage/cards/k/KioraMasterOfTheDepths.java +++ b/Mage.Sets/src/mage/cards/k/KioraMasterOfTheDepths.java @@ -5,7 +5,7 @@ import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateTokenEffect; @@ -44,7 +44,7 @@ public final class KioraMasterOfTheDepths extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.KIORA); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(4)); // +1: Untap up to one target creature and up to one target land. LoyaltyAbility ability1 = new LoyaltyAbility(new KioraUntapEffect(), 1); diff --git a/Mage.Sets/src/mage/cards/k/KioraTheCrashingWave.java b/Mage.Sets/src/mage/cards/k/KioraTheCrashingWave.java index d490179f71b..9e80d8f280f 100644 --- a/Mage.Sets/src/mage/cards/k/KioraTheCrashingWave.java +++ b/Mage.Sets/src/mage/cards/k/KioraTheCrashingWave.java @@ -4,7 +4,7 @@ package mage.cards.k; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.PreventionEffectImpl; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.GetEmblemEffect; @@ -43,7 +43,7 @@ public final class KioraTheCrashingWave extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.KIORA); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(2)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(2)); // +1: Until your next turn, prevent all damage that would be dealt to and dealt by target permanent an opponent controls. LoyaltyAbility ability = new LoyaltyAbility(new KioraPreventionEffect(), 1); diff --git a/Mage.Sets/src/mage/cards/k/KothOfTheHammer.java b/Mage.Sets/src/mage/cards/k/KothOfTheHammer.java index 7112a951b9c..557c50aaa58 100644 --- a/Mage.Sets/src/mage/cards/k/KothOfTheHammer.java +++ b/Mage.Sets/src/mage/cards/k/KothOfTheHammer.java @@ -6,7 +6,7 @@ import mage.MageInt; import mage.Mana; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; import mage.abilities.effects.mana.DynamicManaEffect; import mage.abilities.effects.common.GetEmblemEffect; @@ -24,7 +24,6 @@ import mage.filter.predicate.mageobject.SubtypePredicate; import mage.filter.predicate.permanent.ControllerPredicate; import mage.game.command.emblems.KothOfTheHammerEmblem; import mage.game.permanent.token.TokenImpl; -import mage.game.permanent.token.Token; import mage.target.common.TargetLandPermanent; /** @@ -46,7 +45,7 @@ public final class KothOfTheHammer extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.KOTH); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3)); // +1: Untap target Mountain. It becomes a 4/4 red Elemental creature until end of turn. It's still a land. Ability ability = new LoyaltyAbility(new UntapTargetEffect(), 1); diff --git a/Mage.Sets/src/mage/cards/k/KraulForagers.java b/Mage.Sets/src/mage/cards/k/KraulForagers.java index ffb5e6200fb..46f375ee324 100644 --- a/Mage.Sets/src/mage/cards/k/KraulForagers.java +++ b/Mage.Sets/src/mage/cards/k/KraulForagers.java @@ -5,10 +5,11 @@ import mage.MageInt; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.dynamicvalue.common.CardsInControllerGraveyardCount; import mage.abilities.effects.common.GainLifeEffect; -import mage.constants.SubType; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.common.FilterCreatureCard; /** * @@ -26,7 +27,7 @@ public final class KraulForagers extends CardImpl { // Undergrowth — When Kraul Foragers enters the battlefield, you gain 1 life for each creature card in your graveyard. this.addAbility(new EntersBattlefieldTriggeredAbility( - new GainLifeEffect(new CardsInControllerGraveyardCount()), + new GainLifeEffect(new CardsInControllerGraveyardCount(new FilterCreatureCard())), false, "Undergrowth — " )); } diff --git a/Mage.Sets/src/mage/cards/k/KraulHarpooner.java b/Mage.Sets/src/mage/cards/k/KraulHarpooner.java index d3a2e8575f2..5e63d8ff12c 100644 --- a/Mage.Sets/src/mage/cards/k/KraulHarpooner.java +++ b/Mage.Sets/src/mage/cards/k/KraulHarpooner.java @@ -96,6 +96,7 @@ class KraulHarpoonerEffect extends OneShotEffect { } int xValue = player.getGraveyard().count(StaticFilters.FILTER_CARD_CREATURE, game); game.addEffect(new BoostSourceEffect(xValue, 0, Duration.EndOfTurn), source); + game.applyEffects(); Permanent creature = game.getPermanent(source.getFirstTarget()); if (creature == null || !player.chooseUse(outcome, "Have " + sourcePerm.getLogName() + " fight " + creature.getLogName() + "?", source, game)) { return true; diff --git a/Mage.Sets/src/mage/cards/k/KraulRaider.java b/Mage.Sets/src/mage/cards/k/KraulRaider.java new file mode 100644 index 00000000000..74fd9eb2eb2 --- /dev/null +++ b/Mage.Sets/src/mage/cards/k/KraulRaider.java @@ -0,0 +1,37 @@ +package mage.cards.k; + +import java.util.UUID; +import mage.MageInt; +import mage.constants.SubType; +import mage.abilities.keyword.MenaceAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author TheElk801 + */ +public final class KraulRaider extends CardImpl { + + public KraulRaider(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}"); + + this.subtype.add(SubType.INSECT); + this.subtype.add(SubType.WARRIOR); + this.power = new MageInt(2); + this.toughness = new MageInt(3); + + // Menace + this.addAbility(new MenaceAbility()); + } + + public KraulRaider(final KraulRaider card) { + super(card); + } + + @Override + public KraulRaider copy() { + return new KraulRaider(this); + } +} diff --git a/Mage.Sets/src/mage/cards/k/KraulSwarm.java b/Mage.Sets/src/mage/cards/k/KraulSwarm.java new file mode 100644 index 00000000000..64b86f8ebec --- /dev/null +++ b/Mage.Sets/src/mage/cards/k/KraulSwarm.java @@ -0,0 +1,56 @@ +package mage.cards.k; + +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.mana.ManaCostsImpl; +import mage.abilities.effects.common.ReturnSourceFromGraveyardToHandEffect; +import mage.constants.SubType; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Zone; +import mage.filter.StaticFilters; +import mage.target.common.TargetCardInHand; + +/** + * + * @author TheElk801 + */ +public final class KraulSwarm extends CardImpl { + + public KraulSwarm(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{B}"); + + this.subtype.add(SubType.INSECT); + this.subtype.add(SubType.WARRIOR); + this.power = new MageInt(4); + this.toughness = new MageInt(1); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // {2}{B}, Discard a creature card: Return Kraul Swarm from your graveyard to your hand. + Ability ability = new SimpleActivatedAbility( + Zone.GRAVEYARD, + new ReturnSourceFromGraveyardToHandEffect(), + new ManaCostsImpl("{2}{B}") + ); + ability.addCost(new DiscardTargetCost( + new TargetCardInHand(StaticFilters.FILTER_CARD_CREATURE_A) + )); + this.addAbility(ability); + } + + public KraulSwarm(final KraulSwarm card) { + super(card); + } + + @Override + public KraulSwarm copy() { + return new KraulSwarm(this); + } +} diff --git a/Mage.Sets/src/mage/cards/k/KruinOutlaw.java b/Mage.Sets/src/mage/cards/k/KruinOutlaw.java index 53b0f8b4b66..452117524b3 100644 --- a/Mage.Sets/src/mage/cards/k/KruinOutlaw.java +++ b/Mage.Sets/src/mage/cards/k/KruinOutlaw.java @@ -2,6 +2,7 @@ package mage.cards.k; import java.util.UUID; + import mage.MageInt; import mage.abilities.TriggeredAbility; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; @@ -12,25 +13,23 @@ import mage.abilities.keyword.FirstStrikeAbility; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.t.TerrorOfKruinPass; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.TargetController; /** - * * @author North */ public final class KruinOutlaw extends CardImpl { public KruinOutlaw(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{R}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}{R}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.ROGUE); this.subtype.add(SubType.WEREWOLF); this.transformable = true; - this.secondSideCardClazz = TerrorOfKruinPass.class; + this.secondSideCardClazz = mage.cards.t.TerrorOfKruinPass.class; this.power = new MageInt(2); this.toughness = new MageInt(2); diff --git a/Mage.Sets/src/mage/cards/k/KytheonHeroOfAkros.java b/Mage.Sets/src/mage/cards/k/KytheonHeroOfAkros.java index e08d2bb278b..d420ff39a62 100644 --- a/Mage.Sets/src/mage/cards/k/KytheonHeroOfAkros.java +++ b/Mage.Sets/src/mage/cards/k/KytheonHeroOfAkros.java @@ -2,6 +2,7 @@ package mage.cards.k; import java.util.UUID; + import mage.MageInt; import mage.MageObjectReference; import mage.abilities.Ability; @@ -17,7 +18,6 @@ import mage.abilities.keyword.IndestructibleAbility; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.g.GideonBattleForged; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Duration; @@ -28,7 +28,6 @@ import mage.game.permanent.Permanent; import mage.watchers.common.AttackedOrBlockedThisCombatWatcher; /** - * * @author LevelX2 */ public final class KytheonHeroOfAkros extends CardImpl { @@ -42,7 +41,7 @@ public final class KytheonHeroOfAkros extends CardImpl { this.toughness = new MageInt(1); this.transformable = true; - this.secondSideCardClazz = GideonBattleForged.class; + this.secondSideCardClazz = mage.cards.g.GideonBattleForged.class; // 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. diff --git a/Mage.Sets/src/mage/cards/l/LambholtElder.java b/Mage.Sets/src/mage/cards/l/LambholtElder.java index 81f15b01a41..d2eabcf469a 100644 --- a/Mage.Sets/src/mage/cards/l/LambholtElder.java +++ b/Mage.Sets/src/mage/cards/l/LambholtElder.java @@ -2,6 +2,7 @@ package mage.cards.l; import java.util.UUID; + import mage.MageInt; import mage.abilities.TriggeredAbility; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; @@ -11,19 +12,17 @@ import mage.abilities.effects.common.TransformSourceEffect; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.s.SilverpeltWerewolf; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.TargetController; /** - * * @author Loki */ public final class LambholtElder extends CardImpl { public LambholtElder(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.WEREWOLF); @@ -31,7 +30,7 @@ public final class LambholtElder extends CardImpl { this.toughness = new MageInt(2); this.transformable = true; - this.secondSideCardClazz = SilverpeltWerewolf.class; + this.secondSideCardClazz = mage.cards.s.SilverpeltWerewolf.class; // At the beginning of each upkeep, if no spells were cast last turn, transform Lambholt Elder. this.addAbility(new TransformAbility()); @@ -47,4 +46,4 @@ public final class LambholtElder extends CardImpl { public LambholtElder copy() { return new LambholtElder(this); } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/l/LazavTheMultifarious.java b/Mage.Sets/src/mage/cards/l/LazavTheMultifarious.java index 835106f467f..a8bf016ec6a 100644 --- a/Mage.Sets/src/mage/cards/l/LazavTheMultifarious.java +++ b/Mage.Sets/src/mage/cards/l/LazavTheMultifarious.java @@ -16,19 +16,18 @@ import mage.constants.SuperType; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.ComparisonType; import mage.constants.Duration; import mage.constants.Outcome; -import mage.constants.TargetAdjustment; -import mage.constants.TargetController; import mage.filter.FilterCard; import mage.filter.common.FilterCreatureCard; -import mage.filter.predicate.other.OwnerPredicate; +import mage.filter.predicate.mageobject.ConvertedManaCostPredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.permanent.PermanentCard; import mage.players.Player; -import mage.target.common.TargetCardInGraveyard; -import mage.target.targetpointer.FixedTarget; +import mage.target.common.TargetCardInYourGraveyard; +import mage.target.targetadjustment.TargetAdjuster; import mage.util.functions.ApplyToPermanent; /** @@ -37,12 +36,6 @@ import mage.util.functions.ApplyToPermanent; */ public final class LazavTheMultifarious extends CardImpl { - private static final FilterCard filter = new FilterCreatureCard("creature card in your graveyard with converted mana cost X"); - - static { - filter.add(new OwnerPredicate(TargetController.YOU)); - } - public LazavTheMultifarious(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{U}{B}"); @@ -61,8 +54,7 @@ public final class LazavTheMultifarious extends CardImpl { new LazavTheMultifariousEffect(), new ManaCostsImpl("{X}") ); - ability.addTarget(new TargetCardInGraveyard(filter)); - ability.setTargetAdjustment(TargetAdjustment.X_CMC_EQUAL_GY_CARD); + ability.setTargetAdjuster(LazavTheMultifariousAdjuster.instance); this.addAbility(ability); } @@ -76,6 +68,19 @@ public final class LazavTheMultifarious extends CardImpl { } } +enum LazavTheMultifariousAdjuster implements TargetAdjuster { + instance; + + @Override + public void adjustTargets(Ability ability, Game game) { + int xValue = ability.getManaCostsToPay().getX(); + FilterCard filterCard = new FilterCreatureCard("creature card with converted mana cost " + xValue + " in your graveyard"); + filterCard.add(new ConvertedManaCostPredicate(ComparisonType.EQUAL_TO, xValue)); + ability.getTargets().clear(); + ability.getTargets().add(new TargetCardInYourGraveyard(filterCard)); + } +} + class LazavTheMultifariousEffect extends OneShotEffect { LazavTheMultifariousEffect() { @@ -103,7 +108,7 @@ class LazavTheMultifariousEffect extends OneShotEffect { Permanent newBluePrint = null; if (controller != null && lazavTheMultifarious != null) { - Card copyFromCard = game.getCard(((FixedTarget) getTargetPointer()).getTarget()); + Card copyFromCard = game.getCard(source.getFirstTarget()); if (copyFromCard != null) { newBluePrint = new PermanentCard((Card) copyFromCard, source.getControllerId(), game); newBluePrint.assignNewId(); @@ -124,20 +129,13 @@ class LazavTheMultifariousEffect extends OneShotEffect { class LazavTheMultifariousApplier extends ApplyToPermanent { - private static final FilterCard filter = new FilterCreatureCard("creature card in your graveyard with converted mana cost X"); - - static { - filter.add(new OwnerPredicate(TargetController.YOU)); - } - @Override public boolean apply(Game game, Permanent permanent, Ability source, UUID copyToObjectId) { Ability ability = new SimpleActivatedAbility( new LazavTheMultifariousEffect(), new ManaCostsImpl("{X}") ); - ability.addTarget(new TargetCardInGraveyard(filter)); - ability.setTargetAdjustment(TargetAdjustment.X_CMC_EQUAL_GY_CARD); + ability.setTargetAdjuster(LazavTheMultifariousAdjuster.instance); permanent.getAbilities().add(ability); permanent.setName("Lazav, the Multifarious"); permanent.addSuperType(SuperType.LEGENDARY); @@ -150,8 +148,7 @@ class LazavTheMultifariousApplier extends ApplyToPermanent { new LazavTheMultifariousEffect(), new ManaCostsImpl("{X}") ); - ability.addTarget(new TargetCardInGraveyard(filter)); - ability.setTargetAdjustment(TargetAdjustment.X_CMC_EQUAL_GY_CARD); + ability.setTargetAdjuster(LazavTheMultifariousAdjuster.instance); mageObject.getAbilities().add(ability); mageObject.setName("Lazav, the Multifarious"); mageObject.addSuperType(SuperType.LEGENDARY); diff --git a/Mage.Sets/src/mage/cards/l/LeagueGuildmage.java b/Mage.Sets/src/mage/cards/l/LeagueGuildmage.java index 3ff66776aac..885e0d93273 100644 --- a/Mage.Sets/src/mage/cards/l/LeagueGuildmage.java +++ b/Mage.Sets/src/mage/cards/l/LeagueGuildmage.java @@ -12,11 +12,15 @@ import mage.constants.SubType; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.ComparisonType; import mage.constants.TargetController; import mage.filter.FilterSpell; import mage.filter.common.FilterInstantOrSorcerySpell; +import mage.filter.predicate.mageobject.ConvertedManaCostPredicate; import mage.filter.predicate.permanent.ControllerPredicate; +import mage.game.Game; import mage.target.TargetSpell; +import mage.target.targetadjustment.TargetAdjuster; /** * @@ -53,6 +57,7 @@ public final class LeagueGuildmage extends CardImpl { ); ability.addCost(new TapSourceCost()); ability.addTarget(new TargetSpell(filter)); + ability.setTargetAdjuster(LeagueGuildmageAdjuster.instance); this.addAbility(ability); } @@ -65,3 +70,17 @@ public final class LeagueGuildmage extends CardImpl { return new LeagueGuildmage(this); } } + +enum LeagueGuildmageAdjuster implements TargetAdjuster { + instance; + + @Override + public void adjustTargets(Ability ability, Game game) { + int xValue = ability.getManaCostsToPay().getX(); + FilterSpell spellFilter = new FilterInstantOrSorcerySpell("instant or sorcery you control with converted mana cost " + xValue); + spellFilter.add(new ControllerPredicate(TargetController.YOU)); + spellFilter.add(new ConvertedManaCostPredicate(ComparisonType.EQUAL_TO, xValue)); + ability.getTargets().clear(); + ability.addTarget(new TargetSpell(spellFilter)); + } +} diff --git a/Mage.Sets/src/mage/cards/l/Leapfrog.java b/Mage.Sets/src/mage/cards/l/Leapfrog.java new file mode 100644 index 00000000000..8e1006f6975 --- /dev/null +++ b/Mage.Sets/src/mage/cards/l/Leapfrog.java @@ -0,0 +1,83 @@ +package mage.cards.l; + +import java.util.List; +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.Condition; +import mage.abilities.decorator.ConditionalContinuousEffect; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.stack.Spell; +import mage.watchers.common.SpellsCastWatcher; + +/** + * + * @author TheElk801 + */ +public final class Leapfrog extends CardImpl { + + public Leapfrog(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}"); + + this.subtype.add(SubType.FROG); + this.power = new MageInt(3); + this.toughness = new MageInt(1); + + // Leapfrog has flying as long as you've cast an instant or sorcery spell this turn. + this.addAbility(new SimpleStaticAbility( + Zone.BATTLEFIELD, + new ConditionalContinuousEffect( + new GainAbilitySourceEffect( + FlyingAbility.getInstance(), + Duration.WhileOnBattlefield + ), LeapfrogCondition.instance, + "{this} has flying as long as you've cast " + + "an instant or sorcery spell this turn." + ) + ), new SpellsCastWatcher()); + } + + public Leapfrog(final Leapfrog card) { + super(card); + } + + @Override + public Leapfrog copy() { + return new Leapfrog(this); + } +} + +enum LeapfrogCondition implements Condition { + instance; + + @Override + public boolean apply(Game game, Ability source) { + SpellsCastWatcher watcher + = (SpellsCastWatcher) game.getState().getWatchers().get( + SpellsCastWatcher.class.getSimpleName() + ); + if (watcher == null) { + return false; + } + List spells = watcher.getSpellsCastThisTurn(source.getControllerId()); + if (spells == null) { + return false; + } + for (Spell spell : spells) { + if (!spell.getSourceId().equals(source.getSourceId()) + && spell.isInstantOrSorcery()) { + return true; + } + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/l/LegacysAllure.java b/Mage.Sets/src/mage/cards/l/LegacysAllure.java index 162c2fc5f3d..acf4bbe6ece 100644 --- a/Mage.Sets/src/mage/cards/l/LegacysAllure.java +++ b/Mage.Sets/src/mage/cards/l/LegacysAllure.java @@ -1,4 +1,3 @@ - package mage.cards.l; import java.util.UUID; @@ -11,13 +10,17 @@ import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.ComparisonType; import mage.constants.Duration; -import mage.constants.TargetAdjustment; import mage.constants.TargetController; import mage.constants.Zone; import mage.counters.CounterType; import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.PowerPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; import mage.target.common.TargetCreaturePermanent; +import mage.target.targetadjustment.TargetAdjuster; /** * @author LevelX2 @@ -36,7 +39,7 @@ public final class LegacysAllure extends CardImpl { // Sacrifice Legacy's Allure: Gain control of target creature with power less than or equal to the number of treasure counters on Legacy's Allure. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainControlTargetEffect(Duration.EndOfGame, true), new SacrificeSourceCost()); ability.addTarget(new TargetCreaturePermanent(0, 0, filter, false)); - ability.setTargetAdjustment(TargetAdjustment.TREASURE_COUNTER_POWER); + ability.setTargetAdjuster(LegacysAllureAdjuster.instance); this.addAbility(ability); } @@ -49,3 +52,19 @@ public final class LegacysAllure extends CardImpl { return new LegacysAllure(this); } } + +enum LegacysAllureAdjuster implements TargetAdjuster { + instance; + + @Override + public void adjustTargets(Ability ability, Game game) { + Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(ability.getSourceId()); + if (sourcePermanent != null) { + int xValue = sourcePermanent.getCounters(game).getCount(CounterType.TREASURE); + FilterCreaturePermanent filter2 = new FilterCreaturePermanent("creature with power less than or equal to " + xValue); + filter2.add(new PowerPredicate(ComparisonType.FEWER_THAN, xValue + 1)); + ability.getTargets().clear(); + ability.getTargets().add(new TargetCreaturePermanent(filter2)); + } + } +} diff --git a/Mage.Sets/src/mage/cards/l/LegionsLanding.java b/Mage.Sets/src/mage/cards/l/LegionsLanding.java index b2d43ca2b67..669ac8942f4 100644 --- a/Mage.Sets/src/mage/cards/l/LegionsLanding.java +++ b/Mage.Sets/src/mage/cards/l/LegionsLanding.java @@ -2,6 +2,7 @@ package mage.cards.l; import java.util.UUID; + import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.effects.Effect; @@ -11,7 +12,6 @@ import mage.abilities.keyword.TransformAbility; import mage.constants.SuperType; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.a.AdantoTheFirstFort; import mage.constants.CardType; import mage.constants.Zone; import mage.game.Game; @@ -19,7 +19,6 @@ import mage.game.events.GameEvent; import mage.game.permanent.token.IxalanVampireToken; /** - * * @author TheElk801 */ public final class LegionsLanding extends CardImpl { @@ -30,7 +29,7 @@ public final class LegionsLanding extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.transformable = true; - this.secondSideCardClazz = AdantoTheFirstFort.class; + this.secondSideCardClazz = mage.cards.a.AdantoTheFirstFort.class; // When Legion's Landing enters the battlefield, create a 1/1 white Vampire creature token with lifelink. this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new IxalanVampireToken()))); @@ -79,4 +78,4 @@ class LegionsLandingTriggeredAbility extends TriggeredAbilityImpl { public String getRule() { return new StringBuilder("When you attack with three or more creatures, ").append(super.getRule()).toString(); } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/l/LeylineOfVitality.java b/Mage.Sets/src/mage/cards/l/LeylineOfVitality.java index 42be613481e..8808969cecd 100644 --- a/Mage.Sets/src/mage/cards/l/LeylineOfVitality.java +++ b/Mage.Sets/src/mage/cards/l/LeylineOfVitality.java @@ -1,8 +1,7 @@ package mage.cards.l; -import java.util.UUID; -import mage.abilities.common.CreatureEntersBattlefieldTriggeredAbility; +import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.GainLifeEffect; import mage.abilities.effects.common.continuous.BoostControlledEffect; @@ -14,8 +13,9 @@ import mage.constants.Duration; import mage.constants.Zone; import mage.filter.StaticFilters; +import java.util.UUID; + /** - * * @author BetaSteward_at_googlemail.com */ public final class LeylineOfVitality extends CardImpl { @@ -23,10 +23,19 @@ public final class LeylineOfVitality extends CardImpl { public LeylineOfVitality(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{G}{G}"); + // If Leyline of Vitality is in your opening hand, you may begin the game with it on the battlefield. this.addAbility(LeylineAbility.getInstance()); - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostControlledEffect(0, 1, Duration.WhileOnBattlefield, StaticFilters.FILTER_PERMANENT_CREATURE, false))); - this.addAbility(new CreatureEntersBattlefieldTriggeredAbility(new GainLifeEffect(1), true)); + // Creatures you control get +0/+1. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostControlledEffect(0, 1, Duration.WhileOnBattlefield, StaticFilters.FILTER_PERMANENT_CREATURES, false))); + + // Whenever a creature enters the battlefield under your control, you may gain 1 life. + this.addAbility(new EntersBattlefieldControlledTriggeredAbility( + Zone.BATTLEFIELD, + new GainLifeEffect(1), + StaticFilters.FILTER_PERMANENT_CREATURE_A, + true) + ); } public LeylineOfVitality(final LeylineOfVitality card) { diff --git a/Mage.Sets/src/mage/cards/l/LilianaDeathWielder.java b/Mage.Sets/src/mage/cards/l/LilianaDeathWielder.java index 5b9441bce92..b5479ee159d 100644 --- a/Mage.Sets/src/mage/cards/l/LilianaDeathWielder.java +++ b/Mage.Sets/src/mage/cards/l/LilianaDeathWielder.java @@ -4,7 +4,7 @@ package mage.cards.l; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DestroyTargetEffect; import mage.abilities.effects.common.counter.AddCountersTargetEffect; @@ -40,7 +40,7 @@ public final class LilianaDeathWielder extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.LILIANA); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(5)); // +2: Put a -1/-1 counter on up to one target creature. LoyaltyAbility ability = new LoyaltyAbility(new AddCountersTargetEffect(CounterType.M1M1.createInstance(1)), 2); diff --git a/Mage.Sets/src/mage/cards/l/LilianaDeathsMajesty.java b/Mage.Sets/src/mage/cards/l/LilianaDeathsMajesty.java index 67bfda10b6f..15b9dd6eb42 100644 --- a/Mage.Sets/src/mage/cards/l/LilianaDeathsMajesty.java +++ b/Mage.Sets/src/mage/cards/l/LilianaDeathsMajesty.java @@ -3,7 +3,7 @@ package mage.cards.l; import java.util.UUID; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.DestroyAllEffect; import mage.abilities.effects.common.PutTopCardOfLibraryIntoGraveControllerEffect; @@ -39,7 +39,7 @@ public final class LilianaDeathsMajesty extends CardImpl { this.subtype.add(SubType.LILIANA); //Starting Loyalty: 5 - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(5)); // +1: Create a 2/2 black Zombie creature token. Put the top two cards of your library into your graveyard. LoyaltyAbility ability = new LoyaltyAbility(new CreateTokenEffect(new ZombieToken()), 1); diff --git a/Mage.Sets/src/mage/cards/l/LilianaDefiantNecromancer.java b/Mage.Sets/src/mage/cards/l/LilianaDefiantNecromancer.java index b27e8ce73d4..f6a0956905e 100644 --- a/Mage.Sets/src/mage/cards/l/LilianaDefiantNecromancer.java +++ b/Mage.Sets/src/mage/cards/l/LilianaDefiantNecromancer.java @@ -4,7 +4,7 @@ package mage.cards.l; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.costs.Cost; import mage.abilities.costs.common.PayVariableLoyaltyCost; import mage.abilities.effects.common.GetEmblemEffect; @@ -44,7 +44,7 @@ public final class LilianaDefiantNecromancer extends CardImpl { this.nightCard = true; - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3)); // +2: Each player discards a card. this.addAbility(new LoyaltyAbility(new DiscardEachPlayerEffect(1, false), 2)); diff --git a/Mage.Sets/src/mage/cards/l/LilianaOfTheDarkRealms.java b/Mage.Sets/src/mage/cards/l/LilianaOfTheDarkRealms.java index eec4019313d..5f8d2b5eed2 100644 --- a/Mage.Sets/src/mage/cards/l/LilianaOfTheDarkRealms.java +++ b/Mage.Sets/src/mage/cards/l/LilianaOfTheDarkRealms.java @@ -4,7 +4,7 @@ package mage.cards.l; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.effects.common.GetEmblemEffect; import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect; @@ -39,7 +39,7 @@ public final class LilianaOfTheDarkRealms extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.LILIANA); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3)); // +1: Search your library for a Swamp card, reveal it, and put it into your hand. Then shuffle your library. this.addAbility(new LoyaltyAbility(new SearchLibraryPutInHandEffect(new TargetCardInLibrary(filter), true), 1)); diff --git a/Mage.Sets/src/mage/cards/l/LilianaOfTheVeil.java b/Mage.Sets/src/mage/cards/l/LilianaOfTheVeil.java index db15b2a74d1..88d49d3ec96 100644 --- a/Mage.Sets/src/mage/cards/l/LilianaOfTheVeil.java +++ b/Mage.Sets/src/mage/cards/l/LilianaOfTheVeil.java @@ -6,7 +6,7 @@ import java.util.List; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.SacrificeEffect; import mage.abilities.effects.common.discard.DiscardEachPlayerEffect; @@ -35,7 +35,7 @@ public final class LilianaOfTheVeil extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.LILIANA); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3)); // +1: Each player discards a card. this.addAbility(new LoyaltyAbility(new DiscardEachPlayerEffect(), 1)); diff --git a/Mage.Sets/src/mage/cards/l/LilianaTheLastHope.java b/Mage.Sets/src/mage/cards/l/LilianaTheLastHope.java index d3c2e20b86d..91fc2bcefc2 100644 --- a/Mage.Sets/src/mage/cards/l/LilianaTheLastHope.java +++ b/Mage.Sets/src/mage/cards/l/LilianaTheLastHope.java @@ -4,7 +4,7 @@ package mage.cards.l; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.GetEmblemEffect; @@ -37,7 +37,7 @@ public final class LilianaTheLastHope extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.LILIANA); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3)); // +1: Up to one target creature gets -2/-1 until your next turn. Effect effect = new BoostTargetEffect(-2, -1, Duration.UntilYourNextTurn); diff --git a/Mage.Sets/src/mage/cards/l/LilianaTheNecromancer.java b/Mage.Sets/src/mage/cards/l/LilianaTheNecromancer.java index 9023347f94d..90fdc0b1ec1 100644 --- a/Mage.Sets/src/mage/cards/l/LilianaTheNecromancer.java +++ b/Mage.Sets/src/mage/cards/l/LilianaTheNecromancer.java @@ -3,7 +3,7 @@ package mage.cards.l; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DestroyTargetEffect; import mage.abilities.effects.common.LoseLifeTargetEffect; @@ -39,7 +39,7 @@ public final class LilianaTheNecromancer extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.LILIANA); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(4)); // +1: Target player loses 2 life. Ability ability = new LoyaltyAbility(new LoseLifeTargetEffect(2), 1); diff --git a/Mage.Sets/src/mage/cards/l/LilianaUntouchedByDeath.java b/Mage.Sets/src/mage/cards/l/LilianaUntouchedByDeath.java index 6d569e10128..f131e898ac6 100644 --- a/Mage.Sets/src/mage/cards/l/LilianaUntouchedByDeath.java +++ b/Mage.Sets/src/mage/cards/l/LilianaUntouchedByDeath.java @@ -4,7 +4,7 @@ import java.util.Set; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; import mage.abilities.effects.AsThoughEffectImpl; @@ -40,7 +40,7 @@ public final class LilianaUntouchedByDeath extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.LILIANA); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(4)); // +1: Put the top three cards of your library into your graveyard. If at least one of them is a Zombie card, each opponent loses 2 life and you gain 2 life. this.addAbility(new LoyaltyAbility(new LilianaUntouchedByDeathEffect(), 1)); diff --git a/Mage.Sets/src/mage/cards/l/LilianaVess.java b/Mage.Sets/src/mage/cards/l/LilianaVess.java index 1de4e248081..63f4bf5d781 100644 --- a/Mage.Sets/src/mage/cards/l/LilianaVess.java +++ b/Mage.Sets/src/mage/cards/l/LilianaVess.java @@ -3,7 +3,7 @@ package mage.cards.l; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.discard.DiscardTargetEffect; import mage.abilities.effects.common.search.SearchLibraryPutOnLibraryEffect; @@ -36,7 +36,7 @@ public final class LilianaVess extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.LILIANA); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(5)); // +1: Target player discards a card. LoyaltyAbility ability1 = new LoyaltyAbility(new DiscardTargetEffect(1), 1); ability1.addTarget(new TargetPlayer()); diff --git a/Mage.Sets/src/mage/cards/l/LinessaZephyrMage.java b/Mage.Sets/src/mage/cards/l/LinessaZephyrMage.java index 8b3b4e93600..17167aa7b9c 100644 --- a/Mage.Sets/src/mage/cards/l/LinessaZephyrMage.java +++ b/Mage.Sets/src/mage/cards/l/LinessaZephyrMage.java @@ -1,4 +1,3 @@ - package mage.cards.l; import java.util.UUID; @@ -16,7 +15,6 @@ import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Outcome; import mage.constants.SuperType; -import mage.constants.TargetAdjustment; import mage.constants.Zone; import mage.filter.FilterPermanent; import mage.filter.common.FilterControlledPermanent; @@ -29,6 +27,7 @@ import mage.target.TargetPermanent; import mage.target.TargetPlayer; import mage.target.common.TargetControlledCreaturePermanent; import mage.target.common.TargetControlledPermanent; +import mage.target.targetadjustment.XCMCPermanentAdjuster; /** * @@ -55,7 +54,7 @@ public final class LinessaZephyrMage extends CardImpl { Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ReturnToHandTargetEffect(), new ManaCostsImpl("{X}{U}{U}")); ability.addCost(new TapSourceCost()); ability.addTarget(new TargetPermanent(filter)); - ability.setTargetAdjustment(TargetAdjustment.X_CMC_EQUAL_PERM); + ability.setTargetAdjuster(XCMCPermanentAdjuster.instance); 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. diff --git a/Mage.Sets/src/mage/cards/l/LoneRider.java b/Mage.Sets/src/mage/cards/l/LoneRider.java index dd364058d1f..bfc95848545 100644 --- a/Mage.Sets/src/mage/cards/l/LoneRider.java +++ b/Mage.Sets/src/mage/cards/l/LoneRider.java @@ -2,6 +2,7 @@ package mage.cards.l; import java.util.UUID; + import mage.MageInt; import mage.abilities.TriggeredAbility; import mage.abilities.common.OnEventTriggeredAbility; @@ -13,7 +14,6 @@ import mage.abilities.keyword.LifelinkAbility; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.i.ItThatRidesAsOne; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.ComparisonType; @@ -21,7 +21,6 @@ import mage.game.events.GameEvent; import mage.watchers.common.PlayerGainedLifeWatcher; /** - * * @author fireshoes */ public final class LoneRider extends CardImpl { @@ -36,7 +35,7 @@ public final class LoneRider extends CardImpl { this.toughness = new MageInt(1); this.transformable = true; - this.secondSideCardClazz = ItThatRidesAsOne.class; + this.secondSideCardClazz = mage.cards.i.ItThatRidesAsOne.class; // First strike this.addAbility(FirstStrikeAbility.getInstance()); diff --git a/Mage.Sets/src/mage/cards/l/LordWindgrace.java b/Mage.Sets/src/mage/cards/l/LordWindgrace.java index 3cbd21e70f2..a4126678c59 100644 --- a/Mage.Sets/src/mage/cards/l/LordWindgrace.java +++ b/Mage.Sets/src/mage/cards/l/LordWindgrace.java @@ -4,7 +4,7 @@ import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; import mage.abilities.common.CanBeYourCommanderAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.DestroyTargetEffect; @@ -42,7 +42,7 @@ public final class LordWindgrace extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.WINDGRACE); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(5)); // +2: Discard a card, then draw a card. If a land card is discarded this way, draw an additional card. this.addAbility(new LoyaltyAbility(new LordWindgraceEffect(), 2)); diff --git a/Mage.Sets/src/mage/cards/l/LoyalCathar.java b/Mage.Sets/src/mage/cards/l/LoyalCathar.java index 16a24c0675f..8282b63392d 100644 --- a/Mage.Sets/src/mage/cards/l/LoyalCathar.java +++ b/Mage.Sets/src/mage/cards/l/LoyalCathar.java @@ -2,6 +2,7 @@ package mage.cards.l; import java.util.UUID; + import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.DiesTriggeredAbility; @@ -13,7 +14,6 @@ import mage.abilities.keyword.VigilanceAbility; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.u.UnhallowedCathar; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SubType; @@ -23,7 +23,6 @@ import mage.players.Player; import mage.target.targetpointer.FixedTarget; /** - * * @author BetaSteward */ public final class LoyalCathar extends CardImpl { @@ -34,7 +33,7 @@ public final class LoyalCathar extends CardImpl { this.subtype.add(SubType.SOLDIER); this.transformable = true; - this.secondSideCardClazz = UnhallowedCathar.class; + this.secondSideCardClazz = mage.cards.u.UnhallowedCathar.class; this.power = new MageInt(2); this.toughness = new MageInt(2); @@ -116,5 +115,4 @@ class ReturnLoyalCatharEffect extends OneShotEffect { } return true; } - -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/l/LudevicNecroAlchemist.java b/Mage.Sets/src/mage/cards/l/LudevicNecroAlchemist.java index c813ab3c37f..9499bda49ec 100644 --- a/Mage.Sets/src/mage/cards/l/LudevicNecroAlchemist.java +++ b/Mage.Sets/src/mage/cards/l/LudevicNecroAlchemist.java @@ -1,4 +1,3 @@ - package mage.cards.l; import java.util.Objects; @@ -33,7 +32,8 @@ public final class LudevicNecroAlchemist extends CardImpl { this.toughness = new MageInt(4); // At the beginning of each player's end step, that player may draw a card if a player other than you lost life this turn. - this.addAbility(new BeginningOfEndStepTriggeredAbility(Zone.BATTLEFIELD, new LudevicNecroAlchemistEffect(), TargetController.ANY, new LudevicNecroAlchemistCondition(), false)); + this.addAbility(new BeginningOfEndStepTriggeredAbility(Zone.BATTLEFIELD, + new LudevicNecroAlchemistEffect(), TargetController.EACH_PLAYER, new LudevicNecroAlchemistCondition(), false)); // Partner this.addAbility(PartnerAbility.getInstance()); @@ -54,11 +54,10 @@ class LudevicNecroAlchemistCondition implements Condition { @Override public boolean apply(Game game, Ability source) { PlayerLostLifeWatcher watcher = (PlayerLostLifeWatcher) game.getState().getWatchers().get(PlayerLostLifeWatcher.class.getSimpleName()); - UUID player = game.getActivePlayerId(); PlayerList playerList = game.getState().getPlayerList().copy(); - Player currentPlayer = null; + Player currentPlayer; UUID sourcePlayerId = source.getControllerId(); - Player firstPlayer = null; + Player firstPlayer; if (playerList == null) { return false; } @@ -77,6 +76,7 @@ class LudevicNecroAlchemistCondition implements Condition { return false; } + @Override public String toString() { return "if a player other than you lost life this turn"; } @@ -86,7 +86,7 @@ class LudevicNecroAlchemistEffect extends OneShotEffect { public LudevicNecroAlchemistEffect() { super(Outcome.DrawCard); - staticText = "that player may draw a card if a player other than you lost life this turn"; + staticText = "that player may draw a card"; } public LudevicNecroAlchemistEffect(final LudevicNecroAlchemistEffect effect) { diff --git a/Mage.Sets/src/mage/cards/l/LukeSkywalkerTheLastJedi.java b/Mage.Sets/src/mage/cards/l/LukeSkywalkerTheLastJedi.java index 37f18bdf531..c5bbb81d94b 100644 --- a/Mage.Sets/src/mage/cards/l/LukeSkywalkerTheLastJedi.java +++ b/Mage.Sets/src/mage/cards/l/LukeSkywalkerTheLastJedi.java @@ -4,7 +4,7 @@ import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.common.ExileSourceEffect; import mage.abilities.effects.common.GetEmblemEffect; import mage.abilities.effects.common.PutOnLibraryTargetEffect; @@ -16,7 +16,6 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.counters.CounterType; import mage.filter.FilterPermanent; -import mage.filter.StaticFilters; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.CardTypePredicate; import mage.game.command.emblems.LukeSkywalkerEmblem; @@ -40,7 +39,7 @@ public final class LukeSkywalkerTheLastJedi extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.LUKE); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3)); // +1: Put two +1/+1 counters on up to one target creature. Ability ability1 = new LoyaltyAbility(new AddCountersTargetEffect(CounterType.P1P1.createInstance(2)), 2); diff --git a/Mage.Sets/src/mage/cards/m/MagesContest.java b/Mage.Sets/src/mage/cards/m/MagesContest.java index a895e668f6b..c095a5da5be 100644 --- a/Mage.Sets/src/mage/cards/m/MagesContest.java +++ b/Mage.Sets/src/mage/cards/m/MagesContest.java @@ -68,7 +68,7 @@ class MagesContestEffect extends OneShotEffect { Player winner = you; Player currentPlayer = spellController; do { - if (currentPlayer != null && currentPlayer.canRespond()) { + if (currentPlayer.canRespond()) { int newBid = 0; if (!currentPlayer.isHuman()) { // make AI evaluate value of the spell to decide on bidding, should be reworked diff --git a/Mage.Sets/src/mage/cards/m/MagusOfTheCandelabra.java b/Mage.Sets/src/mage/cards/m/MagusOfTheCandelabra.java index 5f190e369da..7907d01b9dc 100644 --- a/Mage.Sets/src/mage/cards/m/MagusOfTheCandelabra.java +++ b/Mage.Sets/src/mage/cards/m/MagusOfTheCandelabra.java @@ -1,4 +1,3 @@ - package mage.cards.m; import java.util.UUID; @@ -13,10 +12,10 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.constants.TargetAdjustment; import mage.constants.Zone; import mage.filter.StaticFilters; import mage.target.TargetPermanent; +import mage.target.targetadjustment.XTargetsAdjuster; /** * @author duncant @@ -37,7 +36,7 @@ public final class MagusOfTheCandelabra extends CardImpl { Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("{X}")); ability.addCost(new TapSourceCost()); ability.addTarget(new TargetPermanent(StaticFilters.FILTER_LANDS)); - ability.setTargetAdjustment(TargetAdjustment.X_TARGETS); + ability.setTargetAdjuster(XTargetsAdjuster.instance); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/m/MammothUmbra.java b/Mage.Sets/src/mage/cards/m/MammothUmbra.java index 4b67b0e72c8..17343666429 100644 --- a/Mage.Sets/src/mage/cards/m/MammothUmbra.java +++ b/Mage.Sets/src/mage/cards/m/MammothUmbra.java @@ -2,6 +2,7 @@ package mage.cards.m; import java.util.UUID; + import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.AttachEffect; @@ -17,13 +18,12 @@ import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; /** - * * @author Loki */ public final class MammothUmbra extends CardImpl { public MammothUmbra(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{4}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{4}{W}"); this.subtype.add(SubType.AURA); @@ -33,9 +33,12 @@ public final class MammothUmbra extends CardImpl { this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); Ability ability = new EnchantAbility(auraTarget.getTargetName()); this.addAbility(ability); + // Enchanted creature gets +3/+3 and has vigilance. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(3, 3, Duration.WhileOnBattlefield))); this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(VigilanceAbility.getInstance(), AttachmentType.AURA))); + + // Totem armor this.addAbility(new TotemArmorAbility()); } diff --git a/Mage.Sets/src/mage/cards/m/ManaScrew.java b/Mage.Sets/src/mage/cards/m/ManaScrew.java new file mode 100644 index 00000000000..f2228b428bc --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/ManaScrew.java @@ -0,0 +1,96 @@ + +package mage.cards.m; + +import java.util.UUID; +import mage.Mana; +import mage.abilities.Ability; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.mana.BasicManaEffect; +import mage.abilities.mana.ActivatedManaAbilityImpl; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Zone; +import mage.game.Game; +import mage.players.Player; + +/** + * + * @author L_J + */ +public final class ManaScrew extends CardImpl { + + public ManaScrew(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{1}"); + + // {1}: Flip a coin. If you win the flip, add {C}{C}. Activate this ability only any time you could cast an instant. + this.addAbility(new ManaScrewAbility()); + } + + public ManaScrew(final ManaScrew card) { + super(card); + } + + @Override + public ManaScrew copy() { + return new ManaScrew(this); + } +} + +class ManaScrewAbility extends ActivatedManaAbilityImpl { + + public ManaScrewAbility() { + super(Zone.BATTLEFIELD, new ManaScrewEffect(), new GenericManaCost(1)); + this.netMana.add(new Mana(0, 0, 0, 0, 0, 2, 0, 0)); + } + + public ManaScrewAbility(final ManaScrewAbility ability) { + super(ability); + } + + @Override + public ActivationStatus canActivate(UUID playerId, Game game) { + Player player = game.getPlayer(playerId); + if (player != null && !player.isInPayManaMode()) { + return super.canActivate(playerId, game); + } + return ActivationStatus.getFalse(); + } + + @Override + public ManaScrewAbility copy() { + return new ManaScrewAbility(this); + } + + @Override + public String getRule() { + return super.getRule() + " Activate this ability only any time you could cast an instant."; + } +} + +class ManaScrewEffect extends BasicManaEffect { + + public ManaScrewEffect() { + super(Mana.ColorlessMana(2)); + this.staticText = "Flip a coin. If you win the flip, add {C}{C}"; + } + + public ManaScrewEffect(final ManaScrewEffect effect) { + super(effect); + this.manaTemplate = effect.manaTemplate.copy(); + } + + @Override + public ManaScrewEffect copy() { + return new ManaScrewEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player != null && player.flipCoin(game)) { + player.getManaPool().addMana(getMana(game, source), game, source); + } + return true; + } +} diff --git a/Mage.Sets/src/mage/cards/m/ManiacalRage.java b/Mage.Sets/src/mage/cards/m/ManiacalRage.java index db697960197..703a6754163 100644 --- a/Mage.Sets/src/mage/cards/m/ManiacalRage.java +++ b/Mage.Sets/src/mage/cards/m/ManiacalRage.java @@ -1,4 +1,3 @@ - package mage.cards.m; import java.util.UUID; @@ -21,19 +20,20 @@ import mage.target.common.TargetCreaturePermanent; public final class ManiacalRage extends CardImpl { public ManiacalRage(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{1}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{R}"); this.subtype.add(SubType.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 and can't block. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(2, 2, Duration.WhileOnBattlefield))); - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBlockAttachedEffect(AttachmentType.AURA))); + ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(2, 2, Duration.WhileOnBattlefield)); + ability.addEffect(new CantBlockAttachedEffect(AttachmentType.AURA).setText("and can't block")); + this.addAbility(ability); } public ManiacalRage(final ManiacalRage card) { diff --git a/Mage.Sets/src/mage/cards/m/MarkOfAsylum.java b/Mage.Sets/src/mage/cards/m/MarkOfAsylum.java index 8249e5af577..64af2f0f625 100644 --- a/Mage.Sets/src/mage/cards/m/MarkOfAsylum.java +++ b/Mage.Sets/src/mage/cards/m/MarkOfAsylum.java @@ -1,7 +1,6 @@ package mage.cards.m; -import java.util.UUID; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.PreventAllNonCombatDamageToAllEffect; import mage.cards.CardImpl; @@ -9,23 +8,26 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Zone; -import mage.filter.common.FilterControlledCreatureInPlay; +import mage.filter.StaticFilters; + +import java.util.UUID; /** - * * @author jeffwadsworth */ public final class MarkOfAsylum extends CardImpl { - - private static final FilterControlledCreatureInPlay filter = new FilterControlledCreatureInPlay("creatures you control"); - - public MarkOfAsylum(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{1}{W}"); + public MarkOfAsylum(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}"); // Prevent all noncombat damage that would be dealt to creatures you control. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new PreventAllNonCombatDamageToAllEffect(Duration.WhileOnBattlefield, filter))); - + this.addAbility(new SimpleStaticAbility( + Zone.BATTLEFIELD, + new PreventAllNonCombatDamageToAllEffect( + Duration.WhileOnBattlefield, + StaticFilters.FILTER_CONTROLLED_CREATURES + ) + )); } public MarkOfAsylum(final MarkOfAsylum card) { diff --git a/Mage.Sets/src/mage/cards/m/MaximizeVelocity.java b/Mage.Sets/src/mage/cards/m/MaximizeVelocity.java index 7b512ae24ec..ed6912350b1 100644 --- a/Mage.Sets/src/mage/cards/m/MaximizeVelocity.java +++ b/Mage.Sets/src/mage/cards/m/MaximizeVelocity.java @@ -26,7 +26,7 @@ public final class MaximizeVelocity extends CardImpl { ).setText("Target creature gets +1/+1")); this.getSpellAbility().addEffect(new GainAbilityTargetEffect( HasteAbility.getInstance(), Duration.EndOfTurn - ).setText("and gains flying until end of turn")); + ).setText("and gains haste until end of turn")); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); // Jump-start diff --git a/Mage.Sets/src/mage/cards/m/MayorOfAvabruck.java b/Mage.Sets/src/mage/cards/m/MayorOfAvabruck.java index 4800d7c2917..eb789d8aca1 100644 --- a/Mage.Sets/src/mage/cards/m/MayorOfAvabruck.java +++ b/Mage.Sets/src/mage/cards/m/MayorOfAvabruck.java @@ -2,6 +2,7 @@ package mage.cards.m; import java.util.UUID; + import mage.MageInt; import mage.abilities.TriggeredAbility; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; @@ -17,13 +18,11 @@ import mage.abilities.effects.common.continuous.BoostControlledEffect; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.h.HowlpackAlpha; import mage.constants.*; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.SubtypePredicate; /** - * * @author North, noxx */ public final class MayorOfAvabruck extends CardImpl { @@ -37,13 +36,13 @@ public final class MayorOfAvabruck extends CardImpl { } public MayorOfAvabruck(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.ADVISOR); this.subtype.add(SubType.WEREWOLF); this.transformable = true; - this.secondSideCardClazz = HowlpackAlpha.class; + this.secondSideCardClazz = mage.cards.h.HowlpackAlpha.class; this.power = new MageInt(1); this.toughness = new MageInt(1); diff --git a/Mage.Sets/src/mage/cards/m/MephiticVapors.java b/Mage.Sets/src/mage/cards/m/MephiticVapors.java new file mode 100644 index 00000000000..ec478c8d4ad --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/MephiticVapors.java @@ -0,0 +1,35 @@ +package mage.cards.m; + +import java.util.UUID; +import mage.abilities.effects.common.continuous.BoostAllEffect; +import mage.abilities.effects.keyword.SurveilEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; + +/** + * + * @author TheElk801 + */ +public final class MephiticVapors extends CardImpl { + + public MephiticVapors(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{B}"); + + // All creatures get -1/-1 until end of turn. + this.getSpellAbility().addEffect(new BoostAllEffect(-1, -1, Duration.EndOfTurn)); + + // Surveil 2. + this.getSpellAbility().addEffect(new SurveilEffect(2)); + } + + public MephiticVapors(final MephiticVapors card) { + super(card); + } + + @Override + public MephiticVapors copy() { + return new MephiticVapors(this); + } +} diff --git a/Mage.Sets/src/mage/cards/m/MetallicMimic.java b/Mage.Sets/src/mage/cards/m/MetallicMimic.java index 9dfcca6887d..2fbc1bc0d90 100644 --- a/Mage.Sets/src/mage/cards/m/MetallicMimic.java +++ b/Mage.Sets/src/mage/cards/m/MetallicMimic.java @@ -80,7 +80,7 @@ class MetallicMimicReplacementEffect extends ReplacementEffectImpl { && enteringCreature.isControlledBy(source.getControllerId()) && enteringCreature.isCreature() && !event.getTargetId().equals(source.getSourceId())) { - SubType subType = ChooseCreatureTypeEffect.getChoosenCreatureType(source.getSourceId(), game); + SubType subType = ChooseCreatureTypeEffect.getChosenCreatureType(source.getSourceId(), game); return subType != null && enteringCreature.hasSubtype(subType, game); } return false; diff --git a/Mage.Sets/src/mage/cards/m/MinamoSightbender.java b/Mage.Sets/src/mage/cards/m/MinamoSightbender.java index b20ca6ff0d0..dc001957da1 100644 --- a/Mage.Sets/src/mage/cards/m/MinamoSightbender.java +++ b/Mage.Sets/src/mage/cards/m/MinamoSightbender.java @@ -1,4 +1,3 @@ - package mage.cards.m; import java.util.UUID; @@ -11,13 +10,17 @@ import mage.abilities.effects.common.combat.CantBeBlockedTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.ComparisonType; import mage.constants.SubType; -import mage.constants.TargetAdjustment; import mage.constants.Zone; import mage.filter.FilterPermanent; +import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.predicate.mageobject.PowerPredicate; +import mage.game.Game; import mage.target.Target; import mage.target.TargetPermanent; +import mage.target.targetadjustment.TargetAdjuster; /** * @@ -42,7 +45,7 @@ public final class MinamoSightbender extends CardImpl { // {X}, {T}: Target creature with power X or less can't be blocked this turn. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CantBeBlockedTargetEffect(), new ManaCostsImpl("{X}")); Target target = new TargetPermanent(filter); - ability.setTargetAdjustment(TargetAdjustment.X_POWER_LEQ); + ability.setTargetAdjuster(MinamoSightbenderAdjuster.instance); ability.addTarget(target); ability.addCost(new TapSourceCost()); this.addAbility(ability); @@ -58,3 +61,16 @@ public final class MinamoSightbender extends CardImpl { return new MinamoSightbender(this); } } + +enum MinamoSightbenderAdjuster implements TargetAdjuster { + instance; + + @Override + public void adjustTargets(Ability ability, Game game) { + int xValue = ability.getManaCostsToPay().getX(); + FilterPermanent permanentFilter = new FilterCreaturePermanent("creature with power " + xValue + " or less"); + permanentFilter.add(new PowerPredicate(ComparisonType.FEWER_THAN, xValue + 1)); + ability.getTargets().clear(); + ability.getTargets().add(new TargetPermanent(permanentFilter)); + } +} diff --git a/Mage.Sets/src/mage/cards/m/MiraculousRecovery.java b/Mage.Sets/src/mage/cards/m/MiraculousRecovery.java index 5cbb1201d24..6e03b826a52 100644 --- a/Mage.Sets/src/mage/cards/m/MiraculousRecovery.java +++ b/Mage.Sets/src/mage/cards/m/MiraculousRecovery.java @@ -1,4 +1,3 @@ - package mage.cards.m; import java.util.UUID; @@ -10,10 +9,9 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; import mage.counters.CounterType; -import mage.filter.common.FilterCreatureCard; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; -import mage.target.Target; import mage.target.common.TargetCardInYourGraveyard; /** @@ -23,13 +21,13 @@ import mage.target.common.TargetCardInYourGraveyard; public final class MiraculousRecovery extends CardImpl { public MiraculousRecovery(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{4}{W}"); - + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{4}{W}"); // Return target creature card from your graveyard to the battlefield. Put a +1/+1 counter on it. this.getSpellAbility().addEffect(new ReturnFromGraveyardToBattlefieldTargetEffect()); - Target target = new TargetCardInYourGraveyard(new FilterCreatureCard()); - this.getSpellAbility().addTarget(target); + this.getSpellAbility().addTarget(new TargetCardInYourGraveyard( + StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD + )); this.getSpellAbility().addEffect(new MiraculousRecoveryEffect()); } @@ -64,7 +62,7 @@ class MiraculousRecoveryEffect extends OneShotEffect { // targetPointer can't be used because target moved from graveyard to battlefield Permanent permanent = game.getPermanent(source.getFirstTarget()); if (permanent != null) { - permanent.addCounters(CounterType.P1P1.createInstance(), source, game); + permanent.addCounters(CounterType.P1P1.createInstance(), source, game); } return false; } diff --git a/Mage.Sets/src/mage/cards/m/Mise.java b/Mage.Sets/src/mage/cards/m/Mise.java new file mode 100644 index 00000000000..23cdc07e72c --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/Mise.java @@ -0,0 +1,75 @@ + +package mage.cards.m; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ChooseACardNameEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.CardsImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.game.Game; +import mage.players.Player; + +/** + * + * @author L_J + */ +public final class Mise extends CardImpl { + + public Mise(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{U}"); + + // Choose a nonland card name, then reveal the top card of your library. If that card has the chosen name, you draw three cards. + this.getSpellAbility().addEffect(new ChooseACardNameEffect(ChooseACardNameEffect.TypeOfName.NON_LAND_NAME)); + this.getSpellAbility().addEffect(new MiseEffect()); + } + + public Mise(final Mise card) { + super(card); + } + + @Override + public Mise copy() { + return new Mise(this); + } +} + +class MiseEffect extends OneShotEffect { + + public MiseEffect() { + super(Outcome.Detriment); + staticText = "then reveal the top card of your library. If that card has the chosen name, you draw three cards"; + } + + public MiseEffect(final MiseEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + Object object = (String) game.getState().getValue(source.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY); + if (player != null && object instanceof String) { + Card card = player.getLibrary().getFromTop(game); + String namedCard = (String) object; + CardsImpl cards = new CardsImpl(card); + if (card != null) { + player.revealCards("Mise", cards, game, true); + if (card.getName().equals(namedCard)) { + player.drawCards(3, game); + } + } + return true; + } + return false; + } + + @Override + public MiseEffect copy() { + return new MiseEffect(this); + } +} diff --git a/Mage.Sets/src/mage/cards/m/MishrasHelix.java b/Mage.Sets/src/mage/cards/m/MishrasHelix.java index 3a9a6d23eea..7bad595163a 100644 --- a/Mage.Sets/src/mage/cards/m/MishrasHelix.java +++ b/Mage.Sets/src/mage/cards/m/MishrasHelix.java @@ -1,4 +1,3 @@ - package mage.cards.m; import java.util.UUID; @@ -11,10 +10,10 @@ import mage.abilities.effects.common.TapTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.TargetAdjustment; import mage.constants.Zone; import mage.filter.StaticFilters; import mage.target.TargetPermanent; +import mage.target.targetadjustment.XTargetsAdjuster; /** * @@ -30,7 +29,7 @@ public final class MishrasHelix extends CardImpl { Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("{X}")); ability.addCost(new TapSourceCost()); ability.addTarget(new TargetPermanent(StaticFilters.FILTER_LANDS)); - ability.setTargetAdjustment(TargetAdjustment.X_TARGETS); + ability.setTargetAdjuster(XTargetsAdjuster.instance); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/m/MissionBriefing.java b/Mage.Sets/src/mage/cards/m/MissionBriefing.java index 128cecbc494..ecd3f55643f 100644 --- a/Mage.Sets/src/mage/cards/m/MissionBriefing.java +++ b/Mage.Sets/src/mage/cards/m/MissionBriefing.java @@ -2,14 +2,13 @@ package mage.cards.m; import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.effects.AsThoughEffectImpl; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.ReplacementEffectImpl; +import mage.abilities.effects.common.asthought.PlayFromNotOwnHandZoneTargetEffect; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.AsThoughEffectType; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; @@ -81,8 +80,8 @@ class MissionBriefingEffect extends OneShotEffect { } Card card = game.getCard(target.getFirstTarget()); if (card != null) { - ContinuousEffect effect = new MissionBriefingCastFromGraveyardEffect(); - effect.setTargetPointer(new FixedTarget(card.getId(), card.getZoneChangeCounter(game))); + ContinuousEffect effect = new PlayFromNotOwnHandZoneTargetEffect(); + effect.setTargetPointer(new FixedTarget(card, game)); game.addEffect(effect, source); effect = new MissionBriefingReplacementEffect(card.getId()); game.addEffect(effect, source); @@ -92,33 +91,6 @@ class MissionBriefingEffect extends OneShotEffect { } } -class MissionBriefingCastFromGraveyardEffect extends AsThoughEffectImpl { - - public MissionBriefingCastFromGraveyardEffect() { - super(AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, Duration.EndOfTurn, Outcome.Benefit); - } - - public MissionBriefingCastFromGraveyardEffect(final MissionBriefingCastFromGraveyardEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - return true; - } - - @Override - public MissionBriefingCastFromGraveyardEffect copy() { - return new MissionBriefingCastFromGraveyardEffect(this); - } - - @Override - public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) { - return objectId.equals(this.getTargetPointer().getFirst(game, source)) - && affectedControllerId.equals(source.getControllerId()); - } -} - class MissionBriefingReplacementEffect extends ReplacementEffectImpl { private final UUID cardId; diff --git a/Mage.Sets/src/mage/cards/m/MistveilPlains.java b/Mage.Sets/src/mage/cards/m/MistveilPlains.java index bc811b0d1cf..f564de722b7 100644 --- a/Mage.Sets/src/mage/cards/m/MistveilPlains.java +++ b/Mage.Sets/src/mage/cards/m/MistveilPlains.java @@ -1,7 +1,6 @@ package mage.cards.m; -import java.util.UUID; import mage.ObjectColor; import mage.abilities.Ability; import mage.abilities.common.ActivateIfConditionActivatedAbility; @@ -14,29 +13,28 @@ import mage.abilities.mana.WhiteManaAbility; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.SubType; -import mage.constants.ComparisonType; -import mage.constants.Outcome; -import mage.constants.Zone; +import mage.constants.*; import mage.filter.common.FilterControlledPermanent; import mage.filter.predicate.mageobject.ColorPredicate; import mage.game.Game; +import mage.players.Player; import mage.target.common.TargetCardInYourGraveyard; +import java.util.UUID; + /** - * * @author LevelX2 */ public final class MistveilPlains extends CardImpl { private static final FilterControlledPermanent filter = new FilterControlledPermanent("you control two or more white permanents"); + static { filter.add(new ColorPredicate(ObjectColor.WHITE)); } public MistveilPlains(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.LAND},""); + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); this.subtype.add(SubType.PLAINS); // ({tap}: Add {W}.) @@ -47,10 +45,11 @@ public final class MistveilPlains extends CardImpl { // {W}, {tap}: Put target card from your graveyard on the bottom of your library. Activate this ability only if you control two or more white permanents. Ability ability = new ActivateIfConditionActivatedAbility( - Zone.BATTLEFIELD, - new MistveilPlainsGraveyardToLibraryEffect(), - new ManaCostsImpl("{W}"), - new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.MORE_THAN, 1)); + Zone.BATTLEFIELD, + new MistveilPlainsGraveyardToLibraryEffect(), + new ManaCostsImpl("{W}"), + new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.MORE_THAN, 1) + ); ability.addTarget(new TargetCardInYourGraveyard()); ability.addCost(new TapSourceCost()); this.addAbility(ability); @@ -85,10 +84,12 @@ class MistveilPlainsGraveyardToLibraryEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Card card = game.getCard(getTargetPointer().getFirst(game, source)); - if (card != null && game.getState().getZone(card.getId()) == Zone.GRAVEYARD) { - return card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, false); + Card card = game.getCard(source.getFirstTarget()); + Player player = game.getPlayer(source.getControllerId()); + if (card == null || player == null || + game.getState().getZone(card.getId()) == Zone.GRAVEYARD) { + return false; } - return false; + return player.putCardsOnBottomOfLibrary(card, game, source, false); } } diff --git a/Mage.Sets/src/mage/cards/m/MnemonicBetrayal.java b/Mage.Sets/src/mage/cards/m/MnemonicBetrayal.java new file mode 100644 index 00000000000..019527dd74f --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/MnemonicBetrayal.java @@ -0,0 +1,251 @@ +package mage.cards.m; + +import mage.abilities.Ability; +import mage.abilities.DelayedTriggeredAbility; +import mage.abilities.effects.AsThoughEffectImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ExileSpellEffect; +import mage.cards.*; +import mage.constants.*; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.players.Player; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class MnemonicBetrayal extends CardImpl { + + public MnemonicBetrayal(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{U}{B}"); + + // Exile all cards from all opponents' graveyards. You may cast those cards this turn, and you may spend mana as though it were mana of any type to cast those spells. At the beginning of the next end step, if any of those cards remain exiled, return them to their owner's graveyards. + this.getSpellAbility().addEffect(new MnemonicBetrayalExileEffect()); + + // Exile Mnemonic Betrayal. + this.getSpellAbility().addEffect(ExileSpellEffect.getInstance()); + } + + public MnemonicBetrayal(final MnemonicBetrayal card) { + super(card); + } + + @Override + public MnemonicBetrayal copy() { + return new MnemonicBetrayal(this); + } +} + +class MnemonicBetrayalExileEffect extends OneShotEffect { + + public MnemonicBetrayalExileEffect() { + super(Outcome.Benefit); + this.staticText = "Exile all cards from all opponents' graveyards. " + + "You may cast those cards this turn, " + + "and you may spend mana as though it were mana of any type " + + "to cast those spells. At the beginning of the next end step, " + + "if any of those cards remain exiled, " + + "return them to their owner's graveyards"; + } + + public MnemonicBetrayalExileEffect(final MnemonicBetrayalExileEffect effect) { + super(effect); + } + + @Override + public MnemonicBetrayalExileEffect copy() { + return new MnemonicBetrayalExileEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller == null) { + return false; + } + Cards cards = new CardsImpl(); + Map cardMap = new HashMap(); + for (UUID playerId : game.getOpponents(source.getControllerId())) { + Player player = game.getPlayer(playerId); + if (player != null) { + cards.addAll(player.getGraveyard()); + } + } + for (Card card : cards.getCards(game)) { + cardMap.put(card.getId(), card.getZoneChangeCounter(game)); + game.addEffect(new MnemonicBetrayalCastFromExileEffect(card, game), source); + game.addEffect(new MnemonicBetrayalAnyColorEffect(card, game), source); + } + controller.moveCardsToExile(cards.getCards(game), source, game, true, source.getSourceId(), source.getSourceObjectIfItStillExists(game).getName()); + game.addDelayedTriggeredAbility(new MnemonicBetrayalDelayedTriggeredAbility(cards, cardMap), source); + return true; + } +} + +class MnemonicBetrayalCastFromExileEffect extends AsThoughEffectImpl { + + private final Card card; + private final int zoneCounter; + + public MnemonicBetrayalCastFromExileEffect(Card card, Game game) { + super(AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, Duration.Custom, Outcome.Benefit); + this.card = card; + this.zoneCounter = card.getZoneChangeCounter(game) + 1; + } + + public MnemonicBetrayalCastFromExileEffect(final MnemonicBetrayalCastFromExileEffect effect) { + super(effect); + this.card = effect.card; + this.zoneCounter = effect.zoneCounter; + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public MnemonicBetrayalCastFromExileEffect copy() { + return new MnemonicBetrayalCastFromExileEffect(this); + } + + @Override + public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) { + if (card.getZoneChangeCounter(game) != zoneCounter) { + this.discard(); + return false; + } + return objectId.equals(card.getId()) + && card.getZoneChangeCounter(game) == zoneCounter + && affectedControllerId.equals(source.getControllerId()); + } +} + +class MnemonicBetrayalAnyColorEffect extends AsThoughEffectImpl { + + private final Card card; + private final int zoneCounter; + + public MnemonicBetrayalAnyColorEffect(Card card, Game game) { + super(AsThoughEffectType.SPEND_OTHER_MANA, Duration.Custom, Outcome.Benefit); + this.card = card; + this.zoneCounter = card.getZoneChangeCounter(game) + 1; + } + + public MnemonicBetrayalAnyColorEffect(final MnemonicBetrayalAnyColorEffect effect) { + super(effect); + this.card = effect.card; + this.zoneCounter = effect.zoneCounter; + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public MnemonicBetrayalAnyColorEffect copy() { + return new MnemonicBetrayalAnyColorEffect(this); + } + + @Override + public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) { + if (card.getZoneChangeCounter(game) != zoneCounter) { + this.discard(); + return false; + } + return objectId.equals(card.getId()) + && card.getZoneChangeCounter(game) == zoneCounter + && affectedControllerId.equals(source.getControllerId()); + } +} + +class MnemonicBetrayalDelayedTriggeredAbility extends DelayedTriggeredAbility { + + private final Cards cards; + private final Map cardMap = new HashMap(); + + public MnemonicBetrayalDelayedTriggeredAbility(Cards cards, Map cardMap) { + super(new MnemonicBetrayalReturnEffect(cards, cardMap)); + this.triggerOnlyOnce = true; + this.cards = cards; + this.cardMap.putAll(cardMap); + } + + public MnemonicBetrayalDelayedTriggeredAbility(final MnemonicBetrayalDelayedTriggeredAbility ability) { + super(ability); + this.cards = ability.cards.copy(); + this.cardMap.putAll(ability.cardMap); + } + + @Override + public MnemonicBetrayalDelayedTriggeredAbility copy() { + return new MnemonicBetrayalDelayedTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.END_TURN_STEP_PRE; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + return true; + } + + @Override + public boolean checkInterveningIfClause(Game game) { + return cards.stream().anyMatch((cardId) -> (game.getState().getZone(cardId) == Zone.EXILED + && game.getState().getZoneChangeCounter(cardId) == cardMap.getOrDefault(cardId, -5) + 1)); + } + + @Override + public String getRule() { + return "At the beginning of the next end step, " + + "if any of those cards remain exiled, " + + "return them to their owner's graveyards."; + } +} + +class MnemonicBetrayalReturnEffect extends OneShotEffect { + + private final Cards cards; + private final Map cardMap = new HashMap(); + + public MnemonicBetrayalReturnEffect(Cards cards, Map cardMap) { + super(Outcome.Benefit); + this.cards = cards; + this.cardMap.putAll(cardMap); + } + + public MnemonicBetrayalReturnEffect(final MnemonicBetrayalReturnEffect effect) { + super(effect); + this.cards = effect.cards.copy(); + this.cardMap.putAll(effect.cardMap); + } + + @Override + public MnemonicBetrayalReturnEffect copy() { + return new MnemonicBetrayalReturnEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player == null) { + return false; + } + Cards cardsToReturn = new CardsImpl(); + for (Card card : cards.getCards(game)) { + if (game.getState().getZone(card.getId()) == Zone.EXILED + && card.getZoneChangeCounter(game) == cardMap.getOrDefault(card.getId(), -5) + 1) { + cardsToReturn.add(card); + } + } + return player.moveCards(cardsToReturn, Zone.GRAVEYARD, source, game); + } +} diff --git a/Mage.Sets/src/mage/cards/m/MondronenShaman.java b/Mage.Sets/src/mage/cards/m/MondronenShaman.java index aadaae2d692..e1466c56438 100644 --- a/Mage.Sets/src/mage/cards/m/MondronenShaman.java +++ b/Mage.Sets/src/mage/cards/m/MondronenShaman.java @@ -2,6 +2,7 @@ package mage.cards.m; import java.util.UUID; + import mage.MageInt; import mage.abilities.TriggeredAbility; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; @@ -11,20 +12,18 @@ import mage.abilities.effects.common.TransformSourceEffect; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.t.TovolarsMagehunter; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.TargetController; /** - * * @author North */ public final class MondronenShaman extends CardImpl { public MondronenShaman(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{R}"); - this.subtype.add(SubType.HUMAN); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}"); + this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.SHAMAN); this.subtype.add(SubType.WEREWOLF); @@ -32,7 +31,7 @@ public final class MondronenShaman extends CardImpl { this.toughness = new MageInt(2); this.transformable = true; - this.secondSideCardClazz = TovolarsMagehunter.class; + this.secondSideCardClazz = mage.cards.t.TovolarsMagehunter.class; // At the beginning of each upkeep, if no spells were cast last turn, transform Mondronen Shaman. this.addAbility(new TransformAbility()); @@ -50,4 +49,4 @@ public final class MondronenShaman extends CardImpl { public MondronenShaman copy() { return new MondronenShaman(this); } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/m/MonkeyMonkeyMonkey.java b/Mage.Sets/src/mage/cards/m/MonkeyMonkeyMonkey.java new file mode 100644 index 00000000000..4d3f5009026 --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/MonkeyMonkeyMonkey.java @@ -0,0 +1,150 @@ + +package mage.cards.m; + +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.common.AsEntersBattlefieldAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.choices.ChoiceImpl; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.filter.common.FilterNonlandPermanent; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.util.CardUtil; + +/** + * + * @author L_J + */ +public final class MonkeyMonkeyMonkey extends CardImpl { + + public MonkeyMonkeyMonkey(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{G}"); + this.subtype.add(SubType.MONKEY); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // As Monkey Monkey Monkey enters the battlefield, choose a letter. + this.addAbility(new AsEntersBattlefieldAbility(new ChooseLetterEffect())); + + // Monkey Monkey Monkey gets +1/+1 for each nonland permanent whose name begins with the chosen letter. + MonkeyMonkeyMonkeyCount count = new MonkeyMonkeyMonkeyCount(); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostSourceEffect(count, count, Duration.WhileOnBattlefield))); + + } + + public MonkeyMonkeyMonkey(final MonkeyMonkeyMonkey card) { + super(card); + } + + @Override + public MonkeyMonkeyMonkey copy() { + return new MonkeyMonkeyMonkey(this); + } +} + +class ChooseLetterEffect extends OneShotEffect { + + public ChooseLetterEffect() { + super(Outcome.Benefit); + staticText = "choose a letter"; + } + + public ChooseLetterEffect(final ChooseLetterEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + MageObject mageObject = game.getPermanentEntering(source.getSourceId()); + if (mageObject == null) { + mageObject = game.getObject(source.getSourceId()); + } + + ChoiceImpl choice = new ChoiceImpl(true); + choice.setMessage("Choose letter"); + Set choices = new HashSet<>(); + for (Character letter = 'A'; letter <= 'Z'; letter++) { + choices.add(letter.toString()); + } + choice.setChoices(choices); + + if (controller != null && mageObject != null && controller.choose(outcome, choice, game)) { + if (!game.isSimulation()) { + game.informPlayers(mageObject.getLogName() + ": " + controller.getLogName() + " has chosen " + choice.getChoice()); + } + game.getState().setValue(mageObject.getId() + "_letter", choice.getChoice()); + if (mageObject instanceof Permanent) { + ((Permanent) mageObject).addInfo("chosen letter", CardUtil.addToolTipMarkTags("Chosen letter: " + choice.getChoice()), game); + } + return true; + } + return false; + } + + @Override + public ChooseLetterEffect copy() { + return new ChooseLetterEffect(this); + } +} + +class MonkeyMonkeyMonkeyCount implements DynamicValue { + + public MonkeyMonkeyMonkeyCount() { + } + + public MonkeyMonkeyMonkeyCount(final MonkeyMonkeyMonkeyCount countersCount) { + } + + @Override + public int calculate(Game game, Ability sourceAbility, Effect effect) { + + + MageObject mageObject = game.getObject(sourceAbility.getSourceId()); + if (mageObject instanceof Permanent) { + Permanent permanent = game.getPermanentOrLKIBattlefield(sourceAbility.getSourceId()); + if (permanent != null && game.getState().getValue(mageObject.getId() + "_letter") != null) { + int letters = 0; + for (Permanent p : game.getBattlefield().getActivePermanents(new FilterNonlandPermanent(), sourceAbility.getControllerId(), sourceAbility.getSourceId(), game)) { + Character initial = Character.toUpperCase(p.getName().charAt(0)); + if (initial.toString().equals(game.getState().getValue(mageObject.getId() + "_letter"))) { + letters++; + } + } + return letters; + } + } + return 0; + } + + @Override + public MonkeyMonkeyMonkeyCount copy() { + return new MonkeyMonkeyMonkeyCount(this); + } + + @Override + public String toString() { + return "1"; + } + + @Override + public String getMessage() { + return "nonland permanent whose name begins with the chosen letter"; + } +} diff --git a/Mage.Sets/src/mage/cards/m/MuYanling.java b/Mage.Sets/src/mage/cards/m/MuYanling.java index 04b3846758c..f44cd02c010 100644 --- a/Mage.Sets/src/mage/cards/m/MuYanling.java +++ b/Mage.Sets/src/mage/cards/m/MuYanling.java @@ -4,7 +4,7 @@ package mage.cards.m; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.combat.CantBeBlockedTargetEffect; @@ -34,7 +34,7 @@ public final class MuYanling extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.YANLING); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(5)); // +2: Target creature can't be blocked this turn. LoyaltyAbility ability = new LoyaltyAbility(new CantBeBlockedTargetEffect(), 2); diff --git a/Mage.Sets/src/mage/cards/n/NahiriTheHarbinger.java b/Mage.Sets/src/mage/cards/n/NahiriTheHarbinger.java index 6ca0c67b225..c0dd70f67eb 100644 --- a/Mage.Sets/src/mage/cards/n/NahiriTheHarbinger.java +++ b/Mage.Sets/src/mage/cards/n/NahiriTheHarbinger.java @@ -5,7 +5,7 @@ import java.util.UUID; import mage.abilities.Ability; import mage.abilities.DelayedTriggeredAbility; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; import mage.abilities.costs.common.DiscardCardCost; import mage.abilities.effects.ContinuousEffect; @@ -59,7 +59,7 @@ public final class NahiriTheHarbinger extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.NAHIRI); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(4)); // +2: You may discard a card. If you do, draw a card. this.addAbility(new LoyaltyAbility(new DoIfCostPaid(new DrawCardSourceControllerEffect(1), new DiscardCardCost()), 2)); diff --git a/Mage.Sets/src/mage/cards/n/NahiriTheLithomancer.java b/Mage.Sets/src/mage/cards/n/NahiriTheLithomancer.java index 2719500019f..4a93fc89379 100644 --- a/Mage.Sets/src/mage/cards/n/NahiriTheLithomancer.java +++ b/Mage.Sets/src/mage/cards/n/NahiriTheLithomancer.java @@ -5,7 +5,7 @@ import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; import mage.abilities.common.CanBeYourCommanderAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateTokenEffect; @@ -24,7 +24,6 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.permanent.token.KorSoldierToken; import mage.game.permanent.token.NahiriTheLithomancerEquipmentToken; -import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; import mage.players.Player; import mage.target.Target; @@ -43,7 +42,7 @@ public final class NahiriTheLithomancer extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.NAHIRI); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3)); // +2: Create a 1/1 white Kor Soldier creature token. You may attach an Equipment you control to it. this.addAbility(new LoyaltyAbility(new NahiriTheLithomancerFirstAbilityEffect(), 2)); diff --git a/Mage.Sets/src/mage/cards/n/NarsetEnlightenedMaster.java b/Mage.Sets/src/mage/cards/n/NarsetEnlightenedMaster.java index d8cd1e7382d..8301068ad25 100644 --- a/Mage.Sets/src/mage/cards/n/NarsetEnlightenedMaster.java +++ b/Mage.Sets/src/mage/cards/n/NarsetEnlightenedMaster.java @@ -1,4 +1,3 @@ - package mage.cards.n; import java.util.Set; @@ -77,7 +76,7 @@ class NarsetEnlightenedMasterExileEffect extends OneShotEffect { && !card.isCreature() && !card.isLand()) { ContinuousEffect effect = new NarsetEnlightenedMasterCastFromExileEffect(); - effect.setTargetPointer(new FixedTarget(card.getId())); + effect.setTargetPointer(new FixedTarget(card, game)); game.addEffect(effect, source); } } @@ -115,7 +114,8 @@ class NarsetEnlightenedMasterCastFromExileEffect extends AsThoughEffectImpl { @Override public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) { - if (objectId.equals(getTargetPointer().getFirst(game, source)) && affectedControllerId.equals(source.getControllerId())) { + if (objectId.equals(getTargetPointer().getFirst(game, source)) + && affectedControllerId.equals(source.getControllerId())) { Card card = game.getCard(objectId); if (card != null) { Player player = game.getPlayer(affectedControllerId); diff --git a/Mage.Sets/src/mage/cards/n/NarsetTranscendent.java b/Mage.Sets/src/mage/cards/n/NarsetTranscendent.java index afcaa7a0c1b..0779b55bc29 100644 --- a/Mage.Sets/src/mage/cards/n/NarsetTranscendent.java +++ b/Mage.Sets/src/mage/cards/n/NarsetTranscendent.java @@ -6,7 +6,7 @@ import mage.MageObject; import mage.abilities.Ability; import mage.abilities.DelayedTriggeredAbility; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; @@ -43,7 +43,7 @@ public final class NarsetTranscendent extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.NARSET); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(6)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(6)); // +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)); diff --git a/Mage.Sets/src/mage/cards/n/NecroticOoze.java b/Mage.Sets/src/mage/cards/n/NecroticOoze.java index cb192e769bb..47c4ebf5b42 100644 --- a/Mage.Sets/src/mage/cards/n/NecroticOoze.java +++ b/Mage.Sets/src/mage/cards/n/NecroticOoze.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Set; import java.util.UUID; import java.util.stream.Collectors; + import mage.MageInt; import mage.abilities.Ability; import mage.abilities.ActivatedAbility; @@ -15,20 +16,18 @@ import mage.abilities.effects.Effect; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.y.YixlidJailer; import mage.constants.*; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; /** - * * @author BetaSteward_at_googlemail.com */ public final class NecroticOoze extends CardImpl { public NecroticOoze(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{B}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}{B}"); this.subtype.add(SubType.OOZE); this.power = new MageInt(4); @@ -90,7 +89,7 @@ public final class NecroticOoze extends CardImpl { public Set isDependentTo(List allEffectsInLayer) { // the dependent classes needs to be an enclosed class for dependent check of continuous effects return allEffectsInLayer.stream() - .filter(effect -> YixlidJailer.class.equals(effect.getClass().getEnclosingClass())) + .filter(effect -> mage.cards.y.YixlidJailer.class.equals(effect.getClass().getEnclosingClass())) .map(Effect::getId) .collect(Collectors.toSet()); diff --git a/Mage.Sets/src/mage/cards/n/NeglectedHeirloom.java b/Mage.Sets/src/mage/cards/n/NeglectedHeirloom.java index 0976c6963d6..4a2bf67de6e 100644 --- a/Mage.Sets/src/mage/cards/n/NeglectedHeirloom.java +++ b/Mage.Sets/src/mage/cards/n/NeglectedHeirloom.java @@ -2,6 +2,7 @@ package mage.cards.n; import java.util.UUID; + import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.mana.GenericManaCost; @@ -11,7 +12,6 @@ import mage.abilities.keyword.EquipAbility; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.a.AshmouthBlade; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Outcome; @@ -20,17 +20,16 @@ import mage.game.Game; import mage.game.events.GameEvent; /** - * * @author halljared */ public final class NeglectedHeirloom extends CardImpl { public NeglectedHeirloom(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{1}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{1}"); this.subtype.add(SubType.EQUIPMENT); this.transformable = true; - this.secondSideCardClazz = AshmouthBlade.class; + this.secondSideCardClazz = mage.cards.a.AshmouthBlade.class; // Equipped creature gets +1/+1. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEquippedEffect(1, 1))); diff --git a/Mage.Sets/src/mage/cards/n/NeverHappened.java b/Mage.Sets/src/mage/cards/n/NeverHappened.java index 0350e967f46..e497c5e8ddf 100644 --- a/Mage.Sets/src/mage/cards/n/NeverHappened.java +++ b/Mage.Sets/src/mage/cards/n/NeverHappened.java @@ -3,18 +3,18 @@ package mage.cards.n; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; +import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.cards.Cards; import mage.constants.CardType; import mage.constants.Outcome; +import mage.constants.Zone; import mage.filter.FilterCard; import mage.filter.common.FilterNonlandCard; -import mage.filter.predicate.other.OwnerIdPredicate; import mage.game.Game; import mage.players.Player; -import mage.target.Target; -import mage.target.common.TargetCardInGraveyard; -import mage.target.common.TargetCardInHand; +import mage.target.TargetCard; import mage.target.common.TargetOpponent; /** @@ -67,20 +67,24 @@ class NeverHappenedEffect extends OneShotEffect { return false; } opponent.revealCards(source, opponent.getHand(), game); - Target target; + TargetCard target; + Cards cards; if (controller.chooseUse(outcome, "Exile a card from hand or graveyard?", null, "Hand", "Graveyard", source, game)) { FilterCard filter = new FilterNonlandCard("nonland card in " + opponent.getName() + "'s hand"); - filter.add(new OwnerIdPredicate(opponent.getId())); - target = new TargetCardInHand(filter); + target = new TargetCard(Zone.HAND, filter); target.setNotTarget(true); + cards = opponent.getHand(); } else { FilterCard filter = new FilterNonlandCard("nonland card in " + opponent.getName() + "'s graveyard"); - filter.add(new OwnerIdPredicate(opponent.getId())); - target = new TargetCardInGraveyard(filter); + target = new TargetCard(Zone.GRAVEYARD, filter); target.setNotTarget(true); + cards = opponent.getGraveyard(); } - if (controller.choose(outcome, target, source.getSourceId(), game)) { - controller.moveCardsToExile(game.getCard(target.getFirstTarget()), source, game, false, null, null); + if (controller.choose(outcome, cards, target, game)) { + Card card = game.getCard(target.getFirstTarget()); + if (card != null) { + controller.moveCards(card, Zone.EXILED, source, game); + } } return true; } diff --git a/Mage.Sets/src/mage/cards/n/NicolBolasGodPharaoh.java b/Mage.Sets/src/mage/cards/n/NicolBolasGodPharaoh.java index 6f4f0c5119d..af68ba9102e 100644 --- a/Mage.Sets/src/mage/cards/n/NicolBolasGodPharaoh.java +++ b/Mage.Sets/src/mage/cards/n/NicolBolasGodPharaoh.java @@ -6,7 +6,7 @@ import java.util.Map; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.AsThoughEffectImpl; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; @@ -44,7 +44,7 @@ public final class NicolBolasGodPharaoh extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.BOLAS); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(7)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(7)); // +2: Target opponent exiles cards from the top of their library until he or she exiles a nonland card. Until end of turn, you may cast that card without paying its mana cost. LoyaltyAbility ability = new LoyaltyAbility(new NicolBolasGodPharaohPlusTwoEffect(), 2); diff --git a/Mage.Sets/src/mage/cards/n/NicolBolasPlaneswalker.java b/Mage.Sets/src/mage/cards/n/NicolBolasPlaneswalker.java index ba43fe13c59..b9e0111c7d0 100644 --- a/Mage.Sets/src/mage/cards/n/NicolBolasPlaneswalker.java +++ b/Mage.Sets/src/mage/cards/n/NicolBolasPlaneswalker.java @@ -3,7 +3,7 @@ package mage.cards.n; import java.util.UUID; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.DestroyTargetEffect; import mage.abilities.effects.common.SacrificeEffect; @@ -39,7 +39,7 @@ public final class NicolBolasPlaneswalker extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.BOLAS); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(5)); // +3: Destroy target noncreature permanent. LoyaltyAbility ability = new LoyaltyAbility(new DestroyTargetEffect(), 3); diff --git a/Mage.Sets/src/mage/cards/n/NicolBolasTheArisen.java b/Mage.Sets/src/mage/cards/n/NicolBolasTheArisen.java index 825c0d5c41c..51ac41ea426 100644 --- a/Mage.Sets/src/mage/cards/n/NicolBolasTheArisen.java +++ b/Mage.Sets/src/mage/cards/n/NicolBolasTheArisen.java @@ -3,7 +3,7 @@ package mage.cards.n; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; @@ -51,7 +51,7 @@ public final class NicolBolasTheArisen extends CardImpl { this.nightCard = true; this.transformable = true; - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(7)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(7)); // +2: Draw two cards. this.addAbility(new LoyaltyAbility(new DrawCardSourceControllerEffect(2), 2)); diff --git a/Mage.Sets/src/mage/cards/n/NicolBolasTheDeceiver.java b/Mage.Sets/src/mage/cards/n/NicolBolasTheDeceiver.java index 7da742c5d84..fa50e526abd 100644 --- a/Mage.Sets/src/mage/cards/n/NicolBolasTheDeceiver.java +++ b/Mage.Sets/src/mage/cards/n/NicolBolasTheDeceiver.java @@ -4,7 +4,7 @@ package mage.cards.n; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DamagePlayersEffect; import mage.abilities.effects.common.DestroyTargetEffect; @@ -34,7 +34,7 @@ public final class NicolBolasTheDeceiver extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{5}{U}{B}{R}"); this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.BOLAS); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(5)); // +3: Each opponent loses 3 life unless that player sacrifices a nonland permanent or discards a card. this.addAbility(new LoyaltyAbility(new NicolBolasTheDeceiverFirstEffect(), 3)); diff --git a/Mage.Sets/src/mage/cards/n/NimblePilferer.java b/Mage.Sets/src/mage/cards/n/NimblePilferer.java new file mode 100644 index 00000000000..bbd383b6642 --- /dev/null +++ b/Mage.Sets/src/mage/cards/n/NimblePilferer.java @@ -0,0 +1,36 @@ +package mage.cards.n; + +import mage.MageInt; +import mage.abilities.keyword.FlashAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; + +import java.util.UUID; + +/** + * @author JayDi85 + */ +public final class NimblePilferer extends CardImpl { + + public NimblePilferer(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}"); + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.ROGUE); + + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + this.addAbility(FlashAbility.getInstance()); + } + + public NimblePilferer(final NimblePilferer card) { + super(card); + } + + @Override + public NimblePilferer copy() { + return new NimblePilferer(this); + } +} diff --git a/Mage.Sets/src/mage/cards/n/NissaGenesisMage.java b/Mage.Sets/src/mage/cards/n/NissaGenesisMage.java index 5fb90752219..16296836744 100644 --- a/Mage.Sets/src/mage/cards/n/NissaGenesisMage.java +++ b/Mage.Sets/src/mage/cards/n/NissaGenesisMage.java @@ -4,7 +4,7 @@ package mage.cards.n; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; import mage.abilities.effects.common.UntapTargetEffect; @@ -43,7 +43,7 @@ public final class NissaGenesisMage extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.NISSA); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(5)); //+2: Untap up to two target creatures and up to two target lands. Ability ability = new LoyaltyAbility(new UntapTargetEffect(false).setText("Untap up to two target creatures and up to two target lands"), +2); diff --git a/Mage.Sets/src/mage/cards/n/NissaNaturesArtisan.java b/Mage.Sets/src/mage/cards/n/NissaNaturesArtisan.java index 886bbbf8708..375be16f431 100644 --- a/Mage.Sets/src/mage/cards/n/NissaNaturesArtisan.java +++ b/Mage.Sets/src/mage/cards/n/NissaNaturesArtisan.java @@ -7,7 +7,7 @@ import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.GainLifeEffect; @@ -40,7 +40,7 @@ public final class NissaNaturesArtisan extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.NISSA); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(5)); // +3: You gain 3 life. this.addAbility(new LoyaltyAbility(new GainLifeEffect(3), 3)); diff --git a/Mage.Sets/src/mage/cards/n/NissaRevane.java b/Mage.Sets/src/mage/cards/n/NissaRevane.java index 66679a8d576..707127196e3 100644 --- a/Mage.Sets/src/mage/cards/n/NissaRevane.java +++ b/Mage.Sets/src/mage/cards/n/NissaRevane.java @@ -4,7 +4,7 @@ package mage.cards.n; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect; import mage.cards.CardImpl; @@ -39,7 +39,7 @@ public final class NissaRevane extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.PLANESWALKER},"{2}{G}{G}"); this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.NISSA); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(2)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(2)); LoyaltyAbility ability1 = new LoyaltyAbility(new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(1, nissasChosenFilter)), 1); this.addAbility(ability1); diff --git a/Mage.Sets/src/mage/cards/n/NissaSageAnimist.java b/Mage.Sets/src/mage/cards/n/NissaSageAnimist.java index bf09e73362f..5940a4b0ac9 100644 --- a/Mage.Sets/src/mage/cards/n/NissaSageAnimist.java +++ b/Mage.Sets/src/mage/cards/n/NissaSageAnimist.java @@ -4,7 +4,7 @@ package mage.cards.n; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateTokenEffect; @@ -37,7 +37,7 @@ public final class NissaSageAnimist extends CardImpl { this.nightCard = true; - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3)); // +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. this.addAbility(new LoyaltyAbility(new NissaSageAnimistPlusOneEffect(), 1)); diff --git a/Mage.Sets/src/mage/cards/n/NissaVitalForce.java b/Mage.Sets/src/mage/cards/n/NissaVitalForce.java index 5832d40d259..42555bb7d75 100644 --- a/Mage.Sets/src/mage/cards/n/NissaVitalForce.java +++ b/Mage.Sets/src/mage/cards/n/NissaVitalForce.java @@ -4,7 +4,7 @@ package mage.cards.n; import java.util.UUID; import mage.MageInt; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.common.GetEmblemEffect; import mage.abilities.effects.common.ReturnToHandTargetEffect; import mage.abilities.effects.common.UntapTargetEffect; @@ -22,7 +22,6 @@ import mage.filter.common.FilterPermanentCard; import mage.filter.predicate.permanent.ControllerPredicate; import mage.game.command.emblems.NissaVitalForceEmblem; import mage.game.permanent.token.TokenImpl; -import mage.game.permanent.token.Token; import mage.target.common.TargetCardInYourGraveyard; import mage.target.common.TargetLandPermanent; @@ -43,7 +42,7 @@ public final class NissaVitalForce extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.NISSA); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(5)); // +1: Untap target land you control. Until your next turn, it becomes a 5/5 Elemental creature with haste. It's still a land. LoyaltyAbility ability = new LoyaltyAbility(new UntapTargetEffect(), 1); diff --git a/Mage.Sets/src/mage/cards/n/NissaVoiceOfZendikar.java b/Mage.Sets/src/mage/cards/n/NissaVoiceOfZendikar.java index e8468a64e62..b1e29389dc3 100644 --- a/Mage.Sets/src/mage/cards/n/NissaVoiceOfZendikar.java +++ b/Mage.Sets/src/mage/cards/n/NissaVoiceOfZendikar.java @@ -3,7 +3,7 @@ package mage.cards.n; import java.util.UUID; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; import mage.abilities.effects.Effect; import mage.abilities.effects.common.CreateTokenEffect; @@ -39,7 +39,7 @@ public final class NissaVoiceOfZendikar extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.NISSA); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3)); // +1: Create a 0/1 green Plant creature token. this.addAbility(new LoyaltyAbility(new CreateTokenEffect(new PlantToken()), 1)); diff --git a/Mage.Sets/src/mage/cards/n/NissaWorldwaker.java b/Mage.Sets/src/mage/cards/n/NissaWorldwaker.java index 78a62b955b8..d4bb8631323 100644 --- a/Mage.Sets/src/mage/cards/n/NissaWorldwaker.java +++ b/Mage.Sets/src/mage/cards/n/NissaWorldwaker.java @@ -4,7 +4,7 @@ package mage.cards.n; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.UntapTargetEffect; @@ -20,7 +20,6 @@ import mage.filter.common.FilterControlledLandPermanent; import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.permanent.token.TokenImpl; -import mage.game.permanent.token.Token; import mage.players.Player; import mage.target.TargetPermanent; import mage.target.common.TargetCardInLibrary; @@ -41,7 +40,7 @@ public final class NissaWorldwaker extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.NISSA); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3)); // +1: Target land you control becomes a 4/4 Elemental creature with trample. It's still a land. LoyaltyAbility ability = new LoyaltyAbility(new BecomesCreatureTargetEffect(new NissaWorldwakerToken(), false, true, Duration.Custom), 1); diff --git a/Mage.Sets/src/mage/cards/n/NotionRain.java b/Mage.Sets/src/mage/cards/n/NotionRain.java index 171706396c1..c478038d132 100644 --- a/Mage.Sets/src/mage/cards/n/NotionRain.java +++ b/Mage.Sets/src/mage/cards/n/NotionRain.java @@ -19,11 +19,11 @@ public final class NotionRain extends CardImpl { // Surveil 2, then draw two cards. Rain of Notions deals 2 damage to you. this.getSpellAbility().addEffect( - new SurveilEffect(2).setText("Surveil 2,") + new SurveilEffect(2).setText("Surveil 2") ); this.getSpellAbility().addEffect( new DrawCardSourceControllerEffect(2) - .setText("then draw two cards.") + .setText(", then draw two cards") ); this.getSpellAbility().addEffect(new DamageControllerEffect(2)); } diff --git a/Mage.Sets/src/mage/cards/n/Novellamental.java b/Mage.Sets/src/mage/cards/n/Novellamental.java new file mode 100644 index 00000000000..e81323db4b4 --- /dev/null +++ b/Mage.Sets/src/mage/cards/n/Novellamental.java @@ -0,0 +1,39 @@ + +package mage.cards.n; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.CanBlockOnlyFlyingAbility; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; + +/** + * + * @author L_J + */ +public final class Novellamental extends CardImpl { + + public Novellamental(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{U}"); + this.subtype.add(SubType.ELEMENTAL); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + // Novellamental can block only creatures with flying. + this.addAbility(new CanBlockOnlyFlyingAbility()); + } + + public Novellamental(final Novellamental card) { + super(card); + } + + @Override + public Novellamental copy() { + return new Novellamental(this); + } +} diff --git a/Mage.Sets/src/mage/cards/n/NowIKnowMyABCs.java b/Mage.Sets/src/mage/cards/n/NowIKnowMyABCs.java new file mode 100644 index 00000000000..ee3f6b47f58 --- /dev/null +++ b/Mage.Sets/src/mage/cards/n/NowIKnowMyABCs.java @@ -0,0 +1,69 @@ + +package mage.cards.n; + +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.condition.Condition; +import mage.abilities.decorator.ConditionalTriggeredAbility; +import mage.abilities.effects.common.WinGameSourceControllerEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.TargetController; +import mage.game.Game; +import mage.game.permanent.Permanent; + +/** + * + * @author L_J + */ +public final class NowIKnowMyABCs extends CardImpl { + + public NowIKnowMyABCs(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{1}{U}{U}"); + + // At the beginning of your upkeep, if you control permanents with names that include all twenty-six letters of the English alphabet, you win the game. + this.addAbility(new ConditionalTriggeredAbility( + new BeginningOfUpkeepTriggeredAbility(new WinGameSourceControllerEffect(), TargetController.YOU, false), + new NowIKnowMyABCsCondition(), + "At the beginning of your upkeep, if you control permanents with names that include all twenty-six letters of the English alphabet, you win the game.")); + } + + public NowIKnowMyABCs(final NowIKnowMyABCs card) { + super(card); + } + + @Override + public NowIKnowMyABCs copy() { + return new NowIKnowMyABCs(this); + } +} + +class NowIKnowMyABCsCondition implements Condition { + + public NowIKnowMyABCsCondition() { + } + + @Override + public boolean apply(Game game, Ability source) { + Set letters = new HashSet<>(); + for (Permanent permanent : game.getBattlefield().getAllActivePermanents(source.getControllerId())) { + String permName = permanent.getName(); + for (int i = 0; i < permName.length(); i++) { + Character letter = permName.charAt(i); + if (Character.isLetter(letter)) { + letters.add(Character.toUpperCase(letter)); + } + } + } + return letters.size() >= 26; + } + + @Override + public String toString() { + return "if you control permanents with names that include all twenty-six letters of the English alphabet"; + } +} diff --git a/Mage.Sets/src/mage/cards/n/NullhideFerox.java b/Mage.Sets/src/mage/cards/n/NullhideFerox.java index f4dc7c3a0fe..3f8a27f35fa 100644 --- a/Mage.Sets/src/mage/cards/n/NullhideFerox.java +++ b/Mage.Sets/src/mage/cards/n/NullhideFerox.java @@ -12,7 +12,6 @@ import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DiscardOntoBattlefieldEffect; import mage.abilities.effects.common.continuous.LoseAllAbilitiesTargetEffect; -import mage.constants.SubType; import mage.abilities.keyword.HexproofAbility; import mage.cards.Card; import mage.cards.CardImpl; @@ -20,6 +19,7 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; +import mage.constants.SubType; import mage.constants.TargetController; import mage.constants.Zone; import mage.game.Game; @@ -106,7 +106,7 @@ class NullhideFeroxLoseAbilitiesEffect extends OneShotEffect { public NullhideFeroxLoseAbilitiesEffect() { super(Outcome.Benefit); - this.staticText = "{this} loses all abilities until end of turn"; + this.staticText = "{this} loses all abilities until end of turn. Any player may activate this ability"; } public NullhideFeroxLoseAbilitiesEffect(final NullhideFeroxLoseAbilitiesEffect effect) { diff --git a/Mage.Sets/src/mage/cards/n/NullstoneGargoyle.java b/Mage.Sets/src/mage/cards/n/NullstoneGargoyle.java index 2d528309079..35cbeedc1d2 100644 --- a/Mage.Sets/src/mage/cards/n/NullstoneGargoyle.java +++ b/Mage.Sets/src/mage/cards/n/NullstoneGargoyle.java @@ -1,7 +1,6 @@ package mage.cards.n; -import java.util.UUID; import mage.MageInt; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.effects.Effect; @@ -14,11 +13,13 @@ import mage.constants.SubType; import mage.constants.Zone; import mage.game.Game; import mage.game.events.GameEvent; +import mage.game.stack.Spell; import mage.target.targetpointer.FixedTarget; import mage.watchers.common.SpellsCastWatcher; +import java.util.UUID; + /** - * * @author LevelX2 */ public final class NullstoneGargoyle extends CardImpl { @@ -53,7 +54,7 @@ class NullstoneGargoyleTriggeredAbility extends TriggeredAbilityImpl { super(Zone.BATTLEFIELD, new CounterTargetEffect(), false); } - public NullstoneGargoyleTriggeredAbility(NullstoneGargoyleTriggeredAbility ability) { + public NullstoneGargoyleTriggeredAbility(final NullstoneGargoyleTriggeredAbility ability) { super(ability); } @@ -69,6 +70,10 @@ class NullstoneGargoyleTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { + Spell spell = game.getSpell(event.getTargetId()); + if (spell.isCreature()) { + return false; + } SpellsCastWatcher watcher = (SpellsCastWatcher) game.getState().getWatchers().get(SpellsCastWatcher.class.getSimpleName()); if (watcher != null && watcher.getNumberOfNonCreatureSpells() == 1) { for (Effect effect : getEffects()) { diff --git a/Mage.Sets/src/mage/cards/o/ObNixilisOfTheBlackOath.java b/Mage.Sets/src/mage/cards/o/ObNixilisOfTheBlackOath.java index c1b328c80e2..77c5200a32c 100644 --- a/Mage.Sets/src/mage/cards/o/ObNixilisOfTheBlackOath.java +++ b/Mage.Sets/src/mage/cards/o/ObNixilisOfTheBlackOath.java @@ -5,7 +5,7 @@ import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; import mage.abilities.common.CanBeYourCommanderAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.GetEmblemEffect; @@ -32,7 +32,7 @@ public final class ObNixilisOfTheBlackOath extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.NIXILIS); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3)); // +2: Each opponent loses 1 life. You gain life equal to the life lost this way. this.addAbility(new LoyaltyAbility(new ObNixilisOfTheBlackOathEffect1(), 2)); diff --git a/Mage.Sets/src/mage/cards/o/ObNixilisReignited.java b/Mage.Sets/src/mage/cards/o/ObNixilisReignited.java index 7fa12d9dd16..5bea48f7f8a 100644 --- a/Mage.Sets/src/mage/cards/o/ObNixilisReignited.java +++ b/Mage.Sets/src/mage/cards/o/ObNixilisReignited.java @@ -3,7 +3,7 @@ package mage.cards.o; import java.util.UUID; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.common.DestroyTargetEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; @@ -29,7 +29,7 @@ public final class ObNixilisReignited extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.NIXILIS); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(5)); // +1: You draw a card and you lose 1 life. Effect effect = new DrawCardSourceControllerEffect(1); diff --git a/Mage.Sets/src/mage/cards/o/ObNixilisUnshackled.java b/Mage.Sets/src/mage/cards/o/ObNixilisUnshackled.java index 56f21b1b8e4..5dc21406737 100644 --- a/Mage.Sets/src/mage/cards/o/ObNixilisUnshackled.java +++ b/Mage.Sets/src/mage/cards/o/ObNixilisUnshackled.java @@ -1,7 +1,6 @@ package mage.cards.o; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.TriggeredAbilityImpl; @@ -25,14 +24,15 @@ import mage.game.events.GameEvent.EventType; import mage.players.Player; import mage.target.targetpointer.FixedTarget; +import java.util.UUID; + /** - * * @author emerald000 */ public final class ObNixilisUnshackled extends CardImpl { public ObNixilisUnshackled(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{B}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{B}{B}"); addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.DEMON); @@ -41,13 +41,13 @@ public final class ObNixilisUnshackled extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); - + // Trample this.addAbility(TrampleAbility.getInstance()); - + // Whenever an opponent searches their library, that player sacrifices a creature and loses 10 life. this.addAbility(new ObNixilisUnshackledTriggeredAbility()); - + // Whenever another creature dies, put at +1/+1 counter on Ob Nixilis, Unshackled. this.addAbility(new DiesCreatureTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()), false, true)); } @@ -63,15 +63,15 @@ public final class ObNixilisUnshackled extends CardImpl { } class ObNixilisUnshackledTriggeredAbility extends TriggeredAbilityImpl { - - ObNixilisUnshackledTriggeredAbility() { + + public ObNixilisUnshackledTriggeredAbility() { super(Zone.BATTLEFIELD, new ObNixilisUnshackledEffect(), false); } - - ObNixilisUnshackledTriggeredAbility(final ObNixilisUnshackledTriggeredAbility ability) { + + public ObNixilisUnshackledTriggeredAbility(final ObNixilisUnshackledTriggeredAbility ability) { super(ability); } - + @Override public ObNixilisUnshackledTriggeredAbility copy() { return new ObNixilisUnshackledTriggeredAbility(this); @@ -81,17 +81,18 @@ class ObNixilisUnshackledTriggeredAbility extends TriggeredAbilityImpl { public boolean checkEventType(GameEvent event, Game game) { return event.getType() == EventType.LIBRARY_SEARCHED; } - + @Override public boolean checkTrigger(GameEvent event, Game game) { Player controller = game.getPlayer(this.getControllerId()); - if (controller != null && game.isOpponent(controller, event.getTargetId())) { + if (controller != null && game.isOpponent(controller, event.getTargetId()) + && event.getTargetId().equals(event.getPlayerId())) { getEffects().get(0).setTargetPointer(new FixedTarget(event.getPlayerId())); return true; } return false; } - + @Override public String getRule() { return "Whenever an opponent searches their library, that player sacrifices a creature and loses 10 life."; @@ -99,23 +100,23 @@ class ObNixilisUnshackledTriggeredAbility extends TriggeredAbilityImpl { } class ObNixilisUnshackledEffect extends SacrificeEffect { - + static private final FilterPermanent filter = new FilterControlledCreaturePermanent("creature"); - - ObNixilisUnshackledEffect() { + + public ObNixilisUnshackledEffect() { super(filter, 1, "that player"); this.staticText = "that player sacrifices a creature and loses 10 life"; } - - ObNixilisUnshackledEffect(final ObNixilisUnshackledEffect effect) { + + public ObNixilisUnshackledEffect(final ObNixilisUnshackledEffect effect) { super(effect); } - + @Override public ObNixilisUnshackledEffect copy() { return new ObNixilisUnshackledEffect(this); } - + @Override public boolean apply(Game game, Ability source) { Player player = game.getPlayer(this.getTargetPointer().getFirst(game, source)); diff --git a/Mage.Sets/src/mage/cards/o/ObeliskOfUrd.java b/Mage.Sets/src/mage/cards/o/ObeliskOfUrd.java index 83dd0a6bad3..7a3269d833c 100644 --- a/Mage.Sets/src/mage/cards/o/ObeliskOfUrd.java +++ b/Mage.Sets/src/mage/cards/o/ObeliskOfUrd.java @@ -66,7 +66,7 @@ class ObeliskOfUrdBoostEffect extends ContinuousEffectImpl { public boolean apply(Game game, Ability source) { Permanent permanent = game.getPermanent(source.getSourceId()); if (permanent != null) { - SubType subType = ChooseCreatureTypeEffect.getChoosenCreatureType(source.getSourceId(), game); + SubType subType = ChooseCreatureTypeEffect.getChosenCreatureType(source.getSourceId(), game); if (subType != null) { for (Permanent perm : game.getBattlefield().getAllActivePermanents(filter, source.getControllerId(), game)) { if (perm.hasSubtype(subType, game)) { diff --git a/Mage.Sets/src/mage/cards/o/ObiWanKenobi.java b/Mage.Sets/src/mage/cards/o/ObiWanKenobi.java index 907ca43eaea..6343c6ef0c6 100644 --- a/Mage.Sets/src/mage/cards/o/ObiWanKenobi.java +++ b/Mage.Sets/src/mage/cards/o/ObiWanKenobi.java @@ -4,7 +4,7 @@ package mage.cards.o; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.common.GetEmblemEffect; import mage.abilities.effects.common.TapTargetEffect; @@ -29,7 +29,7 @@ public final class ObiWanKenobi extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{3}{W}{U}"); this.subtype.add(SubType.OBI_WAN); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(5)); // +1:Up to one target creature you control gains vigilance and protection from color of your choice until end of turn. Effect effect = new GainAbilityTargetEffect(VigilanceAbility.getInstance(), Duration.EndOfTurn); diff --git a/Mage.Sets/src/mage/cards/o/OgrePainbringer.java b/Mage.Sets/src/mage/cards/o/OgrePainbringer.java new file mode 100644 index 00000000000..6a51e5b6502 --- /dev/null +++ b/Mage.Sets/src/mage/cards/o/OgrePainbringer.java @@ -0,0 +1,38 @@ +package mage.cards.o; + +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.DamagePlayersEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.TargetController; + +import java.util.UUID; + +/** + * @author JayDi85 + */ +public final class OgrePainbringer extends CardImpl { + + public OgrePainbringer(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}{R}"); + this.subtype.add(SubType.OGRE); + + this.power = new MageInt(7); + this.toughness = new MageInt(3); + + // When Ogre Painbringer enters the battlefield, it deals 3 damage to each player. + this.addAbility(new EntersBattlefieldTriggeredAbility(new DamagePlayersEffect(3, TargetController.ANY, "it"))); + } + + public OgrePainbringer(final OgrePainbringer card) { + super(card); + } + + @Override + public OgrePainbringer copy() { + return new OgrePainbringer(this); + } +} diff --git a/Mage.Sets/src/mage/cards/o/OrneryGoblin.java b/Mage.Sets/src/mage/cards/o/OrneryGoblin.java new file mode 100644 index 00000000000..7e56c1249a8 --- /dev/null +++ b/Mage.Sets/src/mage/cards/o/OrneryGoblin.java @@ -0,0 +1,40 @@ +package mage.cards.o; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.BlocksOrBecomesBlockedTriggeredAbility; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author TheElk801 + */ +public final class OrneryGoblin extends CardImpl { + + public OrneryGoblin(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}"); + + this.subtype.add(SubType.GOBLIN); + this.subtype.add(SubType.WARRIOR); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // Whenever Ornery Goblin blocks or becomes blocked by a creature, Ornery Goblin deals 1 damage to that creature. + this.addAbility(new BlocksOrBecomesBlockedTriggeredAbility( + new DamageTargetEffect(1, true, "that creature"), false + )); + } + + public OrneryGoblin(final OrneryGoblin card) { + super(card); + } + + @Override + public OrneryGoblin copy() { + return new OrneryGoblin(this); + } +} diff --git a/Mage.Sets/src/mage/cards/p/PardicFirecat.java b/Mage.Sets/src/mage/cards/p/PardicFirecat.java index 4d4edecd88b..b12becb85a3 100644 --- a/Mage.Sets/src/mage/cards/p/PardicFirecat.java +++ b/Mage.Sets/src/mage/cards/p/PardicFirecat.java @@ -2,22 +2,21 @@ package mage.cards.p; import java.util.UUID; + import mage.MageInt; import mage.abilities.keyword.HasteAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.f.FlameBurst; import mage.constants.CardType; import mage.constants.SubType; /** - * * @author LoneFox */ public final class PardicFirecat extends CardImpl { public PardicFirecat(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}"); this.subtype.add(SubType.ELEMENTAL); this.subtype.add(SubType.CAT); this.power = new MageInt(2); @@ -26,7 +25,7 @@ public final class PardicFirecat extends CardImpl { // Haste this.addAbility(HasteAbility.getInstance()); // If Pardic Firecat is in a graveyard, effects from spells named Flame Burst count it as a card named Flame Burst. - this.addAbility(FlameBurst.getCountAsAbility()); + this.addAbility(mage.cards.f.FlameBurst.getCountAsAbility()); } public PardicFirecat(final PardicFirecat card) { @@ -37,4 +36,4 @@ public final class PardicFirecat extends CardImpl { public PardicFirecat copy() { return new PardicFirecat(this); } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/p/PathOfMettle.java b/Mage.Sets/src/mage/cards/p/PathOfMettle.java index 10ec5e2d641..e2a2759b770 100644 --- a/Mage.Sets/src/mage/cards/p/PathOfMettle.java +++ b/Mage.Sets/src/mage/cards/p/PathOfMettle.java @@ -2,6 +2,7 @@ package mage.cards.p; import java.util.UUID; + import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.effects.common.DamageAllEffect; @@ -13,7 +14,6 @@ import mage.abilities.keyword.TransformAbility; import mage.abilities.keyword.VigilanceAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.m.MetzaliTowerOfTriumph; import mage.constants.CardType; import mage.constants.SuperType; import mage.constants.Zone; @@ -24,7 +24,6 @@ import mage.game.Game; import mage.game.events.GameEvent; /** - * * @author LevelX2 */ public final class PathOfMettle extends CardImpl { @@ -46,7 +45,7 @@ public final class PathOfMettle extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.transformable = true; - this.secondSideCardClazz = MetzaliTowerOfTriumph.class; + this.secondSideCardClazz = mage.cards.m.MetzaliTowerOfTriumph.class; // When Path of Mettle enters the battlefield, it deals 1 damage to each creature that doesn't have first strike, double strike, vigilance, or haste. this.addAbility(new EntersBattlefieldTriggeredAbility(new DamageAllEffect(1, filter))); @@ -118,5 +117,4 @@ class PathOfMettleTriggeredAbility extends TriggeredAbilityImpl { public String getRule() { return "Whenever you attack with at least two creatures that have first strike, double strike, vigilance, and/or haste, transform Path of Mettle"; } - -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/p/PeltCollector.java b/Mage.Sets/src/mage/cards/p/PeltCollector.java new file mode 100644 index 00000000000..7ef8ae3b5f1 --- /dev/null +++ b/Mage.Sets/src/mage/cards/p/PeltCollector.java @@ -0,0 +1,145 @@ +package mage.cards.p; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.common.SourceHasCounterCondition; +import mage.abilities.decorator.ConditionalContinuousEffect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.keyword.TrampleAbility; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.ZoneChangeEvent; +import mage.game.permanent.Permanent; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author TheElk801 + */ +public final class PeltCollector extends CardImpl { + + public PeltCollector(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{G}"); + + this.subtype.add(SubType.ELF); + this.subtype.add(SubType.WARRIOR); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // Whenever another creature you control enters the battlefield or dies, if that creature's power is greater than Pelt Collector's, put a +1/+1 counter on Pelt Collector. + this.addAbility(new PeltCollectorAbility()); + + // As long as Pelt Collector has three or more +1/+1 counters on it, it has trample. + this.addAbility(new SimpleStaticAbility( + Zone.BATTLEFIELD, + new ConditionalContinuousEffect( + new GainAbilitySourceEffect( + TrampleAbility.getInstance(), + Duration.WhileOnBattlefield + ), new SourceHasCounterCondition(CounterType.P1P1, 3), + "As long as {this} has three or more +1/+1 " + + "counters on it, it has trample." + ) + )); + } + + public PeltCollector(final PeltCollector card) { + super(card); + } + + @Override + public PeltCollector copy() { + return new PeltCollector(this); + } +} + +class PeltCollectorAbility extends TriggeredAbilityImpl { + + public PeltCollectorAbility() { + super(Zone.BATTLEFIELD, new PeltCollectorEffect()); + } + + public PeltCollectorAbility(PeltCollectorAbility ability) { + super(ability); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return (event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD) + || (event.getType() == GameEvent.EventType.ZONE_CHANGE + && ((ZoneChangeEvent) event).isDiesEvent()) ; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (event.getTargetId().equals(this.getSourceId())) { + return false; + } + Permanent triggeringCreature = game.getPermanentOrLKIBattlefield(event.getTargetId()); + Permanent sourceCreature = game.getPermanent(this.getSourceId()); + if (isPowerGreater(sourceCreature, triggeringCreature) + && triggeringCreature.isCreature() + && triggeringCreature.isControlledBy(this.getControllerId())) { + this.getEffects().get(0).setTargetPointer(new FixedTarget(event.getTargetId())); + return true; + } + return false; + } + + public static boolean isPowerGreater(Permanent sourceCreature, Permanent newCreature) { + return sourceCreature != null && newCreature != null + && newCreature.getPower().getValue() + > sourceCreature.getPower().getValue(); + } + + @Override + public String getRule() { + return "Whenever another creature you control enters the battlefield " + + "or dies, if that creature's power is greater than {this}'s, " + + "put a +1/+1 counter on {this}."; + } + + @Override + public PeltCollectorAbility copy() { + return new PeltCollectorAbility(this); + } +} + +class PeltCollectorEffect extends OneShotEffect { + + public PeltCollectorEffect() { + super(Outcome.BoostCreature); + } + + public PeltCollectorEffect(final PeltCollectorEffect effect) { + super(effect); + } + + @Override + public PeltCollectorEffect copy() { + return new PeltCollectorEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent triggeringCreature = game.getPermanentOrLKIBattlefield(getTargetPointer().getFirst(game, source)); + Permanent sourceCreature = game.getPermanent(source.getSourceId()); + if (!PeltCollectorAbility.isPowerGreater(sourceCreature, triggeringCreature)) { + return false; + } + return new AddCountersSourceEffect(CounterType.P1P1.createInstance()).apply(game, source); + } +} diff --git a/Mage.Sets/src/mage/cards/p/PemminsAura.java b/Mage.Sets/src/mage/cards/p/PemminsAura.java index 2e6ec49aebc..89139bc99de 100644 --- a/Mage.Sets/src/mage/cards/p/PemminsAura.java +++ b/Mage.Sets/src/mage/cards/p/PemminsAura.java @@ -100,7 +100,7 @@ class PemminsAuraBoostEnchantedEffect extends OneShotEffect { choice.setMessage("Select how to boost"); choice.getChoices().add(CHOICE_1); choice.getChoices().add(CHOICE_2); - if (!controller.choose(outcome, choice, game)) { + if (controller.choose(outcome, choice, game)) { if (choice.getChoice().equals(CHOICE_1)) { game.addEffect(new BoostEnchantedEffect(+1, -1, Duration.EndOfTurn), source); } else { diff --git a/Mage.Sets/src/mage/cards/p/PentarchPaladin.java b/Mage.Sets/src/mage/cards/p/PentarchPaladin.java index dffc4b86d07..4e27796c3ed 100644 --- a/Mage.Sets/src/mage/cards/p/PentarchPaladin.java +++ b/Mage.Sets/src/mage/cards/p/PentarchPaladin.java @@ -1,8 +1,8 @@ - package mage.cards.p; import java.util.UUID; import mage.MageInt; +import mage.ObjectColor; import mage.abilities.Ability; import mage.abilities.common.AsEntersBattlefieldAbility; import mage.abilities.common.SimpleActivatedAbility; @@ -19,7 +19,11 @@ import mage.constants.Zone; import mage.filter.FilterPermanent; import mage.target.TargetPermanent; import mage.abilities.effects.common.DestroyTargetEffect; -import mage.constants.TargetAdjustment; +import mage.constants.ComparisonType; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.filter.predicate.mageobject.ConvertedManaCostPredicate; +import mage.game.Game; +import mage.target.targetadjustment.TargetAdjuster; /** * @@ -27,7 +31,7 @@ import mage.constants.TargetAdjustment; */ public final class PentarchPaladin extends CardImpl { - FilterPermanent filter = new FilterPermanent("permanent of the chosen color."); + private static final FilterPermanent filter = new FilterPermanent("permanent of the chosen color."); public PentarchPaladin(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}{W}{W}"); @@ -47,7 +51,7 @@ public final class PentarchPaladin extends CardImpl { Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DestroyTargetEffect(), new ManaCostsImpl("{W}{W}")); ability.addCost(new TapSourceCost()); ability.addTarget(new TargetPermanent(filter)); - ability.setTargetAdjustment(TargetAdjustment.CHOSEN_COLOR); + ability.setTargetAdjuster(PentarchPaladinAdjuster.instance); this.addAbility(ability); } @@ -60,3 +64,21 @@ public final class PentarchPaladin extends CardImpl { return new PentarchPaladin(this); } } + +enum PentarchPaladinAdjuster implements TargetAdjuster { + instance; + + @Override + public void adjustTargets(Ability ability, Game game) { + ObjectColor chosenColor = (ObjectColor) game.getState().getValue(ability.getSourceId() + "_color"); + ability.getTargets().clear(); + FilterPermanent filter = new FilterPermanent("permanent of the chosen color."); + if (chosenColor != null) { + filter.add(new ColorPredicate(chosenColor)); + } else { + filter.add(new ConvertedManaCostPredicate(ComparisonType.FEWER_THAN, -5));// Pretty sure this is always false + } + TargetPermanent oldTargetPermanent = new TargetPermanent(filter); + ability.addTarget(oldTargetPermanent); + } +} diff --git a/Mage.Sets/src/mage/cards/p/PilferingImp.java b/Mage.Sets/src/mage/cards/p/PilferingImp.java new file mode 100644 index 00000000000..5b0340b6c34 --- /dev/null +++ b/Mage.Sets/src/mage/cards/p/PilferingImp.java @@ -0,0 +1,59 @@ +package mage.cards.p; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.ActivateAsSorceryActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.discard.DiscardCardYouChooseTargetEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.StaticFilters; +import mage.target.common.TargetOpponent; + +/** + * + * @author TheElk801 + */ +public final class PilferingImp extends CardImpl { + + public PilferingImp(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{B}"); + + this.subtype.add(SubType.IMP); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // {1}{B}, {T}, Sacrifice Pilfering Imp: Target opponent reveals their hand. You choose a nonland 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( + StaticFilters.FILTER_CARD_NON_LAND, + TargetController.OPPONENT + ), new ManaCostsImpl("{1}{B}") + ); + ability.addCost(new TapSourceCost()); + ability.addCost(new SacrificeSourceCost()); + ability.addTarget(new TargetOpponent()); + this.addAbility(ability); + } + + public PilferingImp(final PilferingImp card) { + super(card); + } + + @Override + public PilferingImp copy() { + return new PilferingImp(this); + } +} diff --git a/Mage.Sets/src/mage/cards/p/PillarOfOrigins.java b/Mage.Sets/src/mage/cards/p/PillarOfOrigins.java index 99502464e1d..80b830551cc 100644 --- a/Mage.Sets/src/mage/cards/p/PillarOfOrigins.java +++ b/Mage.Sets/src/mage/cards/p/PillarOfOrigins.java @@ -53,7 +53,7 @@ class PillarOfOriginsManaBuilder extends ConditionalManaBuilder { @Override public ConditionalManaBuilder setMana(Mana mana, Ability source, Game game) { - creatureType = ChooseCreatureTypeEffect.getChoosenCreatureType(source.getSourceId(), game); + creatureType = ChooseCreatureTypeEffect.getChosenCreatureType(source.getSourceId(), game); Player controller = game.getPlayer(source.getControllerId()); MageObject sourceObject = game.getObject(source.getSourceId()); if (controller != null && sourceObject != null) { diff --git a/Mage.Sets/src/mage/cards/p/PiousEvangel.java b/Mage.Sets/src/mage/cards/p/PiousEvangel.java index 3e95888ccb0..3cf2046a8a3 100644 --- a/Mage.Sets/src/mage/cards/p/PiousEvangel.java +++ b/Mage.Sets/src/mage/cards/p/PiousEvangel.java @@ -2,6 +2,7 @@ package mage.cards.p; import java.util.UUID; + import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; @@ -14,7 +15,6 @@ import mage.abilities.effects.common.TransformSourceEffect; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.w.WaywardDisciple; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Zone; @@ -25,7 +25,6 @@ import mage.filter.predicate.permanent.AnotherPredicate; import mage.target.common.TargetControlledPermanent; /** - * * @author fireshoes */ public final class PiousEvangel extends CardImpl { @@ -38,14 +37,14 @@ public final class PiousEvangel extends CardImpl { } public PiousEvangel(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.CLERIC); this.power = new MageInt(2); this.toughness = new MageInt(2); this.transformable = true; - this.secondSideCardClazz = WaywardDisciple.class; + this.secondSideCardClazz = mage.cards.w.WaywardDisciple.class; // Whenever Pious Evangel or another creature enters the battlefield under your control, you gain 1 life. this.addAbility(new EntersBattlefieldControlledTriggeredAbility(new GainLifeEffect(1), filter)); @@ -66,4 +65,4 @@ public final class PiousEvangel extends CardImpl { public PiousEvangel copy() { return new PiousEvangel(this); } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/p/PistonFistCyclops.java b/Mage.Sets/src/mage/cards/p/PistonFistCyclops.java index 2aa04190912..e362ad9416c 100644 --- a/Mage.Sets/src/mage/cards/p/PistonFistCyclops.java +++ b/Mage.Sets/src/mage/cards/p/PistonFistCyclops.java @@ -6,7 +6,7 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.Condition; -import mage.abilities.decorator.ConditionalContinuousEffect; +import mage.abilities.decorator.ConditionalAsThoughEffect; import mage.abilities.effects.common.combat.CanAttackAsThoughItDidntHaveDefenderSourceEffect; import mage.constants.SubType; import mage.abilities.keyword.DefenderAbility; @@ -38,14 +38,14 @@ public final class PistonFistCyclops extends CardImpl { // As long as you've cast an instant or sorcery spell this turn, Piston-Fist Cyclops can attack as though it didn't have defender. this.addAbility(new SimpleStaticAbility( Zone.BATTLEFIELD, - new ConditionalContinuousEffect( + new ConditionalAsThoughEffect( new CanAttackAsThoughItDidntHaveDefenderSourceEffect( Duration.WhileOnBattlefield - ), PistonFistCyclopsCondition.instance, - "As long as you've cast an instant or sorcery spell this turn, " - + "{this} can attack as though it didn't have defender." - ) - ), new SpellsCastWatcher()); + ), PistonFistCyclopsCondition.instance) + .setText("As long as you've cast an instant or sorcery spell this turn, " + + "{this} can attack as though it didn't have defender") + ), + new SpellsCastWatcher()); } public PistonFistCyclops(final PistonFistCyclops card) { diff --git a/Mage.Sets/src/mage/cards/p/Plaguebearer.java b/Mage.Sets/src/mage/cards/p/Plaguebearer.java index 05edb43572f..a9dec0874b5 100644 --- a/Mage.Sets/src/mage/cards/p/Plaguebearer.java +++ b/Mage.Sets/src/mage/cards/p/Plaguebearer.java @@ -1,4 +1,3 @@ - package mage.cards.p; import java.util.UUID; @@ -12,13 +11,13 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.constants.TargetAdjustment; import mage.constants.Zone; import mage.filter.FilterPermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.CardTypePredicate; import mage.filter.predicate.mageobject.ColorPredicate; import mage.target.TargetPermanent; +import mage.target.targetadjustment.XCMCPermanentAdjuster; /** * @@ -42,7 +41,7 @@ public final class Plaguebearer extends CardImpl { // {X}{X}{B}: Destroy target nonblack creature with converted mana cost X. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DestroyTargetEffect(), new ManaCostsImpl("{X}{X}{B}")); ability.addTarget(new TargetPermanent(filter)); - ability.setTargetAdjustment(TargetAdjustment.X_CMC_EQUAL_PERM); + ability.setTargetAdjuster(XCMCPermanentAdjuster.instance); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/p/Plaguecrafter.java b/Mage.Sets/src/mage/cards/p/Plaguecrafter.java new file mode 100644 index 00000000000..39eaf6eb382 --- /dev/null +++ b/Mage.Sets/src/mage/cards/p/Plaguecrafter.java @@ -0,0 +1,116 @@ +package mage.cards.p; + +import java.util.ArrayList; +import java.util.List; +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.OneShotEffect; +import mage.abilities.effects.common.discard.DiscardTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.filter.common.FilterControlledPermanent; +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.common.TargetControlledPermanent; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author themogwi + */ +public final class Plaguecrafter extends CardImpl { + + public Plaguecrafter(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}"); + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.SHAMAN); + + this.power = new MageInt(3); + this.toughness = new MageInt(2); + + // When Plaguecrafter enters the battlefield. + // Each player sacrifices a creature or planeswalker. + // Each player who can't discards a card. + this.addAbility(new EntersBattlefieldTriggeredAbility(new PlaguecrafterEffect())); + } + + public Plaguecrafter(final Plaguecrafter card) { + super(card); + } + + @Override + public Plaguecrafter copy() { + return new Plaguecrafter(this); + } +} + +class PlaguecrafterEffect extends OneShotEffect { + + public PlaguecrafterEffect() { + super(Outcome.Benefit); + this.staticText = "each player sacrifices a creature or planeswalker. " + + "Each player who can't discards a card."; + } + + public PlaguecrafterEffect(final PlaguecrafterEffect effect) { + super(effect); + } + + @Override + public PlaguecrafterEffect copy() { + return new PlaguecrafterEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller == null) { + return false; + } + + List perms = new ArrayList<>(); + List cantSac = new ArrayList<>(); + + for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) { + Player player = game.getPlayer(playerId); + if (player != null) { + FilterControlledPermanent filter = new FilterControlledPermanent(); + filter.add(Predicates.or( + new CardTypePredicate(CardType.CREATURE), + new CardTypePredicate(CardType.PLANESWALKER))); + TargetControlledPermanent target = new TargetControlledPermanent(1, 1, filter, true); + if (target.canChoose(player.getId(), game)) { + while (!target.isChosen() && player.canRespond()) { + player.choose(Outcome.Sacrifice, target, source.getSourceId(), game); + } + perms.addAll(target.getTargets()); + } else { + cantSac.add(playerId); + } + } + } + + for (UUID permID : perms) { + Permanent permanent = game.getPermanent(permID); + if (permanent != null) { + permanent.sacrifice(source.getSourceId(), game); + } + } + + for (UUID playerId : cantSac) { + Effect discardEffect = new DiscardTargetEffect(1); + discardEffect.setTargetPointer(new FixedTarget(playerId, game)); + discardEffect.apply(game, source); + } + return true; + } +} diff --git a/Mage.Sets/src/mage/cards/p/PortcullisVine.java b/Mage.Sets/src/mage/cards/p/PortcullisVine.java new file mode 100644 index 00000000000..3d72e9e4d60 --- /dev/null +++ b/Mage.Sets/src/mage/cards/p/PortcullisVine.java @@ -0,0 +1,64 @@ +package mage.cards.p; + +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.GenericManaCost; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.constants.SubType; +import mage.abilities.keyword.DefenderAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.mageobject.AbilityPredicate; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author TheElk801 + */ +public final class PortcullisVine extends CardImpl { + + private static final FilterControlledPermanent filter + = new FilterControlledCreaturePermanent("a creature with defender"); + + static { + filter.add(new AbilityPredicate(DefenderAbility.class)); + } + + public PortcullisVine(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{G}"); + + this.subtype.add(SubType.PLANT); + this.subtype.add(SubType.WALL); + this.power = new MageInt(0); + this.toughness = new MageInt(3); + + // Defender + this.addAbility(DefenderAbility.getInstance()); + + // {2}, {T}, Sacrifice a creature with defender: Draw a card. + Ability ability = new SimpleActivatedAbility( + new DrawCardSourceControllerEffect(1), new GenericManaCost(2) + ); + ability.addCost(new TapSourceCost()); + ability.addCost(new SacrificeTargetCost( + new TargetControlledPermanent(filter) + )); + this.addAbility(ability); + } + + public PortcullisVine(final PortcullisVine card) { + super(card); + } + + @Override + public PortcullisVine copy() { + return new PortcullisVine(this); + } +} diff --git a/Mage.Sets/src/mage/cards/p/PrecisionBolt.java b/Mage.Sets/src/mage/cards/p/PrecisionBolt.java new file mode 100644 index 00000000000..ae221c978ae --- /dev/null +++ b/Mage.Sets/src/mage/cards/p/PrecisionBolt.java @@ -0,0 +1,32 @@ +package mage.cards.p; + +import java.util.UUID; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.target.common.TargetAnyTarget; + +/** + * + * @author TheElk801 + */ +public final class PrecisionBolt extends CardImpl { + + public PrecisionBolt(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{R}"); + + // Precision Bolt deals 3 damage to any target. + this.getSpellAbility().addEffect(new DamageTargetEffect(3)); + this.getSpellAbility().addTarget(new TargetAnyTarget()); + } + + public PrecisionBolt(final PrecisionBolt card) { + super(card); + } + + @Override + public PrecisionBolt copy() { + return new PrecisionBolt(this); + } +} diff --git a/Mage.Sets/src/mage/cards/p/PrecognitionField.java b/Mage.Sets/src/mage/cards/p/PrecognitionField.java index 2f9b600f944..46ab2eac8fe 100644 --- a/Mage.Sets/src/mage/cards/p/PrecognitionField.java +++ b/Mage.Sets/src/mage/cards/p/PrecognitionField.java @@ -1,7 +1,6 @@ package mage.cards.p; -import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -17,6 +16,8 @@ import mage.constants.*; import mage.game.Game; import mage.players.Player; +import java.util.UUID; + /** * @author rscoates */ @@ -50,7 +51,7 @@ class PrecognitionFieldTopCardRevealedEffect extends ContinuousEffectImpl { public PrecognitionFieldTopCardRevealedEffect() { super(Duration.WhileOnBattlefield, Layer.PlayerEffects, SubLayer.NA, Outcome.Benefit); - staticText = "You may look at the top card of your library. (You may do this at any time.)"; + staticText = "You may look at the top card of your library any time."; } public PrecognitionFieldTopCardRevealedEffect(final PrecognitionFieldTopCardRevealedEffect effect) { diff --git a/Mage.Sets/src/mage/cards/p/PriceOfFame.java b/Mage.Sets/src/mage/cards/p/PriceOfFame.java index 1ea93d7af95..79f7737b9e6 100644 --- a/Mage.Sets/src/mage/cards/p/PriceOfFame.java +++ b/Mage.Sets/src/mage/cards/p/PriceOfFame.java @@ -5,6 +5,7 @@ import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.Condition; +import mage.abilities.effects.common.DestroyTargetEffect; import mage.abilities.effects.common.cost.SpellCostReductionSourceEffect; import mage.abilities.effects.keyword.SurveilEffect; import mage.cards.CardImpl; diff --git a/Mage.Sets/src/mage/cards/p/ProfaneProcession.java b/Mage.Sets/src/mage/cards/p/ProfaneProcession.java index 54ed2bce427..67d0fa84342 100644 --- a/Mage.Sets/src/mage/cards/p/ProfaneProcession.java +++ b/Mage.Sets/src/mage/cards/p/ProfaneProcession.java @@ -2,6 +2,7 @@ package mage.cards.p; import java.util.UUID; + import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -12,7 +13,6 @@ import mage.abilities.effects.common.TransformSourceEffect; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.t.TombOfTheDuskRose; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SuperType; @@ -24,7 +24,6 @@ import mage.target.common.TargetCreaturePermanent; import mage.util.CardUtil; /** - * * @author LevelX2 */ public final class ProfaneProcession extends CardImpl { @@ -35,7 +34,7 @@ public final class ProfaneProcession extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.transformable = true; - this.secondSideCardClazz = TombOfTheDuskRose.class; + this.secondSideCardClazz = mage.cards.t.TombOfTheDuskRose.class; // {3}{W}{B}: Exile target creature. Then if there are three or more cards exiled with Profane Procession, transform it. this.addAbility(new TransformAbility()); @@ -86,4 +85,4 @@ class ProfaneProcessionEffect extends OneShotEffect { } return false; } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/p/ProtectiveSphere.java b/Mage.Sets/src/mage/cards/p/ProtectiveSphere.java index 67657fa5455..aae9d64c1b0 100644 --- a/Mage.Sets/src/mage/cards/p/ProtectiveSphere.java +++ b/Mage.Sets/src/mage/cards/p/ProtectiveSphere.java @@ -52,8 +52,8 @@ public final class ProtectiveSphere extends CardImpl { class ProtectiveSphereEffect extends PreventionEffectImpl { private final TargetSource target; - private static Mana manaUsed; - private static List colorsOfChosenSource = new ArrayList<>(); + private Mana manaUsed; + private List colorsOfChosenSource = new ArrayList<>(); public ProtectiveSphereEffect() { super(Duration.EndOfTurn, Integer.MAX_VALUE, false, false); @@ -64,6 +64,8 @@ class ProtectiveSphereEffect extends PreventionEffectImpl { public ProtectiveSphereEffect(final ProtectiveSphereEffect effect) { super(effect); this.target = effect.target.copy(); + manaUsed = effect.manaUsed.copy(); + colorsOfChosenSource = effect.colorsOfChosenSource; } @Override diff --git a/Mage.Sets/src/mage/cards/p/Pyroblast.java b/Mage.Sets/src/mage/cards/p/Pyroblast.java index 57fcd9944cd..3c61105ebda 100644 --- a/Mage.Sets/src/mage/cards/p/Pyroblast.java +++ b/Mage.Sets/src/mage/cards/p/Pyroblast.java @@ -1,4 +1,3 @@ - package mage.cards.p; import java.util.UUID; @@ -20,19 +19,18 @@ import mage.target.TargetSpell; * @author Plopman */ public final class Pyroblast extends CardImpl { - - public Pyroblast(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{R}"); + public Pyroblast(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{R}"); // Choose one - Counter target spell if it's blue; or destroy target permanent if it's blue. this.getSpellAbility().addEffect(new PyroblastCounterTargetEffect()); this.getSpellAbility().addTarget(new TargetSpell()); - + Mode mode = new Mode(); - mode.getEffects().add(new DestroyTargetEffect()); + mode.getEffects().add(new PyroblastDestroyTargetEffect()); mode.getTargets().add(new TargetPermanent()); - + this.getSpellAbility().addMode(mode); } @@ -64,7 +62,7 @@ class PyroblastCounterTargetEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Spell targetSpell = game.getStack().getSpell(source.getFirstTarget()); - if(targetSpell != null && targetSpell.getColor(game).isBlue()){ + if (targetSpell != null && targetSpell.getColor(game).isBlue()) { game.getStack().counter(source.getFirstTarget(), source.getSourceId(), game); } return true; @@ -77,21 +75,19 @@ class PyroblastCounterTargetEffect extends OneShotEffect { } +class PyroblastDestroyTargetEffect extends OneShotEffect { -class DestroyTargetEffect extends OneShotEffect { - - - public DestroyTargetEffect() { + public PyroblastDestroyTargetEffect() { super(Outcome.DestroyPermanent); } - public DestroyTargetEffect(final DestroyTargetEffect effect) { + public PyroblastDestroyTargetEffect(final PyroblastDestroyTargetEffect effect) { super(effect); } @Override - public DestroyTargetEffect copy() { - return new DestroyTargetEffect(this); + public PyroblastDestroyTargetEffect copy() { + return new PyroblastDestroyTargetEffect(this); } @Override diff --git a/Mage.Sets/src/mage/cards/q/QuestForTheGoblinLord.java b/Mage.Sets/src/mage/cards/q/QuestForTheGoblinLord.java index 621b0a73874..80c2b92ca5b 100644 --- a/Mage.Sets/src/mage/cards/q/QuestForTheGoblinLord.java +++ b/Mage.Sets/src/mage/cards/q/QuestForTheGoblinLord.java @@ -1,4 +1,3 @@ - package mage.cards.q; import java.util.UUID; @@ -26,7 +25,7 @@ public final class QuestForTheGoblinLord extends CardImpl { private static final String rule = "As long as {this} has five or more quest counters on it, creatures you control get +2/+0"; private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(); - private static final FilterPermanent goblinFilter = new FilterControlledCreaturePermanent(); + private static final FilterPermanent goblinFilter = new FilterControlledCreaturePermanent("a Goblin"); static { filter.add(new ControllerPredicate(TargetController.YOU)); @@ -34,7 +33,7 @@ public final class QuestForTheGoblinLord extends CardImpl { } public QuestForTheGoblinLord(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{R}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{R}"); // Whenever a Goblin enters the battlefield under your control, you may put a quest counter on Quest for the Goblin Lord. this.addAbility(new EntersBattlefieldControlledTriggeredAbility(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.QUEST.createInstance()), goblinFilter, true)); diff --git a/Mage.Sets/src/mage/cards/r/RalCallerOfStorms.java b/Mage.Sets/src/mage/cards/r/RalCallerOfStorms.java index 7359b2352cd..cfbc4ecbbaf 100644 --- a/Mage.Sets/src/mage/cards/r/RalCallerOfStorms.java +++ b/Mage.Sets/src/mage/cards/r/RalCallerOfStorms.java @@ -3,7 +3,7 @@ package mage.cards.r; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.common.DamageAllEffect; import mage.abilities.effects.common.DamageMultiEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; @@ -28,7 +28,7 @@ public final class RalCallerOfStorms extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.RAL); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(4)); // +1: Draw a card. this.addAbility(new LoyaltyAbility( diff --git a/Mage.Sets/src/mage/cards/r/RalIzzetViceroy.java b/Mage.Sets/src/mage/cards/r/RalIzzetViceroy.java index 556963a5905..7390e5066ec 100644 --- a/Mage.Sets/src/mage/cards/r/RalIzzetViceroy.java +++ b/Mage.Sets/src/mage/cards/r/RalIzzetViceroy.java @@ -3,7 +3,7 @@ package mage.cards.r; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.dynamicvalue.common.InstantSorceryExileGraveyardCount; import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.common.DamageTargetEffect; @@ -30,7 +30,7 @@ public final class RalIzzetViceroy extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.RAL); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(5)); // +1: Look at the top two cards of your library. Put one of them into your hand and the other into your graveyard. this.addAbility(new LoyaltyAbility( diff --git a/Mage.Sets/src/mage/cards/r/RalZarek.java b/Mage.Sets/src/mage/cards/r/RalZarek.java index f49f45d5073..2dfe8cf9b6d 100644 --- a/Mage.Sets/src/mage/cards/r/RalZarek.java +++ b/Mage.Sets/src/mage/cards/r/RalZarek.java @@ -4,7 +4,7 @@ package mage.cards.r; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DamageTargetEffect; @@ -42,7 +42,7 @@ public final class RalZarek extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.RAL); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(4)); // +1: Tap target permanent, then untap another target permanent. LoyaltyAbility ability1 = new LoyaltyAbility(new TapTargetEffect(), 1); diff --git a/Mage.Sets/src/mage/cards/r/RalsDispersal.java b/Mage.Sets/src/mage/cards/r/RalsDispersal.java index 49bf949594a..4747d592aa0 100644 --- a/Mage.Sets/src/mage/cards/r/RalsDispersal.java +++ b/Mage.Sets/src/mage/cards/r/RalsDispersal.java @@ -28,7 +28,7 @@ public final class RalsDispersal extends CardImpl { // Return target creature to its owner's hand. You may search you library and/or graveyard for a card named Ral, Caller of Storms, reveal it, and put it in to your hand. If you search your library this way, shuffle it. this.getSpellAbility().addEffect(new ReturnToHandTargetEffect()); this.getSpellAbility().addEffect( - new SearchLibraryGraveyardPutInHandEffect(filter, false, false) + new SearchLibraryGraveyardPutInHandEffect(filter, false, true) ); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); } diff --git a/Mage.Sets/src/mage/cards/r/RampagingMonument.java b/Mage.Sets/src/mage/cards/r/RampagingMonument.java new file mode 100644 index 00000000000..53658be8759 --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RampagingMonument.java @@ -0,0 +1,53 @@ +package mage.cards.r; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.constants.SubType; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.counters.CounterType; +import mage.filter.StaticFilters; + +/** + * + * @author TheElk801 + */ +public final class RampagingMonument extends CardImpl { + + public RampagingMonument(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{4}"); + + this.subtype.add(SubType.CLERIC); + this.power = new MageInt(0); + this.toughness = new MageInt(0); + + // Trample + this.addAbility(TrampleAbility.getInstance()); + + // Rampaging Monument enters the battlefield with three +1/+1 counters on it. + this.addAbility(new EntersBattlefieldAbility( + new AddCountersSourceEffect(CounterType.P1P1.createInstance(3)), + "{this} enters the battlefield with three +1/+1 counters on it" + )); + + // Whenever you cast a multicolored spell, put a +1/+1 counter on Rampaging Monument. + this.addAbility(new SpellCastControllerTriggeredAbility( + new AddCountersSourceEffect(CounterType.P1P1.createInstance()), + StaticFilters.FILTER_SPELL_A_MULTICOLORED, false + )); + } + + public RampagingMonument(final RampagingMonument card) { + super(card); + } + + @Override + public RampagingMonument copy() { + return new RampagingMonument(this); + } +} diff --git a/Mage.Sets/src/mage/cards/r/RareBGone.java b/Mage.Sets/src/mage/cards/r/RareBGone.java new file mode 100644 index 00000000000..77d2521c8d4 --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RareBGone.java @@ -0,0 +1,119 @@ + +package mage.cards.r; + +import java.util.*; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.Cards; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.filter.FilterCard; +import mage.filter.FilterPermanent; +import mage.filter.predicate.Predicate; +import mage.filter.predicate.Predicates; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; + +/** + * + * @author L_J + */ +public final class RareBGone extends CardImpl { + + public RareBGone(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{B}{R}"); + + // Each player sacrifices all permanents that are rare or mythic rare, then each player reveals their hand and discards all cards that are rare or mythic rare. + this.getSpellAbility().addEffect(new RareBGoneEffect()); + + } + + public RareBGone(final RareBGone card) { + super(card); + } + + @Override + public RareBGone copy() { + return new RareBGone(this); + } +} + +class RareBGoneEffect extends OneShotEffect { + + private static final FilterPermanent filterPermanent = new FilterPermanent(); + private static final FilterCard filterCard = new FilterCard(); + + static { + filterPermanent.add(Predicates.or( + new RarityPredicate(Rarity.RARE), + new RarityPredicate(Rarity.MYTHIC) + )); + filterCard.add(Predicates.or( + new RarityPredicate(Rarity.RARE), + new RarityPredicate(Rarity.MYTHIC) + )); + } + + public RareBGoneEffect() { + super(Outcome.Benefit); + this.staticText = "Each player sacrifices all permanents that are rare or mythic rare, then each player reveals their hand and discards all cards that are rare or mythic rare"; + } + + public RareBGoneEffect(final RareBGoneEffect effect) { + super(effect); + } + + @Override + public RareBGoneEffect copy() { + return new RareBGoneEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) { + Player player = game.getPlayer(playerId); + if (player != null) { + for (Permanent permanent : game.getBattlefield().getAllActivePermanents(filterPermanent, playerId, game)) { + permanent.sacrifice(source.getSourceId(), game); + } + Cards hand = player.getHand(); + player.revealCards("Rare-B-Gone", hand, game); + Set cards = hand.getCards(game); + for (Card card : cards) { + if (card != null && filterCard.match(card, game)) { + player.discard(card, source, game); + } + } + } + } + return true; + } + return false; + } +} + +class RarityPredicate implements Predicate { + + private final Rarity rarity; + + public RarityPredicate(Rarity rarity) { + this.rarity = rarity; + } + + @Override + public boolean apply(Card input, Game game) { + return input.getRarity().equals(rarity); + } + + @Override + public String toString() { + return "Rarity(" + rarity + ')'; + } +} diff --git a/Mage.Sets/src/mage/cards/r/RavenousDemon.java b/Mage.Sets/src/mage/cards/r/RavenousDemon.java index 32268f4dcf0..d9d4e51e65f 100644 --- a/Mage.Sets/src/mage/cards/r/RavenousDemon.java +++ b/Mage.Sets/src/mage/cards/r/RavenousDemon.java @@ -2,6 +2,7 @@ package mage.cards.r; import java.util.UUID; + import mage.MageInt; import mage.abilities.common.ActivateAsSorceryActivatedAbility; import mage.abilities.costs.common.SacrificeTargetCost; @@ -9,7 +10,6 @@ import mage.abilities.effects.common.TransformSourceEffect; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.a.ArchdemonOfGreed; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Zone; @@ -18,7 +18,6 @@ import mage.filter.predicate.mageobject.SubtypePredicate; import mage.target.common.TargetControlledPermanent; /** - * * @author intimidatingant */ public final class RavenousDemon extends CardImpl { @@ -29,11 +28,11 @@ public final class RavenousDemon extends CardImpl { } public RavenousDemon(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{B}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}{B}"); this.subtype.add(SubType.DEMON); this.transformable = true; - this.secondSideCardClazz = ArchdemonOfGreed.class; + this.secondSideCardClazz = mage.cards.a.ArchdemonOfGreed.class; this.power = new MageInt(4); this.toughness = new MageInt(4); @@ -51,4 +50,4 @@ public final class RavenousDemon extends CardImpl { public RavenousDemon copy() { return new RavenousDemon(this); } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/r/Recantation.java b/Mage.Sets/src/mage/cards/r/Recantation.java index 55439bab5fa..1bb9a36ce33 100644 --- a/Mage.Sets/src/mage/cards/r/Recantation.java +++ b/Mage.Sets/src/mage/cards/r/Recantation.java @@ -1,6 +1,6 @@ - package mage.cards.r; +import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; @@ -12,14 +12,12 @@ import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.TargetAdjustment; import mage.constants.TargetController; import mage.constants.Zone; import mage.counters.CounterType; import mage.filter.FilterPermanent; import mage.target.TargetPermanent; - -import java.util.UUID; +import mage.target.targetadjustment.VerseCounterAdjuster; /** * @@ -40,7 +38,7 @@ public final class Recantation extends CardImpl { Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("{U}")); ability.addCost(new SacrificeSourceCost()); ability.addTarget(new TargetPermanent(0, 0, new FilterPermanent("up to X target permanents, where X is the number of verse counters on {this}."), false)); - ability.setTargetAdjustment(TargetAdjustment.VERSE_COUNTER_TARGETS); + ability.setTargetAdjuster(VerseCounterAdjuster.instance); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/r/RecklessWaif.java b/Mage.Sets/src/mage/cards/r/RecklessWaif.java index 04e5cca06c5..111ae634b79 100644 --- a/Mage.Sets/src/mage/cards/r/RecklessWaif.java +++ b/Mage.Sets/src/mage/cards/r/RecklessWaif.java @@ -2,6 +2,7 @@ package mage.cards.r; import java.util.UUID; + import mage.MageInt; import mage.abilities.TriggeredAbility; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; @@ -11,7 +12,6 @@ import mage.abilities.effects.common.TransformSourceEffect; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.m.MercilessPredator; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.TargetController; @@ -22,13 +22,13 @@ import mage.constants.TargetController; public final class RecklessWaif extends CardImpl { public RecklessWaif(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{R}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{R}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.ROGUE); this.subtype.add(SubType.WEREWOLF); this.transformable = true; - this.secondSideCardClazz = MercilessPredator.class; + this.secondSideCardClazz = mage.cards.m.MercilessPredator.class; this.power = new MageInt(1); this.toughness = new MageInt(1); diff --git a/Mage.Sets/src/mage/cards/r/ResponseResurgence.java b/Mage.Sets/src/mage/cards/r/ResponseResurgence.java index 68f7c253e61..50ba39c10f4 100644 --- a/Mage.Sets/src/mage/cards/r/ResponseResurgence.java +++ b/Mage.Sets/src/mage/cards/r/ResponseResurgence.java @@ -34,21 +34,21 @@ public final class ResponseResurgence extends SplitCard { // Resurgence // Creatures you control gain first strike and vigilance until end of turn. After this main phase, there is an additional combat phase followed by an additional main phase. - this.getLeftHalfCard().getSpellAbility().addEffect( + this.getRightHalfCard().getSpellAbility().addEffect( new GainAbilityControlledEffect( FirstStrikeAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_CONTROLLED_CREATURE ).setText("Creatures you control gain first strike") ); - this.getLeftHalfCard().getSpellAbility().addEffect( + this.getRightHalfCard().getSpellAbility().addEffect( new GainAbilityControlledEffect( VigilanceAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_CONTROLLED_CREATURE ).setText("and vigilance until end of turn") ); - this.getLeftHalfCard().getSpellAbility().addEffect( + this.getRightHalfCard().getSpellAbility().addEffect( new AddCombatAndMainPhaseEffect() ); } diff --git a/Mage.Sets/src/mage/cards/r/RhizomeLurcher.java b/Mage.Sets/src/mage/cards/r/RhizomeLurcher.java index bfa45116495..63c0c7913ca 100644 --- a/Mage.Sets/src/mage/cards/r/RhizomeLurcher.java +++ b/Mage.Sets/src/mage/cards/r/RhizomeLurcher.java @@ -9,7 +9,6 @@ import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.constants.SubType; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.AbilityWord; import mage.constants.CardType; import mage.counters.CounterType; import mage.filter.StaticFilters; @@ -35,10 +34,9 @@ public final class RhizomeLurcher extends CardImpl { new CardsInControllerGraveyardCount( StaticFilters.FILTER_CARD_CREATURE ), true - ), "with a number of +1/+1 counters on it equal to " - + "the number of creature cards in your graveyard" + ), null, "Undergrowth — {this} enters the battlefield with a number of +1/+1 counters on it equal to the number of creature cards in your graveyard.", + null ); - ability.setAbilityWord(AbilityWord.UNDERGROWTH); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/r/Ricochet.java b/Mage.Sets/src/mage/cards/r/Ricochet.java new file mode 100644 index 00000000000..f52a37caad0 --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/Ricochet.java @@ -0,0 +1,154 @@ + +package mage.cards.r; + +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.UUID; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.Mode; +import mage.abilities.common.SpellCastAllTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SetTargetPointer; +import mage.filter.FilterSpell; +import mage.filter.predicate.ObjectPlayer; +import mage.filter.predicate.ObjectPlayerPredicate; +import mage.filter.predicate.mageobject.NumberOfTargetsPredicate; +import mage.game.Game; +import mage.game.stack.Spell; +import mage.players.Player; +import mage.target.Target; +import mage.target.Targets; +import mage.util.TargetAddress; + +/** + * + * @author L_J + */ +public final class Ricochet extends CardImpl { + + protected static final FilterSpell filter = new FilterSpell("a spell that targets a single player"); + + static { + filter.add(new NumberOfTargetsPredicate(1)); + filter.add(new SpellWithOnlyPlayerTargetsPredicate()); + } + + public Ricochet(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{R}"); + + // Whenever a player casts a spell that targets a single player, each player rolls a six-sided die. Change the target of that spell to the player with the lowest result. Reroll to break ties, if necessary. + this.addAbility(new SpellCastAllTriggeredAbility(new RicochetEffect(), filter, false, SetTargetPointer.SPELL)); + } + + public Ricochet(final Ricochet card) { + super(card); + } + + @Override + public Ricochet copy() { + return new Ricochet(this); + } +} + +class SpellWithOnlyPlayerTargetsPredicate implements ObjectPlayerPredicate> { + + @Override + public boolean apply(ObjectPlayer input, Game game) { + Spell spell = input.getObject(); + if (spell == null) { + return false; + } + for (TargetAddress addr : TargetAddress.walk(spell)) { + Target targetInstance = addr.getTarget(spell); + for (UUID targetId : targetInstance.getTargets()) { + if (game.getPlayer(targetId) == null) { + return false; + } + } + } + return true; + } +} + +class RicochetEffect extends OneShotEffect { + + public RicochetEffect() { + super(Outcome.Detriment); + staticText = "each player rolls a six-sided die. Change the target of that spell to the player with the lowest result. Reroll to break ties, if necessary"; + } + + public RicochetEffect(final RicochetEffect effect) { + super(effect); + } + + @Override + public RicochetEffect copy() { + return new RicochetEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Spell spell = game.getStack().getSpell(this.getTargetPointer().getFirst(game, source)); + if (spell != null) { + Targets targets = new Targets(); + Ability sourceAbility = spell.getSpellAbility(); + for (UUID modeId : sourceAbility.getModes().getSelectedModes()) { + Mode mode = sourceAbility.getModes().get(modeId); + targets.addAll(mode.getTargets()); + } + if (targets.size() != 1 || targets.get(0).getTargets().size() != 1) { + return false; + } + + Map playerRolls = new HashMap<>(); + for (UUID playerId : game.getPlayerList().copy()) { + Player player = game.getPlayer(playerId); + if (player != null) { + playerRolls.put(player, 7); + } + } + do { + for (Player player : playerRolls.keySet()) { + playerRolls.put(player, player.rollDice(game, 6)); + } + int minValueInMap = Collections.min(playerRolls.values()); + for (Map.Entry mapEntry : new HashSet<>(playerRolls.entrySet())) { + if (mapEntry.getValue() > minValueInMap) { + playerRolls.remove(mapEntry.getKey()); + } + } + } while (playerRolls.size() > 1); + + if (playerRolls.size() == 1) { + Player loser = (Player) playerRolls.keySet().toArray()[0]; + UUID loserId = loser.getId(); + Target target = targets.get(0); + if (target.getFirstTarget().equals(loserId)) { + return true; + } + String oldTargetName = null; + if (target.canTarget(spell.getControllerId(), loserId, sourceAbility, game)) { + Player oldPlayer = game.getPlayer(targets.getFirstTarget()); + if (oldPlayer != null) { + oldTargetName = oldPlayer.getLogName(); + } + target.clearChosen(); + target.addTarget(loserId, sourceAbility, game); + } + MageObject sourceObject = game.getObject(source.getSourceId()); + if (oldTargetName != null && sourceObject != null) { + game.informPlayers(sourceObject.getLogName() + ": Changed target of " + spell.getLogName() + " from " + oldTargetName + " to " + loser.getLogName()); + } + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/r/RidersOfGavony.java b/Mage.Sets/src/mage/cards/r/RidersOfGavony.java index da80ddce32d..0fc541dfe5f 100644 --- a/Mage.Sets/src/mage/cards/r/RidersOfGavony.java +++ b/Mage.Sets/src/mage/cards/r/RidersOfGavony.java @@ -81,7 +81,7 @@ class RidersOfGavonyGainAbilityControlledEffect extends ContinuousEffectImpl { if (protectionFilter == null) { Permanent permanent = game.getPermanent(source.getSourceId()); if (permanent != null) { - SubType subType = ChooseCreatureTypeEffect.getChoosenCreatureType(permanent.getId(), game); + SubType subType = ChooseCreatureTypeEffect.getChosenCreatureType(permanent.getId(), game); if (subType != null) { protectionFilter = new FilterPermanent(subType.getDescription() + 's'); protectionFilter.add(new SubtypePredicate(subType)); diff --git a/Mage.Sets/src/mage/cards/r/RiptideReplicator.java b/Mage.Sets/src/mage/cards/r/RiptideReplicator.java index 3540b2d40af..2d4c1e5c7ea 100644 --- a/Mage.Sets/src/mage/cards/r/RiptideReplicator.java +++ b/Mage.Sets/src/mage/cards/r/RiptideReplicator.java @@ -23,7 +23,6 @@ import mage.constants.Zone; import mage.counters.CounterType; import mage.game.Game; import mage.game.permanent.token.RiptideReplicatorToken; -import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; /** @@ -80,7 +79,7 @@ class RiptideReplicatorEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { ObjectColor color = (ObjectColor) game.getState().getValue(source.getSourceId() + "_color"); - SubType subType = ChooseCreatureTypeEffect.getChoosenCreatureType(source.getSourceId(), game); + SubType subType = ChooseCreatureTypeEffect.getChosenCreatureType(source.getSourceId(), game); if (subType == null) { return false; } diff --git a/Mage.Sets/src/mage/cards/r/RiversFavor.java b/Mage.Sets/src/mage/cards/r/RiversFavor.java new file mode 100644 index 00000000000..523500e1ed2 --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RiversFavor.java @@ -0,0 +1,47 @@ +package mage.cards.r; + +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.continuous.BoostEnchantedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * @author JayDi85 + */ +public final class RiversFavor extends CardImpl { + + public RiversFavor(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{U}"); + this.subtype.add(SubType.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/+1. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(1, 1))); + } + + public RiversFavor(final RiversFavor card) { + super(card); + } + + @Override + public RiversFavor copy() { + return new RiversFavor(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/r/RofellossGift.java b/Mage.Sets/src/mage/cards/r/RofellossGift.java new file mode 100644 index 00000000000..0b89988c673 --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RofellossGift.java @@ -0,0 +1,101 @@ +package mage.cards.r; + +import mage.ObjectColor; +import mage.abilities.Ability; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.cards.*; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.game.Game; +import mage.players.Player; +import mage.target.common.TargetCardInHand; +import mage.target.common.TargetCardInYourGraveyard; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class RofellossGift extends CardImpl { + + public RofellossGift(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{G}"); + + // Reveal any number of green cards in your hand. Return an enchantment card from your graveyard to your hand for each card revealed this way. + this.getSpellAbility().addEffect(new RofellossGiftEffect()); + } + + public RofellossGift(final RofellossGift card) { + super(card); + } + + @Override + public RofellossGift copy() { + return new RofellossGift(this); + } +} + +class RofellossGiftEffect extends OneShotEffect { + + public static final FilterCard filter1 = new FilterCard("green cards in your hand"); + public static final FilterCard filter2 = new FilterCard("enchantment cards in your graveyard"); + + static { + filter1.add(new ColorPredicate(ObjectColor.GREEN)); + filter2.add(new CardTypePredicate(CardType.ENCHANTMENT)); + } + + public RofellossGiftEffect() { + super(Outcome.Benefit); + staticText = "Reveal any number of green cards in your hand. " + + "Return an enchantment card from your graveyard to your hand for each card revealed this way."; + } + + public RofellossGiftEffect(final RofellossGiftEffect effect) { + super(effect); + } + + @Override + public RofellossGiftEffect copy() { + return new RofellossGiftEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player == null) { + return false; + } + TargetCardInHand targetCardInHand = new TargetCardInHand(0, Integer.MAX_VALUE, filter1); + if (!player.choose(outcome, player.getHand(), targetCardInHand, game)) { + return false; + } + Cards cards = new CardsImpl(); + for (UUID cardId : targetCardInHand.getTargets()) { + Card card = game.getCard(cardId); + if (card != null) { + cards.add(card); + } + } + player.revealCards(source, cards, game); + int enchantmentsToReturn = Math.min(player.getGraveyard().count(filter2, game), targetCardInHand.getTargets().size()); + TargetCardInYourGraveyard targetCardInYourGraveyard = new TargetCardInYourGraveyard(enchantmentsToReturn, filter2); + targetCardInYourGraveyard.setNotTarget(true); + if (!player.choose(outcome, targetCardInYourGraveyard, source.getSourceId(), game)) { + return false; + } + cards = new CardsImpl(); + for (UUID cardId : targetCardInYourGraveyard.getTargets()) { + Card card = game.getCard(cardId); + if (card != null) { + cards.add(card); + } + } + return player.moveCards(cards, Zone.HAND, source, game); + } +} diff --git a/Mage.Sets/src/mage/cards/r/RootsOfLife.java b/Mage.Sets/src/mage/cards/r/RootsOfLife.java new file mode 100644 index 00000000000..419f1d62352 --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RootsOfLife.java @@ -0,0 +1,67 @@ +package mage.cards.r; + +import java.util.UUID; +import mage.abilities.common.BecomesTappedTriggeredAbility; +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.condition.common.ModeChoiceSourceCondition; +import mage.abilities.decorator.ConditionalTriggeredAbility; +import mage.abilities.effects.common.ChooseModeEffect; +import mage.abilities.effects.common.GainLifeEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.TargetController; +import mage.filter.FilterPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.filter.predicate.permanent.ControllerPredicate; + +/** + * + * @author fubs + */ +public final class RootsOfLife extends CardImpl { + + private final static String ruleTrigger1 = "&bull Island — Whenever an Island an opponent controls becomes tapped, you gain 1 life"; + private final static String ruleTrigger2 = "&bull Swamp — Whenever a Swamp an opponent controls becomes tapped, you gain 1 life"; + + private static final FilterPermanent islandFilter = new FilterPermanent("an Island an opponent controls"); + private static final FilterPermanent swampFilter = new FilterPermanent("a Swamp an opponent controls"); + + static { + islandFilter.add(new SubtypePredicate(SubType.ISLAND)); + islandFilter.add(new ControllerPredicate(TargetController.OPPONENT)); + swampFilter.add(new SubtypePredicate(SubType.SWAMP)); + swampFilter.add(new ControllerPredicate(TargetController.OPPONENT)); + } + + public RootsOfLife(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{G}{G}"); + + // As Roots of Life enters the battlefield, choose Island or Swamp. + this.addAbility(new EntersBattlefieldAbility(new ChooseModeEffect("Island or Swamp?", "Island", "Swamp"), null, + "As {this} enters the battlefield, choose Island or Swamp.", "")); + + // Whenever a land of the chosen type an opponent controls becomes tapped, you gain 1 life. + // * Island chosen + this.addAbility(new ConditionalTriggeredAbility( + new BecomesTappedTriggeredAbility(new GainLifeEffect(1), false, islandFilter), + new ModeChoiceSourceCondition("Island"), + ruleTrigger1)); + + // * Swamp chosen + this.addAbility(new ConditionalTriggeredAbility( + new BecomesTappedTriggeredAbility(new GainLifeEffect(1), false, swampFilter), + new ModeChoiceSourceCondition("Swamp"), + ruleTrigger2)); + } + + public RootsOfLife(final RootsOfLife card) { + super(card); + } + + @Override + public RootsOfLife copy() { + return new RootsOfLife(this); + } +} diff --git a/Mage.Sets/src/mage/cards/r/RowanKenrith.java b/Mage.Sets/src/mage/cards/r/RowanKenrith.java index a3a6678dfd4..a5ef32577d5 100644 --- a/Mage.Sets/src/mage/cards/r/RowanKenrith.java +++ b/Mage.Sets/src/mage/cards/r/RowanKenrith.java @@ -6,7 +6,7 @@ import mage.MageObjectReference; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; import mage.abilities.common.CanBeYourCommanderAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.RequirementEffect; @@ -40,7 +40,7 @@ public final class RowanKenrith extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.ROWAN); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(4)); // +2: During target player's next turn, each creature that player controls attacks if able. LoyaltyAbility ability = new LoyaltyAbility(new RowanKenrithAttackEffect(), 2); diff --git a/Mage.Sets/src/mage/cards/r/RumblingCrescendo.java b/Mage.Sets/src/mage/cards/r/RumblingCrescendo.java index 452c455ef98..931f9b65385 100644 --- a/Mage.Sets/src/mage/cards/r/RumblingCrescendo.java +++ b/Mage.Sets/src/mage/cards/r/RumblingCrescendo.java @@ -1,4 +1,3 @@ - package mage.cards.r; import java.util.UUID; @@ -13,13 +12,13 @@ import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.TargetAdjustment; import mage.constants.TargetController; import mage.constants.Zone; import mage.counters.CounterType; import mage.filter.FilterPermanent; import mage.filter.predicate.mageobject.CardTypePredicate; import mage.target.TargetPermanent; +import mage.target.targetadjustment.VerseCounterAdjuster; /** * @@ -46,7 +45,7 @@ public final class RumblingCrescendo extends CardImpl { Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("{R}")); ability.addCost(new SacrificeSourceCost()); ability.addTarget(new TargetPermanent(0, 0, filter, false)); - ability.setTargetAdjustment(TargetAdjustment.VERSE_COUNTER_TARGETS); + ability.setTargetAdjuster(VerseCounterAdjuster.instance); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/r/RunawaySteamKin.java b/Mage.Sets/src/mage/cards/r/RunawaySteamKin.java index 900834f3f62..aa58060ec1d 100644 --- a/Mage.Sets/src/mage/cards/r/RunawaySteamKin.java +++ b/Mage.Sets/src/mage/cards/r/RunawaySteamKin.java @@ -43,7 +43,7 @@ public final class RunawaySteamKin extends CardImpl { new SpellCastControllerTriggeredAbility( new AddCountersSourceEffect( CounterType.P1P1.createInstance() - ), false + ), filter, false ), new SourceHasCounterCondition(CounterType.P1P1, 0, 2), "Whenever you cast a red spell, " + "if {this} has fewer than three +1/+1 counters on it, " @@ -52,8 +52,7 @@ public final class RunawaySteamKin extends CardImpl { // Remove three +1/+1 counters from Runaway Steam-Kin: Add {R}{R}{R}. this.addAbility(new SimpleManaAbility( - Zone.BATTLEFIELD, - Mana.RedMana(3), + Zone.BATTLEFIELD, Mana.RedMana(3), new RemoveCountersSourceCost(CounterType.P1P1.createInstance(3)) )); } diff --git a/Mage.Sets/src/mage/cards/r/RunedArch.java b/Mage.Sets/src/mage/cards/r/RunedArch.java index ea9d5642021..0195c1977c3 100644 --- a/Mage.Sets/src/mage/cards/r/RunedArch.java +++ b/Mage.Sets/src/mage/cards/r/RunedArch.java @@ -1,4 +1,3 @@ - package mage.cards.r; import java.util.UUID; @@ -14,11 +13,11 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.ComparisonType; import mage.constants.Duration; -import mage.constants.TargetAdjustment; import mage.filter.FilterPermanent; import mage.filter.predicate.mageobject.CardTypePredicate; import mage.filter.predicate.mageobject.PowerPredicate; import mage.target.TargetPermanent; +import mage.target.targetadjustment.XTargetsAdjuster; /** * @@ -48,7 +47,7 @@ public final class RunedArch extends CardImpl { ability.addCost(new TapSourceCost()); ability.addCost(new SacrificeSourceCost()); ability.addTarget(new TargetPermanent(filter)); - ability.setTargetAdjustment(TargetAdjustment.X_TARGETS); + ability.setTargetAdjuster(XTargetsAdjuster.instance); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/s/SageOfAncientLore.java b/Mage.Sets/src/mage/cards/s/SageOfAncientLore.java index e2d5f375dd0..dcecae03c61 100644 --- a/Mage.Sets/src/mage/cards/s/SageOfAncientLore.java +++ b/Mage.Sets/src/mage/cards/s/SageOfAncientLore.java @@ -2,6 +2,7 @@ package mage.cards.s; import java.util.UUID; + import mage.MageInt; import mage.abilities.TriggeredAbility; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; @@ -19,7 +20,6 @@ import mage.abilities.effects.common.continuous.SetPowerToughnessSourceEffect; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.w.WerewolfOfAncientHunger; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Duration; @@ -27,13 +27,12 @@ import mage.constants.TargetController; import mage.constants.Zone; /** - * * @author fireshoes */ public final class SageOfAncientLore extends CardImpl { public SageOfAncientLore(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{G}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.SHAMAN); this.subtype.add(SubType.WEREWOLF); @@ -41,13 +40,13 @@ public final class SageOfAncientLore extends CardImpl { this.toughness = new MageInt(0); this.transformable = true; - this.secondSideCardClazz = WerewolfOfAncientHunger.class; + this.secondSideCardClazz = mage.cards.w.WerewolfOfAncientHunger.class; // Sage of Ancient Lore's power and toughness are each equal to the number of cards in your hand. - DynamicValue xValue= new CardsInControllerHandCount(); - this.addAbility(new SimpleStaticAbility(Zone.ALL, + DynamicValue xValue = new CardsInControllerHandCount(); + this.addAbility(new SimpleStaticAbility(Zone.ALL, new ConditionalContinuousEffect(new SetPowerToughnessSourceEffect(xValue, Duration.EndOfGame), - new TransformedCondition(true), "{this}'s power and toughness are each equal to the total number of cards in your hand"))); + new TransformedCondition(true), "{this}'s power and toughness are each equal to the total number of cards in your hand"))); // When Sage of Ancient Lore enters the battlefield, draw a card. this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1), false)); diff --git a/Mage.Sets/src/mage/cards/s/SaheeliRai.java b/Mage.Sets/src/mage/cards/s/SaheeliRai.java index fba7d007927..29dba317881 100644 --- a/Mage.Sets/src/mage/cards/s/SaheeliRai.java +++ b/Mage.Sets/src/mage/cards/s/SaheeliRai.java @@ -5,7 +5,7 @@ import java.util.UUID; import mage.abilities.Ability; import mage.abilities.DelayedTriggeredAbility; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; @@ -42,7 +42,7 @@ public final class SaheeliRai extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.SAHEELI); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3)); // +1: Scry 1. Saheeli Rai deals 1 damage to each opponent. Effect effect = new ScryEffect(1); diff --git a/Mage.Sets/src/mage/cards/s/SaheeliTheGifted.java b/Mage.Sets/src/mage/cards/s/SaheeliTheGifted.java index 4e31f691b7f..4d577674f82 100644 --- a/Mage.Sets/src/mage/cards/s/SaheeliTheGifted.java +++ b/Mage.Sets/src/mage/cards/s/SaheeliTheGifted.java @@ -5,7 +5,7 @@ import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; import mage.abilities.SpellAbility; import mage.abilities.common.CanBeYourCommanderAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateTokenCopyTargetEffect; import mage.abilities.effects.common.CreateTokenEffect; @@ -37,7 +37,7 @@ public final class SaheeliTheGifted extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.SAHEELI); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(4)); // +1: Create a 1/1 colorless Servo artifact creature token. this.addAbility(new LoyaltyAbility( diff --git a/Mage.Sets/src/mage/cards/s/SamutTheTested.java b/Mage.Sets/src/mage/cards/s/SamutTheTested.java index 485f3f046a5..45553819861 100644 --- a/Mage.Sets/src/mage/cards/s/SamutTheTested.java +++ b/Mage.Sets/src/mage/cards/s/SamutTheTested.java @@ -3,7 +3,7 @@ package mage.cards.s; import java.util.UUID; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.common.DamageMultiEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; @@ -32,7 +32,7 @@ public final class SamutTheTested extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.SAMUT); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(4)); // +1: Up to one target creature gains double strike until end of turn. Effect effect = new GainAbilityTargetEffect(DoubleStrikeAbility.getInstance(), Duration.EndOfTurn); diff --git a/Mage.Sets/src/mage/cards/s/SarkhanDragonsoul.java b/Mage.Sets/src/mage/cards/s/SarkhanDragonsoul.java index 565bbd7c7e2..f75ea89ad53 100644 --- a/Mage.Sets/src/mage/cards/s/SarkhanDragonsoul.java +++ b/Mage.Sets/src/mage/cards/s/SarkhanDragonsoul.java @@ -3,7 +3,7 @@ package mage.cards.s; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.common.DamageAllEffect; import mage.abilities.effects.common.DamagePlayersEffect; import mage.abilities.effects.common.DamageTargetEffect; @@ -37,7 +37,7 @@ public final class SarkhanDragonsoul extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.SARKHAN); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(5)); // +2: Sarkhan, Dragonsoul deals 1 damage to each opponent and each creature your opponents control. Ability ability = new LoyaltyAbility(new DamagePlayersEffect(1, TargetController.OPPONENT), 2); diff --git a/Mage.Sets/src/mage/cards/s/SarkhanFireblood.java b/Mage.Sets/src/mage/cards/s/SarkhanFireblood.java index f997638c233..c7dfe6717e4 100644 --- a/Mage.Sets/src/mage/cards/s/SarkhanFireblood.java +++ b/Mage.Sets/src/mage/cards/s/SarkhanFireblood.java @@ -2,7 +2,7 @@ package mage.cards.s; import java.util.UUID; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.costs.common.DiscardCardCost; import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.common.CreateTokenEffect; @@ -36,7 +36,7 @@ public final class SarkhanFireblood extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.SARKHAN); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3)); // +1: You may discard a card. If you do, draw a card. this.addAbility(new LoyaltyAbility(new DoIfCostPaid( diff --git a/Mage.Sets/src/mage/cards/s/SarkhanTheDragonspeaker.java b/Mage.Sets/src/mage/cards/s/SarkhanTheDragonspeaker.java index 76a04b4c8c2..49b3957b0a2 100644 --- a/Mage.Sets/src/mage/cards/s/SarkhanTheDragonspeaker.java +++ b/Mage.Sets/src/mage/cards/s/SarkhanTheDragonspeaker.java @@ -6,7 +6,7 @@ import mage.MageObjectReference; import mage.ObjectColor; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.effects.Effect; import mage.abilities.effects.common.DamageTargetEffect; @@ -34,7 +34,7 @@ public final class SarkhanTheDragonspeaker extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.SARKHAN); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(4)); // +1: Until end of turn, Sarkhan, the Dragonspeaker becomes a legendary 4/4 red Dragon creature with flying, indestructible, and haste. this.addAbility(new LoyaltyAbility(new SarkhanTheDragonspeakerEffect(), 1)); diff --git a/Mage.Sets/src/mage/cards/s/SarkhanTheMad.java b/Mage.Sets/src/mage/cards/s/SarkhanTheMad.java index 251e057fb3b..921f4fd270b 100644 --- a/Mage.Sets/src/mage/cards/s/SarkhanTheMad.java +++ b/Mage.Sets/src/mage/cards/s/SarkhanTheMad.java @@ -6,7 +6,7 @@ import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.OneShotEffect; import mage.cards.Card; import mage.cards.CardImpl; @@ -39,7 +39,7 @@ public final class SarkhanTheMad extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{3}{B}{R}"); this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.SARKHAN); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(7)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(7)); this.addAbility(new LoyaltyAbility(new SarkhanTheMadRevealAndDrawEffect(), 0)); diff --git a/Mage.Sets/src/mage/cards/s/SarkhanUnbroken.java b/Mage.Sets/src/mage/cards/s/SarkhanUnbroken.java index c0c2fae9005..af9e7fd473e 100644 --- a/Mage.Sets/src/mage/cards/s/SarkhanUnbroken.java +++ b/Mage.Sets/src/mage/cards/s/SarkhanUnbroken.java @@ -7,7 +7,7 @@ import java.util.UUID; import mage.Mana; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect; @@ -43,7 +43,7 @@ public final class SarkhanUnbroken extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.SARKHAN); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(4)); // +1: Draw a card, then add one mana of any color. this.addAbility(new LoyaltyAbility(new SarkhanUnbrokenAbility1(), 1)); diff --git a/Mage.Sets/src/mage/cards/s/SarkhanVol.java b/Mage.Sets/src/mage/cards/s/SarkhanVol.java index a48f190b613..92322a16161 100644 --- a/Mage.Sets/src/mage/cards/s/SarkhanVol.java +++ b/Mage.Sets/src/mage/cards/s/SarkhanVol.java @@ -3,7 +3,7 @@ package mage.cards.s; import java.util.UUID; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.Effects; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.UntapTargetEffect; @@ -35,7 +35,7 @@ public final class SarkhanVol extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.SARKHAN); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(4)); // +1: Creatures you control get +1/+1 and gain haste until end of turn. Effects effects1 = new Effects(); diff --git a/Mage.Sets/src/mage/cards/s/ScornedVillager.java b/Mage.Sets/src/mage/cards/s/ScornedVillager.java index 87ba993c597..a6a5f9529c6 100644 --- a/Mage.Sets/src/mage/cards/s/ScornedVillager.java +++ b/Mage.Sets/src/mage/cards/s/ScornedVillager.java @@ -2,6 +2,7 @@ package mage.cards.s; import java.util.UUID; + import mage.MageInt; import mage.abilities.TriggeredAbility; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; @@ -12,19 +13,17 @@ import mage.abilities.keyword.TransformAbility; import mage.abilities.mana.GreenManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.m.MoonscarredWerewolf; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.TargetController; /** - * * @author North */ public final class ScornedVillager extends CardImpl { public ScornedVillager(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.WEREWOLF); @@ -32,7 +31,7 @@ public final class ScornedVillager extends CardImpl { this.toughness = new MageInt(1); this.transformable = true; - this.secondSideCardClazz = MoonscarredWerewolf.class; + this.secondSideCardClazz = mage.cards.m.MoonscarredWerewolf.class; // {tap}: Add {G}. this.addAbility(new GreenManaAbility()); diff --git a/Mage.Sets/src/mage/cards/s/ScribNibblers.java b/Mage.Sets/src/mage/cards/s/ScribNibblers.java index 8f02f105d34..93806d4abd1 100644 --- a/Mage.Sets/src/mage/cards/s/ScribNibblers.java +++ b/Mage.Sets/src/mage/cards/s/ScribNibblers.java @@ -75,7 +75,7 @@ class ScribNibblersEffect extends OneShotEffect { if (targetPlayer != null && targetPlayer.getLibrary().hasCards()) { Card card = targetPlayer.getLibrary().getFromTop(game); card.moveToExile(id, "Scrib Nibblers Exile", source.getSourceId(), game); - if (card != null && card.isLand()) { + if (card.isLand()) { you.gainLife(1, game, source); return true; } diff --git a/Mage.Sets/src/mage/cards/s/SealAway.java b/Mage.Sets/src/mage/cards/s/SealAway.java index 0907d957830..ebf5fdcdb83 100644 --- a/Mage.Sets/src/mage/cards/s/SealAway.java +++ b/Mage.Sets/src/mage/cards/s/SealAway.java @@ -11,7 +11,6 @@ import mage.abilities.effects.common.ExileUntilSourceLeavesEffect; import mage.abilities.keyword.FlashAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.c.CastOut; import mage.constants.CardType; import mage.constants.TargetController; import mage.filter.common.FilterCreaturePermanent; @@ -21,7 +20,7 @@ import mage.target.TargetPermanent; /** * @author JRHerlehy - * Created on 4/4/18. + * Created on 4/4/18. */ public final class SealAway extends CardImpl { diff --git a/Mage.Sets/src/mage/cards/s/SearchForAzcanta.java b/Mage.Sets/src/mage/cards/s/SearchForAzcanta.java index 616efed3148..477cbbbd2ef 100644 --- a/Mage.Sets/src/mage/cards/s/SearchForAzcanta.java +++ b/Mage.Sets/src/mage/cards/s/SearchForAzcanta.java @@ -2,6 +2,7 @@ package mage.cards.s; import java.util.UUID; + import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; @@ -12,7 +13,6 @@ import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.cards.CardsImpl; -import mage.cards.a.AzcantaTheSunkenRuin; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SuperType; @@ -22,7 +22,6 @@ import mage.game.Game; import mage.players.Player; /** - * * @author LevelX2 */ public final class SearchForAzcanta extends CardImpl { @@ -31,7 +30,7 @@ public final class SearchForAzcanta extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{U}"); this.transformable = true; - this.secondSideCardClazz = AzcantaTheSunkenRuin.class; + this.secondSideCardClazz = mage.cards.a.AzcantaTheSunkenRuin.class; this.addSuperType(SuperType.LEGENDARY); @@ -89,4 +88,4 @@ class SearchForAzcantaLookLibraryEffect extends OneShotEffect { } return false; } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/s/SelectiveSnare.java b/Mage.Sets/src/mage/cards/s/SelectiveSnare.java new file mode 100644 index 00000000000..61f62f5d605 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SelectiveSnare.java @@ -0,0 +1,70 @@ +package mage.cards.s; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.common.ReturnToHandTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.choices.Choice; +import mage.choices.ChoiceCreatureType; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.game.Game; +import mage.players.Player; +import mage.target.TargetPermanent; +import mage.target.targetadjustment.TargetAdjuster; + +/** + * + * @author TheElk801 + */ +public final class SelectiveSnare extends CardImpl { + + public SelectiveSnare(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{U}"); + + // Return X target creatures of the creature type of your choice to their owner's hand. + this.getSpellAbility().addEffect( + new ReturnToHandTargetEffect(true) + .setText("Return X target creatures of " + + "the creature type of your choice " + + "to their owner's hand") + ); + this.getSpellAbility().setTargetAdjuster(SelectiveSnareAdjuster.instance); + } + + public SelectiveSnare(final SelectiveSnare card) { + super(card); + } + + @Override + public SelectiveSnare copy() { + return new SelectiveSnare(this); + } +} + +enum SelectiveSnareAdjuster implements TargetAdjuster { + instance; + + @Override + public void adjustTargets(Ability ability, Game game) { + Player player = game.getPlayer(ability.getControllerId()); + if (player == null) { + return; + } + Choice choice = new ChoiceCreatureType(); + if (!player.choose(Outcome.Benefit, choice, game)) { + return; + } + SubType subType = SubType.byDescription(choice.getChoice()); + int xValue = ability.getManaCostsToPay().getX(); + FilterPermanent filter = new FilterCreaturePermanent(subType.toString() + " creatures"); + filter.add(new SubtypePredicate(subType)); + ability.getTargets().clear(); + ability.addTarget(new TargetPermanent(xValue, filter)); + } +} diff --git a/Mage.Sets/src/mage/cards/s/SelesnyaLocket.java b/Mage.Sets/src/mage/cards/s/SelesnyaLocket.java index 090cbf386e7..5180d87ed16 100644 --- a/Mage.Sets/src/mage/cards/s/SelesnyaLocket.java +++ b/Mage.Sets/src/mage/cards/s/SelesnyaLocket.java @@ -8,7 +8,7 @@ import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.mana.GreenManaAbility; -import mage.abilities.mana.RedManaAbility; +import mage.abilities.mana.WhiteManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -24,7 +24,7 @@ public final class SelesnyaLocket extends CardImpl { // {T}: Add {G} or {W}. this.addAbility(new GreenManaAbility()); - this.addAbility(new RedManaAbility()); + this.addAbility(new WhiteManaAbility()); // {G/W}{G/W}{G/W}{G/W}, {T}, Sacrifice Selesnya Locket: Draw two cards. Ability ability = new SimpleActivatedAbility( diff --git a/Mage.Sets/src/mage/cards/s/SerrasLiturgy.java b/Mage.Sets/src/mage/cards/s/SerrasLiturgy.java index 5a97f18c1b3..201092a0c14 100644 --- a/Mage.Sets/src/mage/cards/s/SerrasLiturgy.java +++ b/Mage.Sets/src/mage/cards/s/SerrasLiturgy.java @@ -1,4 +1,3 @@ - package mage.cards.s; import java.util.UUID; @@ -13,7 +12,6 @@ import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.TargetAdjustment; import mage.constants.TargetController; import mage.constants.Zone; import mage.counters.CounterType; @@ -21,6 +19,7 @@ import mage.filter.FilterPermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.CardTypePredicate; import mage.target.TargetPermanent; +import mage.target.targetadjustment.VerseCounterAdjuster; /** * @@ -50,7 +49,7 @@ public final class SerrasLiturgy extends CardImpl { Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("{W}")); ability.addCost(new SacrificeSourceCost()); ability.addTarget(new TargetPermanent(0, 0, filter, false)); - ability.setTargetAdjustment(TargetAdjustment.VERSE_COUNTER_TARGETS); + ability.setTargetAdjuster(VerseCounterAdjuster.instance); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/s/SeveredStrands.java b/Mage.Sets/src/mage/cards/s/SeveredStrands.java new file mode 100644 index 00000000000..a0e7278361b --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SeveredStrands.java @@ -0,0 +1,45 @@ +package mage.cards.s; + +import java.util.UUID; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.dynamicvalue.common.SacrificeCostCreaturesToughness; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.effects.common.GainLifeEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.target.common.TargetControlledCreaturePermanent; +import mage.target.common.TargetOpponentsCreaturePermanent; + +/** + * + * @author TheElk801 + */ +public final class SeveredStrands extends CardImpl { + + public SeveredStrands(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{B}"); + + // As an additional cost to cast this spell, sacrifice a creature. + this.getSpellAbility().addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(1, 1, new FilterControlledCreaturePermanent("a creature"), true))); + + // You gain life equal to the sacrificed creature's toughness. Destroy target creature an opponent controls. + this.getSpellAbility().addEffect(new GainLifeEffect( + new SacrificeCostCreaturesToughness(), + "You gain life equal to the " + + "sacrificed creature's toughness." + )); + this.getSpellAbility().addEffect(new DestroyTargetEffect()); + this.getSpellAbility().addTarget(new TargetOpponentsCreaturePermanent()); + } + + public SeveredStrands(final SeveredStrands card) { + super(card); + } + + @Override + public SeveredStrands copy() { + return new SeveredStrands(this); + } +} diff --git a/Mage.Sets/src/mage/cards/s/ShorecomberCrab.java b/Mage.Sets/src/mage/cards/s/ShorecomberCrab.java new file mode 100644 index 00000000000..03dee68e491 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/ShorecomberCrab.java @@ -0,0 +1,32 @@ +package mage.cards.s; + +import mage.MageInt; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; + +import java.util.UUID; + +/** + * @author JayDi85 + */ +public final class ShorecomberCrab extends CardImpl { + + public ShorecomberCrab(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{U}"); + this.subtype.add(SubType.CRAB); + + this.power = new MageInt(0); + this.toughness = new MageInt(4); + } + + public ShorecomberCrab(final ShorecomberCrab card) { + super(card); + } + + @Override + public ShorecomberCrab copy() { + return new ShorecomberCrab(this); + } +} diff --git a/Mage.Sets/src/mage/cards/s/ShrillHowler.java b/Mage.Sets/src/mage/cards/s/ShrillHowler.java index e59f210d2f1..f564e981d4f 100644 --- a/Mage.Sets/src/mage/cards/s/ShrillHowler.java +++ b/Mage.Sets/src/mage/cards/s/ShrillHowler.java @@ -2,6 +2,7 @@ package mage.cards.s; import java.util.UUID; + import mage.MageInt; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleStaticAbility; @@ -11,26 +12,24 @@ import mage.abilities.effects.common.combat.CantBeBlockedByCreaturesWithLessPowe import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.h.HowlingChorus; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Zone; /** - * * @author LevelX2 */ public final class ShrillHowler extends CardImpl { public ShrillHowler(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}"); this.subtype.add(SubType.WEREWOLF); this.subtype.add(SubType.HORROR); this.power = new MageInt(3); this.toughness = new MageInt(1); this.transformable = true; - this.secondSideCardClazz = HowlingChorus.class; + this.secondSideCardClazz = mage.cards.h.HowlingChorus.class; // Creatures with power less than Shrill Howler's power can't block it. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBeBlockedByCreaturesWithLessPowerEffect())); @@ -49,4 +48,4 @@ public final class ShrillHowler extends CardImpl { public ShrillHowler copy() { return new ShrillHowler(this); } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/s/ShrineKeeper.java b/Mage.Sets/src/mage/cards/s/ShrineKeeper.java new file mode 100644 index 00000000000..67682826d72 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/ShrineKeeper.java @@ -0,0 +1,32 @@ +package mage.cards.s; + +import mage.MageInt; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; + +import java.util.UUID; + +/** + * @author JayDi85 + */ +public final class ShrineKeeper extends CardImpl { + + public ShrineKeeper(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}"); + this.subtype.add(SubType.HUMAN, SubType.CLERIC); + + this.power = new MageInt(2); + this.toughness = new MageInt(2); + } + + public ShrineKeeper(final ShrineKeeper card) { + super(card); + } + + @Override + public ShrineKeeper copy() { + return new ShrineKeeper(this); + } +} diff --git a/Mage.Sets/src/mage/cards/s/SimicManipulator.java b/Mage.Sets/src/mage/cards/s/SimicManipulator.java index f4c12960b6d..5e74a62d857 100644 --- a/Mage.Sets/src/mage/cards/s/SimicManipulator.java +++ b/Mage.Sets/src/mage/cards/s/SimicManipulator.java @@ -1,4 +1,3 @@ - package mage.cards.s; import java.util.UUID; @@ -7,6 +6,7 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.Cost; import mage.abilities.costs.common.RemoveVariableCountersSourceCost; +import mage.abilities.costs.common.RemoveVariableCountersTargetCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.effects.common.continuous.GainControlTargetEffect; import mage.abilities.keyword.EvolveAbility; @@ -21,7 +21,9 @@ import mage.counters.CounterType; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.PowerPredicate; import mage.game.Game; +import mage.game.permanent.Permanent; import mage.target.common.TargetCreaturePermanent; +import mage.target.targetadjustment.TargetAdjuster; /** * Gatecrash FAQ (01.2013) @@ -37,7 +39,6 @@ import mage.target.common.TargetCreaturePermanent; */ public final class SimicManipulator extends CardImpl { - private final UUID originalId; private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("with power less than or equal to the number of +1/+1 counters removed this way"); public SimicManipulator(UUID ownerId, CardSetInfo setInfo) { @@ -55,36 +56,38 @@ public final class SimicManipulator extends CardImpl { Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainControlTargetEffect(Duration.Custom, true), new TapSourceCost()); ability.addTarget(new TargetCreaturePermanent(filter)); ability.addCost(new RemoveVariableCountersSourceCost(CounterType.P1P1.createInstance(), 1, "Remove one or more +1/+1 counters from {this}")); + ability.setTargetAdjuster(SimicManipulatorAdjuster.instance); this.addAbility(ability); - this.originalId = ability.getOriginalId(); - } public SimicManipulator(final SimicManipulator card) { super(card); - this.originalId = card.originalId; } @Override public SimicManipulator copy() { return new SimicManipulator(this); } +} + +enum SimicManipulatorAdjuster implements TargetAdjuster { + instance; @Override public void adjustTargets(Ability ability, Game game) { - if (ability.getOriginalId().equals(originalId)) { - ability.getTargets().clear(); - int maxPower = 0; - FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with power less than or equal to the number of +1/+1 counters removed this way"); + Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(ability.getSourceId()); + if (sourcePermanent != null) { + int xValue = 0; for (Cost cost : ability.getCosts()) { - if (cost instanceof RemoveVariableCountersSourceCost) { - maxPower = ((RemoveVariableCountersSourceCost) cost).getAmount(); + if (cost instanceof RemoveVariableCountersTargetCost) { + xValue = ((RemoveVariableCountersTargetCost) cost).getAmount(); break; } } - filter.add(new PowerPredicate(ComparisonType.FEWER_THAN, maxPower + 1)); - TargetCreaturePermanent target = new TargetCreaturePermanent(1, 1, filter, false); - ability.addTarget(target); + ability.getTargets().clear(); + FilterCreaturePermanent newFilter = new FilterCreaturePermanent("creature with power " + xValue + " or less"); + newFilter.add(new PowerPredicate(ComparisonType.FEWER_THAN, xValue + 1)); + ability.addTarget(new TargetCreaturePermanent(newFilter)); } } } diff --git a/Mage.Sets/src/mage/cards/s/SixyBeast.java b/Mage.Sets/src/mage/cards/s/SixyBeast.java new file mode 100644 index 00000000000..662f032f639 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SixyBeast.java @@ -0,0 +1,95 @@ + +package mage.cards.s; + +import java.util.Set; +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.AsEntersBattlefieldAbility; +import mage.abilities.effects.OneShotEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Outcome; +import mage.counters.CounterType; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.Target; +import mage.target.common.TargetOpponent; + +/** + * + * @author L_J + */ +public final class SixyBeast extends CardImpl { + + public SixyBeast(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}"); + this.subtype.add(SubType.BEAST); + this.power = new MageInt(0); + this.toughness = new MageInt(0); + + // As Six-y Beast enters the battlefield, you secretly put six or fewer +1/+1 counters on it, then an opponent guesses the number of counters. If that player guesses right, sacrifice Six-y Beast after it enters the battlefield. + this.addAbility(new AsEntersBattlefieldAbility(new SixyBeastEffect())); + + } + + public SixyBeast(final SixyBeast card) { + super(card); + } + + @Override + public SixyBeast copy() { + return new SixyBeast(this); + } +} + +class SixyBeastEffect extends OneShotEffect { + + public SixyBeastEffect() { + super(Outcome.BoostCreature); + this.staticText = "you secretly put six or fewer +1/+1 counters on it, then an opponent guesses the number of counters. If that player guesses right, sacrifice {this} after it enters the battlefield"; + } + + public SixyBeastEffect(final SixyBeastEffect effect) { + super(effect); + } + + @Override + public SixyBeastEffect copy() { + return new SixyBeastEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = game.getPermanentEntering(source.getSourceId()); + Player controller = game.getPlayer(source.getControllerId()); + if (permanent != null && controller != null) { + int counterAmount = controller.getAmount(0, 6, "Secretly put up to six counters on " + permanent.getName(), game); + permanent.addCounters(CounterType.P1P1.createInstance(counterAmount), source, game); + Player opponent = null; + Set opponents = game.getOpponents(source.getControllerId()); + if (!opponents.isEmpty()) { + if (opponents.size() > 1) { + Target targetOpponent = new TargetOpponent(true); + if (controller.chooseTarget(Outcome.Neutral, targetOpponent, source, game)) { + opponent = game.getPlayer(targetOpponent.getFirstTarget()); + } + } else { + opponent = game.getPlayer(opponents.iterator().next()); + } + } + if (opponent != null) { + int guessedAmount = opponent.getAmount(0, 6, "Guess the number of counters on " + permanent.getName(), game); + game.informPlayers(opponent.getLogName() + " guessed " + guessedAmount + " as the number of counters on " + permanent.getLogName()); + if (counterAmount == guessedAmount) { + permanent.sacrifice(source.getSourceId(), game); + } + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/s/SkylineScout.java b/Mage.Sets/src/mage/cards/s/SkylineScout.java new file mode 100644 index 00000000000..6cbb0a41ac2 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SkylineScout.java @@ -0,0 +1,47 @@ +package mage.cards.s; + +import java.util.UUID; +import mage.MageInt; +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.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; + +/** + * + * @author TheElk801 + */ +public final class SkylineScout extends CardImpl { + + public SkylineScout(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}"); + + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.SCOUT); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // Whenever Skyline Scout attacks, you may pay {1}{W}. If you do, it gains flying until end of turn. + this.addAbility(new AttacksTriggeredAbility(new DoIfCostPaid( + new GainAbilitySourceEffect( + FlyingAbility.getInstance(), + Duration.EndOfTurn + ), new ManaCostsImpl("{1}{W}") + ), false)); + } + + public SkylineScout(final SkylineScout card) { + super(card); + } + + @Override + public SkylineScout copy() { + return new SkylineScout(this); + } +} diff --git a/Mage.Sets/src/mage/cards/s/SmeltWardMinotaur.java b/Mage.Sets/src/mage/cards/s/SmeltWardMinotaur.java new file mode 100644 index 00000000000..d3cf7c4ca5f --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SmeltWardMinotaur.java @@ -0,0 +1,47 @@ +package mage.cards.s; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.effects.common.combat.CantBlockTargetEffect; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.filter.StaticFilters; +import mage.target.common.TargetOpponentsCreaturePermanent; + +/** + * + * @author TheElk801 + */ +public final class SmeltWardMinotaur extends CardImpl { + + public SmeltWardMinotaur(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}"); + + this.subtype.add(SubType.MINOTAUR); + this.subtype.add(SubType.WARRIOR); + this.power = new MageInt(2); + this.toughness = new MageInt(3); + + // Whenever you cast an instant or sorcery spell, target creature an opponent controls can't block this turn. + Ability ability = new SpellCastControllerTriggeredAbility( + new CantBlockTargetEffect(Duration.EndOfTurn), + StaticFilters.FILTER_SPELLS_INSTANT_OR_SORCERY, false + ); + ability.addTarget(new TargetOpponentsCreaturePermanent()); + this.addAbility(ability); + } + + public SmeltWardMinotaur(final SmeltWardMinotaur card) { + super(card); + } + + @Override + public SmeltWardMinotaur copy() { + return new SmeltWardMinotaur(this); + } +} diff --git a/Mage.Sets/src/mage/cards/s/SmolderingWerewolf.java b/Mage.Sets/src/mage/cards/s/SmolderingWerewolf.java index c9d56f6dd6f..1421ef684b6 100644 --- a/Mage.Sets/src/mage/cards/s/SmolderingWerewolf.java +++ b/Mage.Sets/src/mage/cards/s/SmolderingWerewolf.java @@ -2,6 +2,7 @@ package mage.cards.s; import java.util.UUID; + import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; @@ -13,27 +14,25 @@ import mage.abilities.effects.common.TransformSourceEffect; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.e.EruptingDreadwolf; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Zone; import mage.target.common.TargetCreaturePermanent; /** - * * @author fireshoes */ public final class SmolderingWerewolf extends CardImpl { public SmolderingWerewolf(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{R}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}{R}"); this.subtype.add(SubType.WEREWOLF); this.subtype.add(SubType.HORROR); this.power = new MageInt(3); this.toughness = new MageInt(2); this.transformable = true; - this.secondSideCardClazz = EruptingDreadwolf.class; + this.secondSideCardClazz = mage.cards.e.EruptingDreadwolf.class; // When Smoldering Werewolf enters the battlefield, it deals 1 damage to each of up to two target creatures. Effect effect = new DamageTargetEffect(1); @@ -55,4 +54,4 @@ public final class SmolderingWerewolf extends CardImpl { public SmolderingWerewolf copy() { return new SmolderingWerewolf(this); } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/s/SolitaryHunter.java b/Mage.Sets/src/mage/cards/s/SolitaryHunter.java index 917b5e1e716..fd65f0f58a0 100644 --- a/Mage.Sets/src/mage/cards/s/SolitaryHunter.java +++ b/Mage.Sets/src/mage/cards/s/SolitaryHunter.java @@ -2,6 +2,7 @@ package mage.cards.s; import java.util.UUID; + import mage.MageInt; import mage.abilities.TriggeredAbility; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; @@ -11,19 +12,17 @@ import mage.abilities.effects.common.TransformSourceEffect; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.o.OneOfThePack; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.TargetController; /** - * * @author LevelX2 */ public final class SolitaryHunter extends CardImpl { public SolitaryHunter(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.WARRIOR); this.subtype.add(SubType.WEREWOLF); @@ -32,7 +31,7 @@ public final class SolitaryHunter extends CardImpl { this.toughness = new MageInt(4); this.transformable = true; - this.secondSideCardClazz = OneOfThePack.class; + this.secondSideCardClazz = mage.cards.o.OneOfThePack.class; // At the beginning of each upkeep, if no spells were cast last turn, transform Solitary Hunter. this.addAbility(new TransformAbility()); @@ -48,4 +47,4 @@ public final class SolitaryHunter extends CardImpl { public SolitaryHunter copy() { return new SolitaryHunter(this); } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/s/SorinGrimNemesis.java b/Mage.Sets/src/mage/cards/s/SorinGrimNemesis.java index 4ffe833c373..a4d363f8bfc 100644 --- a/Mage.Sets/src/mage/cards/s/SorinGrimNemesis.java +++ b/Mage.Sets/src/mage/cards/s/SorinGrimNemesis.java @@ -4,7 +4,7 @@ package mage.cards.s; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.costs.Cost; import mage.abilities.costs.common.PayVariableLoyaltyCost; import mage.abilities.dynamicvalue.DynamicValue; @@ -40,7 +40,7 @@ public final class SorinGrimNemesis extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.SORIN); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(6)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(6)); // +1: Reveal the top card of your library and put that card into your hand. Each opponent loses life equal to its converted mana cost. this.addAbility(new LoyaltyAbility(new SorinGrimNemesisRevealEffect(), 1)); diff --git a/Mage.Sets/src/mage/cards/s/SorinLordOfInnistrad.java b/Mage.Sets/src/mage/cards/s/SorinLordOfInnistrad.java index 9a01521a283..211cb1e3812 100644 --- a/Mage.Sets/src/mage/cards/s/SorinLordOfInnistrad.java +++ b/Mage.Sets/src/mage/cards/s/SorinLordOfInnistrad.java @@ -6,7 +6,7 @@ import java.util.Set; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.GetEmblemEffect; @@ -47,7 +47,7 @@ public final class SorinLordOfInnistrad extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.SORIN); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3)); // +1: Create a 1/1 black Vampire creature token with lifelink. this.addAbility(new LoyaltyAbility(new CreateTokenEffect(new SorinLordOfInnistradVampireToken()), 1)); diff --git a/Mage.Sets/src/mage/cards/s/SorinMarkov.java b/Mage.Sets/src/mage/cards/s/SorinMarkov.java index a2f3f39d29e..1797ea59c42 100644 --- a/Mage.Sets/src/mage/cards/s/SorinMarkov.java +++ b/Mage.Sets/src/mage/cards/s/SorinMarkov.java @@ -4,7 +4,7 @@ package mage.cards.s; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.GainLifeEffect; @@ -32,7 +32,7 @@ public final class SorinMarkov extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.SORIN); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(4)); // +2: Sorin Markov deals 2 damage to any target and you gain 2 life. LoyaltyAbility ability1 = new LoyaltyAbility(new DamageTargetEffect(2), 2); diff --git a/Mage.Sets/src/mage/cards/s/SorinSolemnVisitor.java b/Mage.Sets/src/mage/cards/s/SorinSolemnVisitor.java index 73980a076fc..c795a891973 100644 --- a/Mage.Sets/src/mage/cards/s/SorinSolemnVisitor.java +++ b/Mage.Sets/src/mage/cards/s/SorinSolemnVisitor.java @@ -3,7 +3,7 @@ package mage.cards.s; import java.util.UUID; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.GetEmblemEffect; @@ -31,7 +31,7 @@ public final class SorinSolemnVisitor extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.SORIN); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(4)); // +1: Until your next turn, creatures you control get +1/+0 and gain lifelink. Effect effect = new BoostControlledEffect(1, 0, Duration.UntilYourNextTurn, StaticFilters.FILTER_PERMANENT_CREATURES); diff --git a/Mage.Sets/src/mage/cards/s/SosukesSummons.java b/Mage.Sets/src/mage/cards/s/SosukesSummons.java index e5ea61eb3b7..b3afeaf79fb 100644 --- a/Mage.Sets/src/mage/cards/s/SosukesSummons.java +++ b/Mage.Sets/src/mage/cards/s/SosukesSummons.java @@ -1,8 +1,7 @@ package mage.cards.s; -import java.util.UUID; -import mage.abilities.common.CreatureEntersBattlefieldTriggeredAbility; +import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.ReturnSourceFromGraveyardToHandEffect; import mage.cards.CardImpl; @@ -16,30 +15,34 @@ import mage.filter.predicate.mageobject.SubtypePredicate; import mage.filter.predicate.permanent.TokenPredicate; import mage.game.permanent.token.SnakeToken; +import java.util.UUID; + /** - * * @author LevelX2 */ public final class SosukesSummons extends CardImpl { - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("nontoken Snake"); + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("a nontoken Snake"); static { - filter.add(new SubtypePredicate(SubType.SNAKE)); - filter.add(Predicates.not(new TokenPredicate())); + filter.add(new SubtypePredicate(SubType.SNAKE)); + filter.add(Predicates.not(new TokenPredicate())); } public SosukesSummons(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{2}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{G}"); // Create two 1/1 green Snake creature tokens. this.getSpellAbility().addEffect(new CreateTokenEffect(new SnakeToken(), 2)); // Whenever a nontoken Snake enters the battlefield under your control, you may return Sosuke's Summons from your graveyard to your hand. - this.addAbility(new CreatureEntersBattlefieldTriggeredAbility(Zone.GRAVEYARD, new ReturnSourceFromGraveyardToHandEffect(), filter, true, false)); - - + this.addAbility(new EntersBattlefieldControlledTriggeredAbility( + Zone.GRAVEYARD, + new ReturnSourceFromGraveyardToHandEffect(), + filter, + true) + ); } public SosukesSummons(final SosukesSummons card) { diff --git a/Mage.Sets/src/mage/cards/s/SoulSeizer.java b/Mage.Sets/src/mage/cards/s/SoulSeizer.java index 04af0f11834..f578200ea02 100644 --- a/Mage.Sets/src/mage/cards/s/SoulSeizer.java +++ b/Mage.Sets/src/mage/cards/s/SoulSeizer.java @@ -2,6 +2,7 @@ package mage.cards.s; import java.util.UUID; + import mage.MageInt; import mage.abilities.Ability; import mage.abilities.TriggeredAbilityImpl; @@ -10,7 +11,6 @@ import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.g.GhastlyHaunting; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Outcome; @@ -26,17 +26,16 @@ import mage.players.Player; import mage.target.common.TargetCreaturePermanent; /** - * * @author BetaSteward */ public final class SoulSeizer extends CardImpl { public SoulSeizer(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{U}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}{U}"); this.subtype.add(SubType.SPIRIT); this.transformable = true; - this.secondSideCardClazz = GhastlyHaunting.class; + this.secondSideCardClazz = mage.cards.g.GhastlyHaunting.class; this.power = new MageInt(1); this.toughness = new MageInt(3); @@ -80,7 +79,7 @@ class SoulSeizerTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { - DamagedPlayerEvent damageEvent = (DamagedPlayerEvent)event; + DamagedPlayerEvent damageEvent = (DamagedPlayerEvent) event; if (damageEvent.isCombatDamage() && event.getSourceId().equals(this.getSourceId())) { Player opponent = game.getPlayer(event.getPlayerId()); if (opponent != null) { @@ -116,7 +115,7 @@ class SoulSeizerEffect extends OneShotEffect { Permanent permanent = game.getPermanent(source.getSourceId()); if (permanent != null && permanent.isTransformable()) { if (permanent.transform(game)) { - game.informPlayers(new StringBuilder(permanent.getName()).append(" transforms into ").append(permanent.getSecondCardFace().getName()).toString()); + game.informPlayers(new StringBuilder(permanent.getName()).append(" transforms into ").append(permanent.getSecondCardFace().getName()).toString()); Permanent attachTo = game.getPermanent(targetPointer.getFirst(game, source)); if (attachTo != null) { return attachTo.addAttachment(source.getSourceId(), game); diff --git a/Mage.Sets/src/mage/cards/s/SoulhunterRakshasa.java b/Mage.Sets/src/mage/cards/s/SoulhunterRakshasa.java new file mode 100644 index 00000000000..dba46f380ce --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SoulhunterRakshasa.java @@ -0,0 +1,45 @@ +package mage.cards.s; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.CantBlockAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.target.common.TargetOpponentOrPlaneswalker; + +import java.util.UUID; + +/** + * @author JayDi85 + */ +public final class SoulhunterRakshasa extends CardImpl { + + public SoulhunterRakshasa(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}{B}"); + this.subtype.add(SubType.CAT, SubType.DEMON); + + this.power = new MageInt(5); + this.toughness = new MageInt(5); + + // Soulhunter Rakshasa can’t block. + this.addAbility(new CantBlockAbility()); + + // When Soulhunter Rakshasa enters the battlefield, it deals 5 damage to target opponent. + Ability ability = new EntersBattlefieldTriggeredAbility(new DamageTargetEffect(5, "it"), false); + ability.addTarget(new TargetOpponentOrPlaneswalker()); + this.addAbility(ability); + } + + public SoulhunterRakshasa(final SoulhunterRakshasa card) { + super(card); + } + + @Override + public SoulhunterRakshasa copy() { + return new SoulhunterRakshasa(this); + } +} diff --git a/Mage.Sets/src/mage/cards/s/SpatulaOfTheAges.java b/Mage.Sets/src/mage/cards/s/SpatulaOfTheAges.java new file mode 100644 index 00000000000..c6ece6f912b --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SpatulaOfTheAges.java @@ -0,0 +1,56 @@ + +package mage.cards.s; + +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.PutCardFromHandOntoBattlefieldEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SuperType; +import mage.constants.Zone; +import mage.filter.common.FilterPermanentCard; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.NamePredicate; +import mage.filter.predicate.mageobject.SupertypePredicate; +import mage.filter.predicate.other.ExpansionSetPredicate; + +/** + * + * @author L_J + */ +public final class SpatulaOfTheAges extends CardImpl { + + private static final FilterPermanentCard filter = new FilterPermanentCard("a silver-bordered permanent card"); + + static { + filter.add(Predicates.and( + Predicates.not(new SupertypePredicate(SuperType.BASIC)), // all Un-set basic lands are black bordered cards, and thus illegal choices + Predicates.not(new NamePredicate("Steamflogger Boss")), // printed in Unstable with a black border + Predicates.or(new ExpansionSetPredicate("UGL"), new ExpansionSetPredicate("UNH"), new ExpansionSetPredicate("UST")) + )); + } + + public SpatulaOfTheAges(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{4}"); + + // {4}, {T}, Sacrifice Spatula of the Ages: You may put a silver-bordered permanent card from your hand onto the battlefield. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutCardFromHandOntoBattlefieldEffect(filter), new ManaCostsImpl("{4}")); + ability.addCost(new TapSourceCost()); + ability.addCost(new SacrificeSourceCost()); + this.addAbility(ability); + } + + public SpatulaOfTheAges(final SpatulaOfTheAges card) { + super(card); + } + + @Override + public SpatulaOfTheAges copy() { + return new SpatulaOfTheAges(this); + } +} diff --git a/Mage.Sets/src/mage/cards/s/SphinxOfJwarIsle.java b/Mage.Sets/src/mage/cards/s/SphinxOfJwarIsle.java index fd8fa2f50f8..49b8e776e4a 100644 --- a/Mage.Sets/src/mage/cards/s/SphinxOfJwarIsle.java +++ b/Mage.Sets/src/mage/cards/s/SphinxOfJwarIsle.java @@ -73,7 +73,7 @@ class SphinxOfJwarIsleEffect extends OneShotEffect { public SphinxOfJwarIsleEffect() { super(Outcome.Neutral); - this.staticText = "You may look at the top card of your library"; + this.staticText = "You may look at the top card of your library any time"; } public SphinxOfJwarIsleEffect(final SphinxOfJwarIsleEffect effect) { diff --git a/Mage.Sets/src/mage/cards/s/StaffOfTheLetterMagus.java b/Mage.Sets/src/mage/cards/s/StaffOfTheLetterMagus.java new file mode 100644 index 00000000000..b31f034cc67 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/StaffOfTheLetterMagus.java @@ -0,0 +1,145 @@ + +package mage.cards.s; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.common.AsEntersBattlefieldAbility; +import mage.abilities.common.SpellCastAllTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.choices.ChoiceImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SetTargetPointer; +import mage.filter.FilterSpell; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.game.stack.Spell; +import mage.players.Player; +import mage.util.CardUtil; + +/** + * + * @author L_J + */ +public final class StaffOfTheLetterMagus extends CardImpl { + + public StaffOfTheLetterMagus(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{3}"); + + // As Staff of the Letter Magus enters the battlefield, choose a consonant other than N, R, S, or T. + this.addAbility(new AsEntersBattlefieldAbility(new StaffOfTheLetterMagusChooseLetterEffect())); + + // Whenever a player casts a spell, you gain 1 life for each time the chosen letter appears in that spell’s name. + this.addAbility(new SpellCastAllTriggeredAbility(new StaffOfTheLetterMagusEffect(), new FilterSpell("a spell"), false, SetTargetPointer.SPELL)); + } + + public StaffOfTheLetterMagus(final StaffOfTheLetterMagus card) { + super(card); + } + + @Override + public StaffOfTheLetterMagus copy() { + return new StaffOfTheLetterMagus(this); + } +} + +class StaffOfTheLetterMagusChooseLetterEffect extends OneShotEffect { + + public StaffOfTheLetterMagusChooseLetterEffect() { + super(Outcome.Benefit); + staticText = "choose a consonant other than N, R, S, or T"; + } + + public StaffOfTheLetterMagusChooseLetterEffect(final StaffOfTheLetterMagusChooseLetterEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + MageObject mageObject = game.getPermanentEntering(source.getSourceId()); + if (mageObject == null) { + mageObject = game.getObject(source.getSourceId()); + } + + ChoiceImpl choice = new ChoiceImpl(true); + choice.setMessage("Choose letter"); + Set choices = new HashSet<>(); + // Can I choose Y? + // Yes. We play by popular game show rules here. Y is a consonant. + // https://magic.wizards.com/en/articles/archive/news/unstable-faqawaslfaqpaftidawabiajtbt-2017-12-06 + Character[] forbiddenChars = {'A','E','I','N','O','R','S','T','U'}; + for (Character letter = 'A'; letter <= 'Z'; letter++) { + if (Arrays.binarySearch(forbiddenChars, letter) < 0) { + choices.add(letter.toString()); + } + } + choice.setChoices(choices); + + if (controller != null && mageObject != null && controller.choose(outcome, choice, game)) { + if (!game.isSimulation()) { + game.informPlayers(mageObject.getLogName() + ": " + controller.getLogName() + " has chosen " + choice.getChoice()); + } + game.getState().setValue(mageObject.getId() + "_letter", choice.getChoice()); + if (mageObject instanceof Permanent) { + ((Permanent) mageObject).addInfo("chosen letter", CardUtil.addToolTipMarkTags("Chosen letter: " + choice.getChoice()), game); + } + return true; + } + return false; + } + + @Override + public StaffOfTheLetterMagusChooseLetterEffect copy() { + return new StaffOfTheLetterMagusChooseLetterEffect(this); + } +} + +class StaffOfTheLetterMagusEffect extends OneShotEffect { + + public StaffOfTheLetterMagusEffect() { + super(Outcome.GainLife); + staticText = "you gain 1 life for each time the chosen letter appears in that spell’s name"; + } + + public StaffOfTheLetterMagusEffect(final StaffOfTheLetterMagusEffect effect) { + super(effect); + } + + @Override + public StaffOfTheLetterMagusEffect copy() { + return new StaffOfTheLetterMagusEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + Spell spell = game.getStack().getSpell(this.getTargetPointer().getFirst(game, source)); + if (controller != null && spell != null) { + MageObject mageObject = game.getObject(source.getSourceId()); + if (mageObject instanceof Permanent) { + Permanent permanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); + if (permanent != null && game.getState().getValue(mageObject.getId() + "_letter") != null) { + int lifegainValue = 0; + String spellName = spell.getName(); + for (int i = 0; i < spellName.length(); i++) { + Character letter = spellName.charAt(i); + String chosenLetter = (String) game.getState().getValue(mageObject.getId() + "_letter"); + if (Character.isLetter(letter) && Character.toUpperCase(letter) == chosenLetter.charAt(0)) { + lifegainValue++; + } + } + controller.gainLife(lifegainValue, game, source); + return true; + } + } + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/s/StartledAwake.java b/Mage.Sets/src/mage/cards/s/StartledAwake.java index 9aefc281a3a..ac444056686 100644 --- a/Mage.Sets/src/mage/cards/s/StartledAwake.java +++ b/Mage.Sets/src/mage/cards/s/StartledAwake.java @@ -2,6 +2,7 @@ package mage.cards.s; import java.util.UUID; + import mage.abilities.Ability; import mage.abilities.common.ActivateAsSorceryActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; @@ -11,7 +12,6 @@ import mage.abilities.keyword.TransformAbility; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.p.PersistentNightmare; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; @@ -20,16 +20,15 @@ import mage.players.Player; import mage.target.common.TargetOpponent; /** - * * @author LevelX2 */ public final class StartledAwake extends CardImpl { public StartledAwake(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{2}{U}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{U}{U}"); this.transformable = true; - this.secondSideCardClazz = PersistentNightmare.class; + this.secondSideCardClazz = mage.cards.p.PersistentNightmare.class; // Target opponent puts the top thirteen cards of their library into their graveyard. this.getSpellAbility().addTarget(new TargetOpponent()); @@ -83,4 +82,4 @@ class StartledAwakeReturnTransformedEffect extends OneShotEffect { } return false; } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/s/SteelHellkite.java b/Mage.Sets/src/mage/cards/s/SteelHellkite.java index 504f6e7b6a1..694efcbf182 100644 --- a/Mage.Sets/src/mage/cards/s/SteelHellkite.java +++ b/Mage.Sets/src/mage/cards/s/SteelHellkite.java @@ -1,7 +1,6 @@ package mage.cards.s; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.LimitedTimesPerTurnActivatedAbility; @@ -9,19 +8,25 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DestroyAllEffect; import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.SubType; -import mage.constants.Duration; -import mage.constants.Outcome; -import mage.constants.Zone; +import mage.constants.*; +import mage.filter.FilterPermanent; import mage.filter.common.FilterNonlandPermanent; +import mage.filter.predicate.Predicate; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.ConvertedManaCostPredicate; +import mage.filter.predicate.permanent.ControllerIdPredicate; import mage.game.Game; +import mage.game.events.DamagedEvent; +import mage.game.events.GameEvent; import mage.game.permanent.Permanent; -import mage.watchers.common.PlayerDamagedBySourceWatcher; +import mage.watchers.Watcher; + +import java.util.*; /** * @author nantuko @@ -37,9 +42,17 @@ public final class SteelHellkite extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // {2}: Steel Hellkite gets +1/+0 until end of turn. - this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(1, 0, Duration.EndOfTurn), new GenericManaCost(2))); + this.addAbility(new SimpleActivatedAbility( + Zone.BATTLEFIELD, + new BoostSourceEffect(1, 0, Duration.EndOfTurn), + new GenericManaCost(2) + )); // {X}: Destroy each nonland permanent with converted mana cost X whose controller was dealt combat damage by Steel Hellkite this turn. Activate this ability only once each turn. - this.addAbility(new LimitedTimesPerTurnActivatedAbility(Zone.BATTLEFIELD, new SteelHellkiteDestroyEffect(), new ManaCostsImpl("{X}"))); + this.addAbility(new LimitedTimesPerTurnActivatedAbility( + Zone.BATTLEFIELD, + new SteelHellkiteDestroyEffect(), + new ManaCostsImpl("{X}") + ), new SteelHellkiteWatcher()); } @@ -71,15 +84,55 @@ class SteelHellkiteDestroyEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - int xValue = source.getManaCostsToPay().getX(); - for (Permanent permanent : game.getBattlefield().getActivePermanents(new FilterNonlandPermanent(), source.getControllerId(), source.getSourceId(), game)) { - if (permanent.getConvertedManaCost() == xValue) { - PlayerDamagedBySourceWatcher watcher = (PlayerDamagedBySourceWatcher) game.getState().getWatchers().get(PlayerDamagedBySourceWatcher.class.getSimpleName(), permanent.getControllerId()); - if (watcher != null && watcher.hasSourceDoneDamage(source.getSourceId(), game)) { - permanent.destroy(source.getSourceId(), game, false); - } - } + SteelHellkiteWatcher watcher = (SteelHellkiteWatcher) game.getState().getWatchers().get(SteelHellkiteWatcher.class.getSimpleName()); + if (watcher == null || watcher.getDamagedPlayers(source.getSourceId()).isEmpty()) { + return false; } - return true; + Set> predicateSet = new HashSet<>(); + for (UUID playerId : watcher.getDamagedPlayers(source.getSourceId())) { + predicateSet.add(new ControllerIdPredicate(playerId)); + } + FilterPermanent filter = new FilterNonlandPermanent(); + filter.add(new ConvertedManaCostPredicate(ComparisonType.EQUAL_TO, source.getManaCostsToPay().getX())); + filter.add(Predicates.or(predicateSet)); + return new DestroyAllEffect(filter).apply(game, source); } } + +class SteelHellkiteWatcher extends Watcher { + + private final Map> damageMap = new HashMap<>(); + + public SteelHellkiteWatcher() { + super(SteelHellkiteWatcher.class.getSimpleName(), WatcherScope.GAME); + } + + public SteelHellkiteWatcher(final SteelHellkiteWatcher watcher) { + super(watcher); + this.damageMap.putAll(watcher.damageMap); + } + + @Override + public void watch(GameEvent event, Game game) { + if (event.getType() == GameEvent.EventType.DAMAGED_PLAYER + && ((DamagedEvent) event).isCombatDamage()) { + damageMap.putIfAbsent(event.getSourceId(), new HashSet<>()); + damageMap.get(event.getSourceId()).add(event.getPlayerId()); + } + } + + @Override + public void reset() { + super.reset(); + this.damageMap.clear(); + } + + @Override + public Watcher copy() { + return new SteelHellkiteWatcher(this); + } + + public Set getDamagedPlayers(UUID damagerId) { + return damageMap.getOrDefault(damagerId, new HashSet<>()); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/s/SteelyResolve.java b/Mage.Sets/src/mage/cards/s/SteelyResolve.java index 8deff75df2a..2c33f36dab8 100644 --- a/Mage.Sets/src/mage/cards/s/SteelyResolve.java +++ b/Mage.Sets/src/mage/cards/s/SteelyResolve.java @@ -57,7 +57,7 @@ class FilterSteelyResolve extends FilterCreaturePermanent { @Override public boolean match(Permanent permanent, UUID sourceId, UUID playerId, Game game) { if (super.match(permanent, sourceId, playerId, game)) { - SubType subType = ChooseCreatureTypeEffect.getChoosenCreatureType(sourceId, game); + SubType subType = ChooseCreatureTypeEffect.getChosenCreatureType(sourceId, game); if (subType != null && permanent.hasSubtype(subType, game)) { return true; } diff --git a/Mage.Sets/src/mage/cards/s/StonehewerGiant.java b/Mage.Sets/src/mage/cards/s/StonehewerGiant.java index 2fec92da464..8fb3a3d39c4 100644 --- a/Mage.Sets/src/mage/cards/s/StonehewerGiant.java +++ b/Mage.Sets/src/mage/cards/s/StonehewerGiant.java @@ -1,7 +1,6 @@ package mage.cards.s; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -25,8 +24,9 @@ import mage.target.Target; import mage.target.common.TargetCardInLibrary; import mage.target.common.TargetControlledCreaturePermanent; +import java.util.UUID; + /** - * * @author LevelX2 */ public final class StonehewerGiant extends CardImpl { @@ -42,7 +42,11 @@ public final class StonehewerGiant extends CardImpl { // Vigilance this.addAbility(VigilanceAbility.getInstance()); // {1}{W}, {tap}: Search your library for an Equipment card and put it onto the battlefield. Attach it to a creature you control. Then shuffle your library. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new StonehewerGiantEffect(), new ManaCostsImpl("{1}{W}")); + Ability ability = new SimpleActivatedAbility( + Zone.BATTLEFIELD, + new StonehewerGiantEffect(), + new ManaCostsImpl("{1}{W}") + ); ability.addCost(new TapSourceCost()); this.addAbility(ability); @@ -90,6 +94,7 @@ class StonehewerGiantEffect extends OneShotEffect { controller.moveCards(card, Zone.BATTLEFIELD, source, game); Permanent equipment = game.getPermanent(card.getId()); Target targetCreature = new TargetControlledCreaturePermanent(); + targetCreature.setNotTarget(true); if (equipment != null && controller.choose(Outcome.BoostCreature, targetCreature, source.getSourceId(), game)) { Permanent permanent = game.getPermanent(targetCreature.getFirstTarget()); permanent.addAttachment(equipment.getId(), game); diff --git a/Mage.Sets/src/mage/cards/s/StormTheVault.java b/Mage.Sets/src/mage/cards/s/StormTheVault.java index 968f3b72d52..0cdff1b9daa 100644 --- a/Mage.Sets/src/mage/cards/s/StormTheVault.java +++ b/Mage.Sets/src/mage/cards/s/StormTheVault.java @@ -15,7 +15,6 @@ import mage.abilities.effects.common.TransformSourceEffect; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.v.VaultOfCatlacan; import mage.constants.CardType; import mage.constants.ComparisonType; import mage.constants.SuperType; @@ -25,7 +24,6 @@ import mage.game.Game; import mage.game.permanent.token.TreasureToken; /** - * * @author LevelX2 */ public final class StormTheVault extends CardImpl { @@ -36,7 +34,7 @@ public final class StormTheVault extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.transformable = true; - this.secondSideCardClazz = VaultOfCatlacan.class; + this.secondSideCardClazz = mage.cards.v.VaultOfCatlacan.class; // Whenever one or more creatures you control deal combat damage to a player, create a colorless Treasure artifact token with "{T}, Sacrifice this artifact: Add one mana of any color." this.addAbility(new ControlledCreaturesDealCombatDamagePlayerTriggeredAbility(new CreateTokenEffect(new TreasureToken()))); @@ -51,7 +49,6 @@ public final class StormTheVault extends CardImpl { } - public StormTheVault(final StormTheVault card) { super(card); } @@ -60,4 +57,4 @@ public final class StormTheVault extends CardImpl { public StormTheVault copy() { return new StormTheVault(this); } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/s/StreetRiot.java b/Mage.Sets/src/mage/cards/s/StreetRiot.java new file mode 100644 index 00000000000..47cfcea72ad --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/StreetRiot.java @@ -0,0 +1,55 @@ +package mage.cards.s; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.common.MyTurnCondition; +import mage.abilities.decorator.ConditionalContinuousEffect; +import mage.abilities.effects.common.continuous.BoostControlledEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Zone; +import mage.filter.StaticFilters; + +/** + * + * @author TheElk801 + */ +public final class StreetRiot extends CardImpl { + + public StreetRiot(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{4}{R}"); + + // As long as it's your turn, creatures you control get +1/+0 and have trample. + Ability ability = new SimpleStaticAbility( + Zone.BATTLEFIELD, + new ConditionalContinuousEffect( + new BoostControlledEffect( + 1, 0, Duration.WhileOnBattlefield + ), MyTurnCondition.instance, + "As long as it's your turn, " + + "creatures you control get +1/+0" + )); + ability.addEffect(new ConditionalContinuousEffect( + new GainAbilityControlledEffect( + TrampleAbility.getInstance(), + Duration.WhileOnBattlefield, + StaticFilters.FILTER_CONTROLLED_CREATURES + ), MyTurnCondition.instance, "and have trample" + )); + this.addAbility(ability); + } + + public StreetRiot(final StreetRiot card) { + super(card); + } + + @Override + public StreetRiot copy() { + return new StreetRiot(this); + } +} diff --git a/Mage.Sets/src/mage/cards/s/SumalaWoodshaper.java b/Mage.Sets/src/mage/cards/s/SumalaWoodshaper.java index d5522821caa..258cf034675 100644 --- a/Mage.Sets/src/mage/cards/s/SumalaWoodshaper.java +++ b/Mage.Sets/src/mage/cards/s/SumalaWoodshaper.java @@ -5,10 +5,11 @@ import mage.MageInt; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; -import mage.constants.SubType; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Zone; import mage.filter.FilterCard; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.CardTypePredicate; @@ -39,7 +40,7 @@ public final class SumalaWoodshaper extends CardImpl { // When Sumala Woodshaper enters the battlefield, look at the top four cards of your library. You may reveal a creature or enchantment card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. this.addAbility(new EntersBattlefieldTriggeredAbility(new LookLibraryAndPickControllerEffect( - new StaticValue(4), false, new StaticValue(1), filter, false + new StaticValue(4), false, new StaticValue(1), filter, Zone.LIBRARY, false, true, false, Zone.HAND, false, false, false ), false)); } diff --git a/Mage.Sets/src/mage/cards/s/SupremeLeaderSnoke.java b/Mage.Sets/src/mage/cards/s/SupremeLeaderSnoke.java index b434075e19d..c894340e3a7 100644 --- a/Mage.Sets/src/mage/cards/s/SupremeLeaderSnoke.java +++ b/Mage.Sets/src/mage/cards/s/SupremeLeaderSnoke.java @@ -1,39 +1,32 @@ package mage.cards.s; -import java.util.Iterator; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; import mage.abilities.costs.Cost; import mage.abilities.costs.common.PayVariableLoyaltyCost; import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.dynamicvalue.common.OpponentsLostLifeCount; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.*; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.effects.common.continuous.GainControlTargetEffect; -import mage.abilities.effects.common.counter.AddCountersTargetEffect; import mage.abilities.keyword.HasteAbility; import mage.constants.*; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.counters.Counter; import mage.counters.CounterType; -import mage.filter.FilterCard; import mage.filter.StaticFilters; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.ConvertedManaCostPredicate; import mage.game.Game; import mage.game.permanent.Permanent; -import mage.players.Player; -import mage.players.PlayerList; import mage.target.common.TargetCreaturePermanent; import mage.watchers.common.PlayerLostLifeNonCombatWatcher; -import mage.watchers.common.PlayerLostLifeWatcher; /** * @@ -48,7 +41,7 @@ public final class SupremeLeaderSnoke extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.SNOKE); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3)); // +1: Put a loyalty counter on Supreme Leader Snoke for each life lost by all opponents from noncombat sources this turn. Ability ability1 = new LoyaltyAbility(new SupremeLeaderSnokeCounterEffect(CounterType.LOYALTY.createInstance()), 1); diff --git a/Mage.Sets/src/mage/cards/s/SymbolStatus.java b/Mage.Sets/src/mage/cards/s/SymbolStatus.java new file mode 100644 index 00000000000..ea40bec2e43 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SymbolStatus.java @@ -0,0 +1,65 @@ + +package mage.cards.s; + +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.game.permanent.token.ExpansionSymbolToken; + +/** + * + * @author L_J + */ +public class SymbolStatus extends CardImpl { + + public SymbolStatus(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{G}{G}"); + + // Create a 1/1 colorless Expansion-Symbol creature token for each different expansion symbol among permanents you control. + this.getSpellAbility().addEffect(new SymbolStatusEffect()); + } + + public SymbolStatus(final SymbolStatus card) { + super(card); + } + + @Override + public SymbolStatus copy() { + return new SymbolStatus(this); + } +} + +class SymbolStatusEffect extends OneShotEffect { + + public SymbolStatusEffect() { + super(Outcome.PutCreatureInPlay); + this.staticText = "Create a 1/1 colorless Expansion-Symbol creature token for each different expansion symbol among permanents you control"; + } + + public SymbolStatusEffect(final SymbolStatusEffect effect) { + super(effect); + } + + @Override + public SymbolStatusEffect copy() { + return new SymbolStatusEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Set symbols = new HashSet<>(); + for (Permanent permanent : game.getBattlefield().getAllActivePermanents(source.getControllerId())) { + symbols.add(permanent.getExpansionSetCode()); + } + return new CreateTokenEffect(new ExpansionSymbolToken(), symbols.size()).apply(game, source); + } +} diff --git a/Mage.Sets/src/mage/cards/s/SynodArtificer.java b/Mage.Sets/src/mage/cards/s/SynodArtificer.java index 030b8805dd6..efa906cbaa3 100644 --- a/Mage.Sets/src/mage/cards/s/SynodArtificer.java +++ b/Mage.Sets/src/mage/cards/s/SynodArtificer.java @@ -1,4 +1,3 @@ - package mage.cards.s; import java.util.UUID; @@ -14,12 +13,12 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.constants.TargetAdjustment; import mage.constants.Zone; import mage.filter.FilterPermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.CardTypePredicate; import mage.target.TargetPermanent; +import mage.target.targetadjustment.XTargetsAdjuster; /** * @@ -46,7 +45,7 @@ public final class SynodArtificer extends CardImpl { tapEffect.setText("Tap X target noncreature artifacts."); Ability tapAbility = new SimpleActivatedAbility(Zone.BATTLEFIELD, tapEffect, new ManaCostsImpl("{X}")); tapAbility.addCost(new TapSourceCost()); - tapAbility.setTargetAdjustment(TargetAdjustment.X_TARGETS); + tapAbility.setTargetAdjuster(XTargetsAdjuster.instance); tapAbility.addTarget(new TargetPermanent(filter)); this.addAbility(tapAbility); @@ -55,7 +54,7 @@ public final class SynodArtificer extends CardImpl { untapEffect.setText("Untap X target noncreature artifacts."); Ability untapAbility = new SimpleActivatedAbility(Zone.BATTLEFIELD, untapEffect, new ManaCostsImpl("{X}")); untapAbility.addCost(new TapSourceCost()); - untapAbility.setTargetAdjustment(TargetAdjustment.X_TARGETS); + untapAbility.setTargetAdjuster(XTargetsAdjuster.instance); untapAbility.addTarget(new TargetPermanent(filter)); this.addAbility(untapAbility); } diff --git a/Mage.Sets/src/mage/cards/t/TacticalAdvantage.java b/Mage.Sets/src/mage/cards/t/TacticalAdvantage.java new file mode 100644 index 00000000000..52774236e1d --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TacticalAdvantage.java @@ -0,0 +1,51 @@ +package mage.cards.t; + +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.TargetController; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.permanent.BlockedPredicate; +import mage.filter.predicate.permanent.BlockingPredicate; +import mage.filter.predicate.permanent.ControllerPredicate; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * @author JayDi85 + */ +public final class TacticalAdvantage extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("blocking or blocked creature you control"); + + static { + filter.add( + Predicates.or( + new BlockingPredicate(), + new BlockedPredicate() + + )); + filter.add(new ControllerPredicate(TargetController.YOU)); + } + + public TacticalAdvantage(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{W}"); + + // Target blocking or blocked creature you control gets +2/+2 until end of turn. + this.getSpellAbility().addEffect(new BoostTargetEffect(2, 2, Duration.EndOfTurn)); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter)); + } + + public TacticalAdvantage(final TacticalAdvantage card) { + super(card); + } + + @Override + public TacticalAdvantage copy() { + return new TacticalAdvantage(this); + } +} diff --git a/Mage.Sets/src/mage/cards/t/TakeHeart.java b/Mage.Sets/src/mage/cards/t/TakeHeart.java new file mode 100644 index 00000000000..b57596a3632 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TakeHeart.java @@ -0,0 +1,50 @@ +package mage.cards.t; + +import java.util.UUID; +import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; +import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.permanent.AttackingPredicate; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author TheElk801 + */ +public final class TakeHeart extends CardImpl { + + private static final FilterPermanent filter + = new FilterControlledCreaturePermanent(); + + static { + filter.add(new AttackingPredicate()); + } + + public TakeHeart(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{W}"); + + // Target creature gets +2/+2 until end of turn. You gain 1 life for each attacking creature you control. + this.getSpellAbility().addEffect( + new BoostTargetEffect(2, 2, Duration.EndOfTurn) + ); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + this.getSpellAbility().addEffect(new GainLifeEffect( + new PermanentsOnBattlefieldCount(filter) + ).setText("You gain 1 life for each attacking creature you control.")); + } + + public TakeHeart(final TakeHeart card) { + super(card); + } + + @Override + public TakeHeart copy() { + return new TakeHeart(this); + } +} diff --git a/Mage.Sets/src/mage/cards/t/TamiyoFieldResearcher.java b/Mage.Sets/src/mage/cards/t/TamiyoFieldResearcher.java index c7d568a392c..1df9e2de403 100644 --- a/Mage.Sets/src/mage/cards/t/TamiyoFieldResearcher.java +++ b/Mage.Sets/src/mage/cards/t/TamiyoFieldResearcher.java @@ -5,7 +5,7 @@ import mage.MageObjectReference; import mage.abilities.Ability; import mage.abilities.DelayedTriggeredAbility; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DontUntapInControllersNextUntapStepTargetEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; @@ -52,7 +52,7 @@ public final class TamiyoFieldResearcher extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.TAMIYO); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(4)); // +1: Choose up to two target creatures. Until your next turn, whenever either of those creatures deals combat damage, you draw a card. Ability ability = new LoyaltyAbility(new TamiyoFieldResearcherEffect1(), 1); diff --git a/Mage.Sets/src/mage/cards/t/TamiyoTheMoonSage.java b/Mage.Sets/src/mage/cards/t/TamiyoTheMoonSage.java index ac407882ef4..6239f76dff0 100644 --- a/Mage.Sets/src/mage/cards/t/TamiyoTheMoonSage.java +++ b/Mage.Sets/src/mage/cards/t/TamiyoTheMoonSage.java @@ -4,7 +4,7 @@ package mage.cards.t; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.effects.Effect; import mage.abilities.effects.common.DontUntapInControllersNextUntapStepTargetEffect; @@ -35,7 +35,7 @@ public final class TamiyoTheMoonSage extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.TAMIYO); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(4)); // +1: Tap target permanent. It doesn't untap during its controller's next untap step. LoyaltyAbility ability = new LoyaltyAbility(new TapTargetEffect(), 1); diff --git a/Mage.Sets/src/mage/cards/t/TangleclawWerewolf.java b/Mage.Sets/src/mage/cards/t/TangleclawWerewolf.java index 87d8e0b77c7..4c48ff2fa39 100644 --- a/Mage.Sets/src/mage/cards/t/TangleclawWerewolf.java +++ b/Mage.Sets/src/mage/cards/t/TangleclawWerewolf.java @@ -2,6 +2,7 @@ package mage.cards.t; import java.util.UUID; + import mage.MageInt; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleStaticAbility; @@ -11,27 +12,25 @@ import mage.abilities.effects.common.combat.CanBlockAdditionalCreatureEffect; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.f.FibrousEntangler; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Duration; import mage.constants.Zone; /** - * * @author LevelX2 */ public final class TangleclawWerewolf extends CardImpl { public TangleclawWerewolf(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{G}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}{G}"); this.subtype.add(SubType.WEREWOLF); this.subtype.add(SubType.HORROR); this.power = new MageInt(2); this.toughness = new MageInt(4); this.transformable = true; - this.secondSideCardClazz = FibrousEntangler.class; + this.secondSideCardClazz = mage.cards.f.FibrousEntangler.class; // Tangleclaw Werewolf can block an additional creature each combat. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CanBlockAdditionalCreatureEffect(Duration.WhileOnBattlefield, 1))); diff --git a/Mage.Sets/src/mage/cards/t/TeferiHeroOfDominaria.java b/Mage.Sets/src/mage/cards/t/TeferiHeroOfDominaria.java index a7206c92909..5c101216514 100644 --- a/Mage.Sets/src/mage/cards/t/TeferiHeroOfDominaria.java +++ b/Mage.Sets/src/mage/cards/t/TeferiHeroOfDominaria.java @@ -1,11 +1,10 @@ package mage.cards.t; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.DelayedTriggeredAbility; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; @@ -24,8 +23,9 @@ import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetNonlandPermanent; +import java.util.UUID; + /** - * * @author LevelX2 */ public final class TeferiHeroOfDominaria extends CardImpl { @@ -36,12 +36,13 @@ public final class TeferiHeroOfDominaria extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.TEFERI); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(4)); - // +1: Draw a card. At the beginning of the next end step, untap two lands. + // +1: Draw a card. At the beginning of the next end step, untap up to two lands. LoyaltyAbility ability = new LoyaltyAbility(new DrawCardSourceControllerEffect(1), 1); DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility( - new UntapLandsEffect(2, false)); + new UntapLandsEffect(2) + ); ability.addEffect(new CreateDelayedTriggeredAbilityEffect(delayedAbility)); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/t/TeferiTemporalArchmage.java b/Mage.Sets/src/mage/cards/t/TeferiTemporalArchmage.java index 3fa04b528ae..213dfc7d5ae 100644 --- a/Mage.Sets/src/mage/cards/t/TeferiTemporalArchmage.java +++ b/Mage.Sets/src/mage/cards/t/TeferiTemporalArchmage.java @@ -4,7 +4,7 @@ package mage.cards.t; import java.util.UUID; import mage.abilities.LoyaltyAbility; import mage.abilities.common.CanBeYourCommanderAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.common.GetEmblemEffect; import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; @@ -31,7 +31,7 @@ public final class TeferiTemporalArchmage extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.TEFERI); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(5)); // +1: 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. this.addAbility(new LoyaltyAbility(new LookLibraryAndPickControllerEffect( diff --git a/Mage.Sets/src/mage/cards/t/TeferiTimebender.java b/Mage.Sets/src/mage/cards/t/TeferiTimebender.java index 66ad83cd17b..89f3fb3f296 100644 --- a/Mage.Sets/src/mage/cards/t/TeferiTimebender.java +++ b/Mage.Sets/src/mage/cards/t/TeferiTimebender.java @@ -3,7 +3,7 @@ package mage.cards.t; import java.util.UUID; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.GainLifeEffect; import mage.abilities.effects.common.UntapTargetEffect; @@ -29,7 +29,7 @@ public final class TeferiTimebender extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.TEFERI); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(5)); // +2: Untap up to one target artifact or creature. FilterPermanent filter = new FilterPermanent("artifact or creature"); diff --git a/Mage.Sets/src/mage/cards/t/TempOfTheDamned.java b/Mage.Sets/src/mage/cards/t/TempOfTheDamned.java new file mode 100644 index 00000000000..8d1249e920f --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TempOfTheDamned.java @@ -0,0 +1,107 @@ + +package mage.cards.t; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.AsEntersBattlefieldAbility; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Outcome; +import mage.constants.TargetController; +import mage.counters.CounterType; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; + +/** + * + * @author L_J + */ +public final class TempOfTheDamned extends CardImpl { + + public TempOfTheDamned(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{B}"); + this.subtype.add(SubType.ZOMBIE); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // As Temp of the Damned enters the battlefield, roll a six-sided die. Temp of the Damned enters the battlefield with a number of funk counters on it equal to the result. + this.addAbility(new AsEntersBattlefieldAbility(new TempOfTheDamnedEffect())); + + // At the beginning of your upkeep, remove a funk counter from Temp of the Damned. If you can't, sacrifice it. + this.addAbility(new BeginningOfUpkeepTriggeredAbility(new TempOfTheDamnedUpkeepEffect(), TargetController.YOU, false)); + } + + public TempOfTheDamned(final TempOfTheDamned card) { + super(card); + } + + @Override + public TempOfTheDamned copy() { + return new TempOfTheDamned(this); + } +} + +class TempOfTheDamnedEffect extends OneShotEffect { + + public TempOfTheDamnedEffect() { + super(Outcome.Neutral); + staticText = "roll a six-sided die. {this} enters the battlefield with a number of funk counters on it equal to the result"; + } + + public TempOfTheDamnedEffect(final TempOfTheDamnedEffect effect) { + super(effect); + } + + @Override + public TempOfTheDamnedEffect copy() { + return new TempOfTheDamnedEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + return new AddCountersSourceEffect(CounterType.FUNK.createInstance(controller.rollDice(game, 6))).apply(game, source); + } + return false; + } +} + +class TempOfTheDamnedUpkeepEffect extends OneShotEffect { + + TempOfTheDamnedUpkeepEffect() { + super(Outcome.Sacrifice); + staticText = "remove a funk counter from {this}. If you can't, sacrifice it"; + } + + TempOfTheDamnedUpkeepEffect(final TempOfTheDamnedUpkeepEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = game.getPermanent(source.getSourceId()); + if (permanent != null) { + int amount = permanent.getCounters(game).getCount(CounterType.FUNK); + if (amount > 0) { + permanent.removeCounters(CounterType.FUNK.createInstance(), game); + } else { + permanent.sacrifice(source.getSourceId(), game); + } + return true; + } + return false; + } + + @Override + public TempOfTheDamnedUpkeepEffect copy() { + return new TempOfTheDamnedUpkeepEffect(this); + } +} diff --git a/Mage.Sets/src/mage/cards/t/TenthDistrictGuard.java b/Mage.Sets/src/mage/cards/t/TenthDistrictGuard.java new file mode 100644 index 00000000000..805039d8043 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TenthDistrictGuard.java @@ -0,0 +1,45 @@ +package mage.cards.t; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author TheElk801 + */ +public final class TenthDistrictGuard extends CardImpl { + + public TenthDistrictGuard(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}"); + + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.SOLDIER); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // When Tenth District Guard enters the battlefield, target creature gets +0/+1 until end of turn. + Ability ability = new EntersBattlefieldTriggeredAbility( + new BoostTargetEffect(0, 1, Duration.EndOfTurn) + ); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public TenthDistrictGuard(final TenthDistrictGuard card) { + super(card); + } + + @Override + public TenthDistrictGuard copy() { + return new TenthDistrictGuard(this); + } +} diff --git a/Mage.Sets/src/mage/cards/t/TezzeretAgentOfBolas.java b/Mage.Sets/src/mage/cards/t/TezzeretAgentOfBolas.java index 13d49cdd6fb..f68b2a94ba0 100644 --- a/Mage.Sets/src/mage/cards/t/TezzeretAgentOfBolas.java +++ b/Mage.Sets/src/mage/cards/t/TezzeretAgentOfBolas.java @@ -4,7 +4,7 @@ package mage.cards.t; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; @@ -43,7 +43,7 @@ public final class TezzeretAgentOfBolas extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.TEZZERET); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3)); // +1: Look at the top five cards of your library. You may reveal an artifact 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 LoyaltyAbility(new LookLibraryAndPickControllerEffect(5, 1, filter, true), 1)); diff --git a/Mage.Sets/src/mage/cards/t/TezzeretArtificeMaster.java b/Mage.Sets/src/mage/cards/t/TezzeretArtificeMaster.java index a1843d84532..472be041766 100644 --- a/Mage.Sets/src/mage/cards/t/TezzeretArtificeMaster.java +++ b/Mage.Sets/src/mage/cards/t/TezzeretArtificeMaster.java @@ -2,7 +2,7 @@ package mage.cards.t; import java.util.UUID; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.condition.common.MetalcraftCondition; import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.effects.common.CreateTokenEffect; @@ -27,7 +27,7 @@ public final class TezzeretArtificeMaster extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.TEZZERET); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(5)); // +1: Create a colorless Thopter artifact creature token with flying. this.addAbility(new LoyaltyAbility(new CreateTokenEffect(new ThopterColorlessToken()), 1)); diff --git a/Mage.Sets/src/mage/cards/t/TezzeretCruelMachinist.java b/Mage.Sets/src/mage/cards/t/TezzeretCruelMachinist.java index 352c1c8c59d..0f1d8ca68a0 100644 --- a/Mage.Sets/src/mage/cards/t/TezzeretCruelMachinist.java +++ b/Mage.Sets/src/mage/cards/t/TezzeretCruelMachinist.java @@ -3,7 +3,7 @@ package mage.cards.t; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; @@ -40,7 +40,7 @@ public final class TezzeretCruelMachinist extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.TEZZERET); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(4)); // +1: Draw a card. this.addAbility(new LoyaltyAbility(new DrawCardSourceControllerEffect(1), 1)); diff --git a/Mage.Sets/src/mage/cards/t/TezzeretMasterOfMetal.java b/Mage.Sets/src/mage/cards/t/TezzeretMasterOfMetal.java index ec7e60985ae..962e8aa48b7 100644 --- a/Mage.Sets/src/mage/cards/t/TezzeretMasterOfMetal.java +++ b/Mage.Sets/src/mage/cards/t/TezzeretMasterOfMetal.java @@ -5,7 +5,7 @@ import java.util.List; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.ContinuousEffectImpl; @@ -43,7 +43,7 @@ public final class TezzeretMasterOfMetal extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.TEZZERET); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(5)); // +1: Reveal cards from the top of your library until you reveal an artifact card. Put that card into your hand and the rest on the bottom of your library in a random order. this.addAbility(new LoyaltyAbility(new RevealCardsFromLibraryUntilEffect(new FilterArtifactCard(), Zone.HAND, Zone.LIBRARY), 1)); diff --git a/Mage.Sets/src/mage/cards/t/TezzeretTheSchemer.java b/Mage.Sets/src/mage/cards/t/TezzeretTheSchemer.java index 980a219d491..89b2794b68e 100644 --- a/Mage.Sets/src/mage/cards/t/TezzeretTheSchemer.java +++ b/Mage.Sets/src/mage/cards/t/TezzeretTheSchemer.java @@ -4,7 +4,7 @@ package mage.cards.t; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; import mage.abilities.dynamicvalue.common.SignInversionDynamicValue; @@ -33,7 +33,7 @@ public final class TezzeretTheSchemer extends CardImpl { this.subtype.add(SubType.TEZZERET); //Starting Loyalty - 5 - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(5)); // +1: Create a colorless artifact token named Etherium Cell which has "{T}, Sacrifice this artifact: Add one mana of any color." this.addAbility(new LoyaltyAbility(new CreateTokenEffect(new EtheriumCellToken()), 1)); diff --git a/Mage.Sets/src/mage/cards/t/TezzeretTheSeeker.java b/Mage.Sets/src/mage/cards/t/TezzeretTheSeeker.java index 274b067721c..c9f2ff0ed66 100644 --- a/Mage.Sets/src/mage/cards/t/TezzeretTheSeeker.java +++ b/Mage.Sets/src/mage/cards/t/TezzeretTheSeeker.java @@ -5,7 +5,7 @@ import java.util.List; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.costs.Cost; import mage.abilities.costs.common.PayVariableLoyaltyCost; import mage.abilities.effects.ContinuousEffectImpl; @@ -35,7 +35,7 @@ public final class TezzeretTheSeeker extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.TEZZERET); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(4)); // +1: Untap up to two target artifacts. LoyaltyAbility ability = new LoyaltyAbility(new UntapTargetEffect(), 1); diff --git a/Mage.Sets/src/mage/cards/t/ThaumaticCompass.java b/Mage.Sets/src/mage/cards/t/ThaumaticCompass.java index b87140dc64f..10635ad04ef 100644 --- a/Mage.Sets/src/mage/cards/t/ThaumaticCompass.java +++ b/Mage.Sets/src/mage/cards/t/ThaumaticCompass.java @@ -2,6 +2,7 @@ package mage.cards.t; import java.util.UUID; + import mage.abilities.Ability; import mage.abilities.TriggeredAbility; import mage.abilities.common.BeginningOfEndStepTriggeredAbility; @@ -15,7 +16,6 @@ import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.s.SpiresOfOrazca; import mage.constants.CardType; import mage.constants.ComparisonType; import mage.constants.TargetController; @@ -25,7 +25,6 @@ import mage.filter.common.FilterLandPermanent; import mage.target.common.TargetCardInLibrary; /** - * * @author TheElk801 */ public final class ThaumaticCompass extends CardImpl { @@ -33,7 +32,7 @@ public final class ThaumaticCompass extends CardImpl { public ThaumaticCompass(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}"); this.transformable = true; - this.secondSideCardClazz = SpiresOfOrazca.class; + this.secondSideCardClazz = mage.cards.s.SpiresOfOrazca.class; // {3}, {T}: Search your library for a basic land card, reveal it, put it into your hand, then shuffle your library. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, diff --git a/Mage.Sets/src/mage/cards/t/TheFallenApart.java b/Mage.Sets/src/mage/cards/t/TheFallenApart.java new file mode 100644 index 00000000000..66f887455ac --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TheFallenApart.java @@ -0,0 +1,186 @@ + +package mage.cards.t; + +import java.util.UUID; +import mage.MageInt; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.common.DealtDamageToSourceTriggeredAbility; +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.RestrictionEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.util.CardUtil; + +/** + * + * @author L_J + */ +public final class TheFallenApart extends CardImpl { + + public TheFallenApart(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}{B}"); + this.subtype.add(SubType.ZOMBIE); + + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // The Fallen Apart enters the battlefield with two arms and two legs. + this.addAbility(new EntersBattlefieldAbility(new TheFallenApartEntersEffect())); + + // Whenever damage is dealt to The Fallen Apart, remove an arm or a leg from it. + this.addAbility(new DealtDamageToSourceTriggeredAbility(Zone.BATTLEFIELD, new TheFallenApartToggleEffect(), false)); + + // The Fallen Apart can’t attack if it has no legs and can’t block if it has no arms. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new TheFallenApartRestrictionEffect())); + } + + public TheFallenApart(final TheFallenApart card) { + super(card); + } + + @Override + public TheFallenApart copy() { + return new TheFallenApart(this); + } +} + +class TheFallenApartEntersEffect extends OneShotEffect { + + public TheFallenApartEntersEffect() { + super(Outcome.Neutral); + staticText = "with two arms and two legs"; + } + + public TheFallenApartEntersEffect(final TheFallenApartEntersEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + MageObject mageObject = game.getPermanentEntering(source.getSourceId()); + if (mageObject == null) { + mageObject = game.getObject(source.getSourceId()); + } + if (mageObject != null) { + game.getState().setValue(mageObject.getId() + "_arms", 2); + game.getState().setValue(mageObject.getId() + "_legs", 2); + if (mageObject instanceof Permanent) { + ((Permanent) mageObject).addInfo("armslegs", CardUtil.addToolTipMarkTags("Arms: 2, Legs: 2"), game); + } + return true; + } + return false; + } + + @Override + public TheFallenApartEntersEffect copy() { + return new TheFallenApartEntersEffect(this); + } +} + +class TheFallenApartToggleEffect extends OneShotEffect { + + public TheFallenApartToggleEffect() { + super(Outcome.Neutral); + staticText = "remove an arm or a leg from it"; + } + + public TheFallenApartToggleEffect(final TheFallenApartToggleEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + MageObject mageObject = game.getObject(source.getSourceId()); + if (controller != null && mageObject != null) { + if (game.getState().getValue(mageObject.getId() + "_arms") == null + || game.getState().getValue(mageObject.getId() + "_legs") == null) { + return false; + } + int arms = (Integer) game.getState().getValue(mageObject.getId() + "_arms"); + int legs = (Integer) game.getState().getValue(mageObject.getId() + "_legs"); + if (arms > 0) { + if (legs > 0) { + if (controller.chooseUse(Outcome.Detriment, "Remove an arm or a leg:", + source.getSourceObject(game).getLogName(), "Arm", "Leg", source, game)) { + arms -= 1; + game.informPlayers(mageObject.getLogName() + " loses an arm"); + } else { + legs -= 1; + game.informPlayers(mageObject.getLogName() + " loses a leg"); + } + } else { + arms -= 1; + game.informPlayers(mageObject.getLogName() + " loses an arm"); + } + } else { + if (legs > 0) { + legs -= 1; + game.informPlayers(mageObject.getLogName() + " loses a leg"); + } + } + game.getState().setValue(mageObject.getId() + "_arms", arms); + game.getState().setValue(mageObject.getId() + "_legs", legs); + ((Permanent) mageObject).addInfo("armslegs", CardUtil.addToolTipMarkTags("Arms: " + arms + ", Legs: " + legs), game); + return true; + } + return false; + } + + @Override + public TheFallenApartToggleEffect copy() { + return new TheFallenApartToggleEffect(this); + } +} + +class TheFallenApartRestrictionEffect extends RestrictionEffect { + + public TheFallenApartRestrictionEffect() { + super(Duration.WhileOnBattlefield); + staticText = "{this} can’t attack if it has no legs and can’t block if it has no arms"; + } + + public TheFallenApartRestrictionEffect(final TheFallenApartRestrictionEffect effect) { + super(effect); + } + + @Override + public boolean applies(Permanent permanent, Ability source, Game game) { + return permanent.getId().equals(source.getSourceId()); + } + + @Override + public boolean canBlock(Permanent attacker, Permanent blocker, Ability source, Game game) { + MageObject mageObject = game.getObject(source.getSourceId()); + if (mageObject != null) { + return (Integer) game.getState().getValue(mageObject.getId() + "_arms") > 0; + } + return false; + } + + @Override + public boolean canAttack(Permanent attacker, UUID defenderId, Ability source, Game game) { + MageObject mageObject = game.getObject(source.getSourceId()); + if (mageObject != null) { + return (Integer) game.getState().getValue(mageObject.getId() + "_legs") > 0; + } + return false; + } + + @Override + public TheFallenApartRestrictionEffect copy() { + return new TheFallenApartRestrictionEffect(this); + } +} diff --git a/Mage.Sets/src/mage/cards/t/ThiefOfSanity.java b/Mage.Sets/src/mage/cards/t/ThiefOfSanity.java new file mode 100644 index 00000000000..f0db706fc49 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/ThiefOfSanity.java @@ -0,0 +1,260 @@ +package mage.cards.t; + +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.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.AsThoughEffectImpl; +import mage.abilities.effects.AsThoughManaEffect; +import mage.abilities.effects.ContinuousEffect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.Cards; +import mage.cards.CardsImpl; +import mage.constants.AsThoughEffectType; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.ManaType; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.game.ExileZone; +import mage.game.Game; +import mage.players.ManaPoolItem; +import mage.players.Player; +import mage.target.TargetCard; +import mage.target.targetpointer.FixedTarget; +import mage.util.CardUtil; + +/** + * + * @author LevelX2 + */ +public final class ThiefOfSanity extends CardImpl { + + protected static final String VALUE_PREFIX = "ExileZones"; + + public ThiefOfSanity(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}{B}"); + + this.subtype.add(SubType.SPECTER); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Whenever Thief of Sanity deals combat damage to a player, look at the top three cards of that player's library, exile one of them face down, then put the rest into their graveyard. For as long as that card remains exiled, you may look at it, you may cast it, and you may spend mana as though it were mana of any type to cast it. + this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new ThiefOfSanityEffect(), false, true)); + + Ability ability = new SimpleStaticAbility(Zone.ALL, new ThiefOfSanityLookEffect()); + ability.setRuleVisible(false); + this.addAbility(ability); + } + + public ThiefOfSanity(final ThiefOfSanity card) { + super(card); + } + + @Override + public ThiefOfSanity copy() { + return new ThiefOfSanity(this); + } +} + +class ThiefOfSanityEffect extends OneShotEffect { + + public ThiefOfSanityEffect() { + super(Outcome.Benefit); + this.staticText = "look at the top three cards of that player's library, exile one of them face down, then put the rest into their graveyard. For as long as that card remains exiled, you may look at it, you may cast it, and you may spend mana as though it were mana of any type to cast it"; + } + + public ThiefOfSanityEffect(final ThiefOfSanityEffect effect) { + super(effect); + } + + @Override + public ThiefOfSanityEffect copy() { + return new ThiefOfSanityEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + Player damagedPlayer = game.getPlayer(getTargetPointer().getFirst(game, source)); + MageObject sourceObject = source.getSourceObject(game); + if (controller != null && damagedPlayer != null && sourceObject != null) { + Cards topCards = new CardsImpl(); + topCards.addAll(damagedPlayer.getLibrary().getTopCards(game, 3)); + TargetCard target = new TargetCard(Zone.LIBRARY, new FilterCard("card to exile face down")); + if (controller.choose(outcome, topCards, target, game)) { + Card card = game.getCard(target.getFirstTarget()); + if (card != null) { + topCards.remove(card); + // move card to exile + UUID exileZoneId = CardUtil.getExileZoneId(game, source.getSourceId(), source.getSourceObjectZoneChangeCounter()); + card.setFaceDown(true, game); + if (controller.moveCardsToExile(card, source, game, false, exileZoneId, sourceObject.getIdName())) { + card.setFaceDown(true, game); + Set exileZones = (Set) game.getState().getValue(ThiefOfSanity.VALUE_PREFIX + source.getSourceId().toString()); + if (exileZones == null) { + exileZones = new HashSet<>(); + game.getState().setValue(ThiefOfSanity.VALUE_PREFIX + source.getSourceId().toString(), exileZones); + } + exileZones.add(exileZoneId); + // allow to cast the card + ContinuousEffect effect = new ThiefOfSanityCastFromExileEffect(); + effect.setTargetPointer(new FixedTarget(card.getId(), game)); + game.addEffect(effect, source); + // and you may spend mana as though it were mana of any color to cast it + effect = new ThiefOfSanitySpendAnyManaEffect(); + effect.setTargetPointer(new FixedTarget(card.getId(), game)); + game.addEffect(effect, source); + } + } + } + // put the rest into their graveyard + controller.moveCards(topCards, Zone.GRAVEYARD, source, game); + return true; + } + + return false; + } +} + +class ThiefOfSanityCastFromExileEffect extends AsThoughEffectImpl { + + public ThiefOfSanityCastFromExileEffect() { + super(AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, Duration.Custom, Outcome.Benefit); + staticText = "You may cast that card for as long as it remains exiled, and you may spend mana as though it were mana of any color to cast that spell"; + } + + public ThiefOfSanityCastFromExileEffect(final ThiefOfSanityCastFromExileEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public ThiefOfSanityCastFromExileEffect copy() { + return new ThiefOfSanityCastFromExileEffect(this); + } + + @Override + public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) { + UUID targetId = getTargetPointer().getFirst(game, source); + if (targetId == null) { + this.discard(); + } else if (objectId.equals(targetId) + && affectedControllerId.equals(source.getControllerId())) { + Card card = game.getCard(objectId); + // TODO: Allow to cast Zoetic Cavern face down + return card != null && !card.isLand(); + } + return false; + } +} + +class ThiefOfSanitySpendAnyManaEffect extends AsThoughEffectImpl implements AsThoughManaEffect { + + public ThiefOfSanitySpendAnyManaEffect() { + super(AsThoughEffectType.SPEND_OTHER_MANA, Duration.Custom, Outcome.Benefit); + staticText = "you may spend mana as though it were mana of any color to cast it"; + } + + public ThiefOfSanitySpendAnyManaEffect(final ThiefOfSanitySpendAnyManaEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public ThiefOfSanitySpendAnyManaEffect copy() { + return new ThiefOfSanitySpendAnyManaEffect(this); + } + + @Override + public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) { + if (objectId.equals(((FixedTarget) getTargetPointer()).getTarget()) + && game.getState().getZoneChangeCounter(objectId) <= ((FixedTarget) getTargetPointer()).getZoneChangeCounter() + 1) { + + if (affectedControllerId.equals(source.getControllerId())) { + // if the card moved from exile to spell the zone change counter is increased by 1 + if (game.getState().getZoneChangeCounter(objectId) == ((FixedTarget) getTargetPointer()).getZoneChangeCounter() + 1) { + return true; + } + } + + } else if (((FixedTarget) getTargetPointer()).getTarget().equals(objectId)) { + // object has moved zone so effect can be discarted + this.discard(); + } + return false; + } + + @Override + public ManaType getAsThoughManaType(ManaType manaType, ManaPoolItem mana, UUID affectedControllerId, Ability source, Game game) { + return mana.getFirstAvailable(); + } +} + +class ThiefOfSanityLookEffect extends AsThoughEffectImpl { + + public ThiefOfSanityLookEffect() { + super(AsThoughEffectType.LOOK_AT_FACE_DOWN, Duration.EndOfGame, Outcome.Benefit); + staticText = "You may look at the cards exiled with {this}"; + } + + public ThiefOfSanityLookEffect(final ThiefOfSanityLookEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public ThiefOfSanityLookEffect copy() { + return new ThiefOfSanityLookEffect(this); + } + + @Override + public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) { + if (affectedControllerId.equals(source.getControllerId()) && game.getState().getZone(objectId) == Zone.EXILED) { + Player controller = game.getPlayer(source.getControllerId()); + MageObject sourceObject = source.getSourceObject(game); + if (controller != null && sourceObject != null) { + Card card = game.getCard(objectId); + if (card != null && card.isFaceDown(game)) { + Set exileZones = (Set) game.getState().getValue(ThiefOfSanity.VALUE_PREFIX + source.getSourceId().toString()); + if (exileZones != null) { + for (ExileZone exileZone : game.getExile().getExileZones()) { + if (exileZone.contains(objectId)) { + if (!exileZones.contains(exileZone.getId())) { + return false; + } + } + } + return true; + } + } + } + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/t/ThingInTheIce.java b/Mage.Sets/src/mage/cards/t/ThingInTheIce.java index ef09626c5d9..d6b018e765f 100644 --- a/Mage.Sets/src/mage/cards/t/ThingInTheIce.java +++ b/Mage.Sets/src/mage/cards/t/ThingInTheIce.java @@ -2,6 +2,7 @@ package mage.cards.t; import java.util.UUID; + import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldAbility; @@ -16,7 +17,6 @@ import mage.abilities.keyword.DefenderAbility; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.a.AwokenHorror; import mage.constants.CardType; import mage.constants.SubType; import mage.counters.CounterType; @@ -25,7 +25,6 @@ import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.CardTypePredicate; /** - * * @author fireshoes */ public final class ThingInTheIce extends CardImpl { @@ -39,13 +38,13 @@ public final class ThingInTheIce extends CardImpl { } public ThingInTheIce(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}"); this.subtype.add(SubType.HORROR); this.power = new MageInt(0); this.toughness = new MageInt(4); this.transformable = true; - this.secondSideCardClazz = AwokenHorror.class; + this.secondSideCardClazz = mage.cards.a.AwokenHorror.class; // Defender this.addAbility(DefenderAbility.getInstance()); diff --git a/Mage.Sets/src/mage/cards/t/Thoughtseize.java b/Mage.Sets/src/mage/cards/t/Thoughtseize.java index c4d449f2fcd..3d78bf76be3 100644 --- a/Mage.Sets/src/mage/cards/t/Thoughtseize.java +++ b/Mage.Sets/src/mage/cards/t/Thoughtseize.java @@ -1,4 +1,3 @@ - package mage.cards.t; import java.util.UUID; @@ -8,9 +7,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.TargetController; -import mage.filter.FilterCard; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.StaticFilters; import mage.target.TargetPlayer; /** @@ -19,19 +16,12 @@ import mage.target.TargetPlayer; */ public final class Thoughtseize extends CardImpl { - private static final FilterCard filter = new FilterCard("nonland card"); - - static { - filter.add(Predicates.not(new CardTypePredicate(CardType.LAND))); - } - public Thoughtseize(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{B}"); - + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{B}"); // Target player reveals their hand. You choose a nonland card from it. That player discards that card. You lose 2 life. this.getSpellAbility().addTarget(new TargetPlayer()); - this.getSpellAbility().addEffect(new DiscardCardYouChooseTargetEffect(filter, TargetController.ANY)); + this.getSpellAbility().addEffect(new DiscardCardYouChooseTargetEffect(StaticFilters.FILTER_CARD_NON_LAND, TargetController.ANY)); this.getSpellAbility().addEffect(new LoseLifeSourceControllerEffect(2)); } @@ -44,4 +34,3 @@ public final class Thoughtseize extends CardImpl { return new Thoughtseize(this); } } - diff --git a/Mage.Sets/src/mage/cards/t/ThousandleggedKami.java b/Mage.Sets/src/mage/cards/t/ThousandLeggedKami.java similarity index 58% rename from Mage.Sets/src/mage/cards/t/ThousandleggedKami.java rename to Mage.Sets/src/mage/cards/t/ThousandLeggedKami.java index 2d3e3b1c8fc..adeca1a8e9a 100644 --- a/Mage.Sets/src/mage/cards/t/ThousandleggedKami.java +++ b/Mage.Sets/src/mage/cards/t/ThousandLeggedKami.java @@ -3,6 +3,7 @@ package mage.cards.t; import java.util.UUID; + import mage.MageInt; import mage.abilities.keyword.SoulshiftAbility; import mage.cards.CardImpl; @@ -13,10 +14,10 @@ import mage.constants.SubType; /** * @author Loki */ -public final class ThousandleggedKami extends CardImpl { +public final class ThousandLeggedKami extends CardImpl { - public ThousandleggedKami(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{6}{G}{G}"); + public ThousandLeggedKami(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{6}{G}{G}"); this.subtype.add(SubType.SPIRIT); this.power = new MageInt(6); @@ -24,13 +25,13 @@ public final class ThousandleggedKami extends CardImpl { this.addAbility(new SoulshiftAbility(7)); } - public ThousandleggedKami(final ThousandleggedKami card) { + public ThousandLeggedKami(final ThousandLeggedKami card) { super(card); } @Override - public ThousandleggedKami copy() { - return new ThousandleggedKami(this); + public ThousandLeggedKami copy() { + return new ThousandLeggedKami(this); } } diff --git a/Mage.Sets/src/mage/cards/t/ThousandYearStorm.java b/Mage.Sets/src/mage/cards/t/ThousandYearStorm.java new file mode 100644 index 00000000000..83c624009a2 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/ThousandYearStorm.java @@ -0,0 +1,124 @@ +package mage.cards.t; + +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.WatcherScope; +import mage.filter.common.FilterInstantOrSorcerySpell; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.stack.Spell; +import mage.watchers.Watcher; + +/** + * + * @author LevelX2 + */ +public final class ThousandYearStorm extends CardImpl { + + public ThousandYearStorm(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{4}{U}{R}"); + + // Whenever you cast an instant or sorcery spell, copy it for each other instant and sorcery spell you've cast before it this turn. You may choose new targets for the copies. + this.addAbility(new SpellCastControllerTriggeredAbility( + new ThousandYearStormEffect(), new FilterInstantOrSorcerySpell(), false, true + ), new ThousandYearWatcher()); + } + + public ThousandYearStorm(final ThousandYearStorm card) { + super(card); + } + + @Override + public ThousandYearStorm copy() { + return new ThousandYearStorm(this); + } +} + +class ThousandYearStormEffect extends OneShotEffect { + + public ThousandYearStormEffect() { + super(Outcome.Benefit); + this.staticText = "copy it for each other instant and sorcery spell you've cast before it this turn. You may choose new targets for the copies"; + } + + public ThousandYearStormEffect(final ThousandYearStormEffect effect) { + super(effect); + } + + @Override + public ThousandYearStormEffect copy() { + return new ThousandYearStormEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Spell spell = game.getSpellOrLKIStack(getTargetPointer().getFirst(game, source)); + if (spell != null) { + ThousandYearWatcher watcher = (ThousandYearWatcher) game.getState().getWatchers().get(ThousandYearWatcher.class.getSimpleName()); + if (watcher != null) { + int numberOfCopies = watcher.getAmountOfSpellsPlayerCastOnCurrentTurn(source.getControllerId()) - 1; + if (numberOfCopies > 0) { + for (int i = 0; i < numberOfCopies; i++) { + spell.createCopyOnStack(game, source, source.getControllerId(), true); + } + } + return true; + } + } + return false; + } +} + +class ThousandYearWatcher extends Watcher { + + private final Map amountOfInstantSorcerySpellsCastOnCurrentTurn = new HashMap<>(); + + public ThousandYearWatcher() { + super(ThousandYearWatcher.class.getSimpleName(), WatcherScope.GAME); + } + + public ThousandYearWatcher(final ThousandYearWatcher watcher) { + super(watcher); + for (Entry entry : watcher.amountOfInstantSorcerySpellsCastOnCurrentTurn.entrySet()) { + amountOfInstantSorcerySpellsCastOnCurrentTurn.put(entry.getKey(), entry.getValue()); + } + } + + @Override + public void watch(GameEvent event, Game game) { + if (event.getType() == GameEvent.EventType.SPELL_CAST) { + Spell spell = game.getSpellOrLKIStack(event.getTargetId()); + if (spell != null && spell.isInstantOrSorcery()) { + UUID playerId = event.getPlayerId(); + if (playerId != null) { + amountOfInstantSorcerySpellsCastOnCurrentTurn.putIfAbsent(playerId, 0); + amountOfInstantSorcerySpellsCastOnCurrentTurn.compute(playerId, (k, a) -> a + 1); + } + } + } + } + + @Override + public void reset() { + amountOfInstantSorcerySpellsCastOnCurrentTurn.clear(); + } + + public int getAmountOfSpellsPlayerCastOnCurrentTurn(UUID playerId) { + return amountOfInstantSorcerySpellsCastOnCurrentTurn.getOrDefault(playerId, 0); + } + + @Override + public ThousandYearWatcher copy() { + return new ThousandYearWatcher(this); + } + +} diff --git a/Mage.Sets/src/mage/cards/t/ThrabenGargoyle.java b/Mage.Sets/src/mage/cards/t/ThrabenGargoyle.java index 50a632e7565..199eb7f3c2f 100644 --- a/Mage.Sets/src/mage/cards/t/ThrabenGargoyle.java +++ b/Mage.Sets/src/mage/cards/t/ThrabenGargoyle.java @@ -2,6 +2,7 @@ package mage.cards.t; import java.util.UUID; + import mage.MageInt; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.GenericManaCost; @@ -10,25 +11,23 @@ import mage.abilities.keyword.DefenderAbility; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.s.StonewingAntagonizer; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Zone; /** - * * @author fireshoes */ public final class ThrabenGargoyle extends CardImpl { public ThrabenGargoyle(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT,CardType.CREATURE},"{1}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{1}"); this.subtype.add(SubType.GARGOYLE); this.power = new MageInt(2); this.toughness = new MageInt(2); this.transformable = true; - this.secondSideCardClazz = StonewingAntagonizer.class; + this.secondSideCardClazz = mage.cards.s.StonewingAntagonizer.class; // Defender this.addAbility(DefenderAbility.getInstance()); diff --git a/Mage.Sets/src/mage/cards/t/TibaltTheFiendBlooded.java b/Mage.Sets/src/mage/cards/t/TibaltTheFiendBlooded.java index 326cd9c8875..a83deed0d49 100644 --- a/Mage.Sets/src/mage/cards/t/TibaltTheFiendBlooded.java +++ b/Mage.Sets/src/mage/cards/t/TibaltTheFiendBlooded.java @@ -5,7 +5,7 @@ import java.util.List; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.dynamicvalue.common.CardsInTargetHandCount; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.ContinuousEffectImpl; @@ -44,7 +44,7 @@ public final class TibaltTheFiendBlooded extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.TIBALT); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(2)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(2)); // +1: Draw a card, then discard a card at random. LoyaltyAbility ability = new LoyaltyAbility(new DrawCardSourceControllerEffect(1), 1); diff --git a/Mage.Sets/src/mage/cards/t/TitanicPelagosaur.java b/Mage.Sets/src/mage/cards/t/TitanicPelagosaur.java new file mode 100644 index 00000000000..221dfc89455 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TitanicPelagosaur.java @@ -0,0 +1,32 @@ +package mage.cards.t; + +import mage.MageInt; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; + +import java.util.UUID; + +/** + * @author JayDi85 + */ +public final class TitanicPelagosaur extends CardImpl { + + public TitanicPelagosaur(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}{U}"); + this.subtype.add(SubType.DINOSAUR); + + this.power = new MageInt(4); + this.toughness = new MageInt(6); + } + + public TitanicPelagosaur(final TitanicPelagosaur card) { + super(card); + } + + @Override + public TitanicPelagosaur copy() { + return new TitanicPelagosaur(this); + } +} diff --git a/Mage.Sets/src/mage/cards/t/Togglodyte.java b/Mage.Sets/src/mage/cards/t/Togglodyte.java new file mode 100644 index 00000000000..ff3df93bd94 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/Togglodyte.java @@ -0,0 +1,199 @@ + +package mage.cards.t; + +import java.util.UUID; +import mage.MageInt; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.common.SpellCastAllTriggeredAbility; +import mage.abilities.condition.Condition; +import mage.abilities.decorator.ConditionalReplacementEffect; +import mage.abilities.decorator.ConditionalRestrictionEffect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.PreventionEffectImpl; +import mage.abilities.effects.RestrictionEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.util.CardUtil; + +/** + * + * @author L_J + */ +public final class Togglodyte extends CardImpl { + + public Togglodyte(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{3}"); + this.subtype.add(SubType.GOLEM); + + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Togglodyte enters the battlefield turned on. + this.addAbility(new EntersBattlefieldAbility(new TogglodyteEntersEffect())); + + // Whenever a player casts a spell, toggle Togglodyte’s ON/OFF switch. + this.addAbility(new SpellCastAllTriggeredAbility(new TogglodyteToggleEffect(), false)); + + // As long as Togglodyte is turned off, it can’t attack or block, and prevent all damage it would deal. + Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new ConditionalRestrictionEffect(new TogglodyteRestrictionEffect(), new TogglodyteCondition())); + ability.addEffect(new ConditionalReplacementEffect(new TogglodytePreventionEffect(), new TogglodyteCondition())); + this.addAbility(ability); + } + + public Togglodyte(final Togglodyte card) { + super(card); + } + + @Override + public Togglodyte copy() { + return new Togglodyte(this); + } +} + +class TogglodyteEntersEffect extends OneShotEffect { + + public TogglodyteEntersEffect() { + super(Outcome.Neutral); + staticText = "turned on"; + } + + public TogglodyteEntersEffect(final TogglodyteEntersEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + MageObject mageObject = game.getPermanentEntering(source.getSourceId()); + if (mageObject == null) { + mageObject = game.getObject(source.getSourceId()); + } + if (mageObject != null) { + boolean toggled = true; + game.getState().setValue(mageObject.getId() + "_toggle", toggled); + if (mageObject instanceof Permanent) { + ((Permanent) mageObject).addInfo("toggle", CardUtil.addToolTipMarkTags("Switch: " + (toggled ? "ON" : "OFF")), game); + } + return true; + } + return false; + } + + @Override + public TogglodyteEntersEffect copy() { + return new TogglodyteEntersEffect(this); + } +} + +class TogglodyteToggleEffect extends OneShotEffect { + + public TogglodyteToggleEffect() { + super(Outcome.Neutral); + staticText = "toggle {this}’s ON/OFF switch"; + } + + public TogglodyteToggleEffect(final TogglodyteToggleEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + MageObject mageObject = game.getObject(source.getSourceId()); + if (mageObject != null) { + if (game.getState().getValue(mageObject.getId() + "_toggle") == null) { + return false; + } + boolean toggled = (Boolean) game.getState().getValue(mageObject.getId() + "_toggle"); + game.getState().setValue(mageObject.getId() + "_toggle", !toggled); + ((Permanent) mageObject).addInfo("toggle", CardUtil.addToolTipMarkTags("Switch: " + (!toggled ? "ON" : "OFF")), game); + return true; + } + return false; + } + + @Override + public TogglodyteToggleEffect copy() { + return new TogglodyteToggleEffect(this); + } +} + +class TogglodyteRestrictionEffect extends RestrictionEffect { + + public TogglodyteRestrictionEffect() { + super(Duration.WhileOnBattlefield); + staticText = ""; + } + + public TogglodyteRestrictionEffect(final TogglodyteRestrictionEffect effect) { + super(effect); + } + + @Override + public boolean applies(Permanent permanent, Ability source, Game game) { + return permanent.getId().equals(source.getSourceId()); + } + + @Override + public boolean canBlock(Permanent attacker, Permanent blocker, Ability source, Game game) { + return false; + } + + @Override + public boolean canAttack(Game game) { + return false; + } + + @Override + public TogglodyteRestrictionEffect copy() { + return new TogglodyteRestrictionEffect(this); + } +} + +class TogglodytePreventionEffect extends PreventionEffectImpl { + + public TogglodytePreventionEffect() { + super(Duration.WhileOnBattlefield, Integer.MAX_VALUE, false); + staticText = "As long as {this} is turned off, it can’t attack or block, and prevent all damage it would deal"; + } + + public TogglodytePreventionEffect(final TogglodytePreventionEffect effect) { + super(effect); + } + + @Override + public TogglodytePreventionEffect copy() { + return new TogglodytePreventionEffect(this); + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + if (super.applies(event, source, game)) { + if (event.getSourceId().equals(source.getSourceId())) { + return true; + } + } + return false; + } +} + +class TogglodyteCondition implements Condition { + + @Override + public boolean apply(Game game, Ability source) { + MageObject mageObject = game.getObject(source.getSourceId()); + if (mageObject != null && game.getState().getValue(mageObject.getId() + "_toggle") != null) { + return !((Boolean) game.getState().getValue(mageObject.getId() + "_toggle")); + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/t/TorchCourier.java b/Mage.Sets/src/mage/cards/t/TorchCourier.java new file mode 100644 index 00000000000..24566bcde9e --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TorchCourier.java @@ -0,0 +1,62 @@ +package mage.cards.t; + +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.GainAbilityTargetEffect; +import mage.constants.SubType; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.AnotherPredicate; +import mage.target.TargetPermanent; + +/** + * + * @author TheElk801 + */ +public final class TorchCourier extends CardImpl { + + private static final FilterPermanent filter + = new FilterCreaturePermanent("another target creature"); + + static { + filter.add(new AnotherPredicate()); + } + + public TorchCourier(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{R}"); + + this.subtype.add(SubType.GOBLIN); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // Haste + this.addAbility(HasteAbility.getInstance()); + + // Sacrifice Torch Courier: Another target creature gains haste until end of turn. + Ability ability = new SimpleActivatedAbility( + new GainAbilityTargetEffect( + HasteAbility.getInstance(), + Duration.EndOfTurn + ), new SacrificeSourceCost() + ); + ability.addTarget(new TargetPermanent(filter)); + this.addAbility(ability); + } + + public TorchCourier(final TorchCourier card) { + super(card); + } + + @Override + public TorchCourier copy() { + return new TorchCourier(this); + } +} diff --git a/Mage.Sets/src/mage/cards/t/TormentedPariah.java b/Mage.Sets/src/mage/cards/t/TormentedPariah.java index 2dbaaaac84f..468086a78b7 100644 --- a/Mage.Sets/src/mage/cards/t/TormentedPariah.java +++ b/Mage.Sets/src/mage/cards/t/TormentedPariah.java @@ -2,6 +2,7 @@ package mage.cards.t; import java.util.UUID; + import mage.MageInt; import mage.abilities.TriggeredAbility; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; @@ -11,7 +12,6 @@ import mage.abilities.effects.common.TransformSourceEffect; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.r.RampagingWerewolf; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.TargetController; @@ -22,13 +22,13 @@ import mage.constants.TargetController; public final class TormentedPariah extends CardImpl { public TormentedPariah(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.WARRIOR); this.subtype.add(SubType.WEREWOLF); this.transformable = true; - this.secondSideCardClazz = RampagingWerewolf.class; + this.secondSideCardClazz = mage.cards.r.RampagingWerewolf.class; this.power = new MageInt(3); this.toughness = new MageInt(2); diff --git a/Mage.Sets/src/mage/cards/t/TownGossipmonger.java b/Mage.Sets/src/mage/cards/t/TownGossipmonger.java index a3f21528932..8d535460720 100644 --- a/Mage.Sets/src/mage/cards/t/TownGossipmonger.java +++ b/Mage.Sets/src/mage/cards/t/TownGossipmonger.java @@ -2,6 +2,7 @@ package mage.cards.t; import java.util.UUID; + import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -11,7 +12,6 @@ import mage.abilities.effects.common.TransformSourceEffect; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.i.IncitedRabble; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Zone; @@ -21,11 +21,10 @@ import mage.filter.predicate.permanent.TappedPredicate; import mage.target.common.TargetControlledCreaturePermanent; /** - * * @author escplan9 (Derek Monturo - dmontur1 at gmail dot com) */ public final class TownGossipmonger extends CardImpl { - + private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("untapped creature you control"); static { @@ -33,19 +32,19 @@ public final class TownGossipmonger extends CardImpl { } public TownGossipmonger(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{W}"); this.subtype.add(SubType.HUMAN); this.power = new MageInt(1); this.toughness = new MageInt(1); - + this.transformable = true; - this.secondSideCardClazz = IncitedRabble.class; + this.secondSideCardClazz = mage.cards.i.IncitedRabble.class; // {T}, Tap an untapped creature you control: Transform Town Gossipmonger. this.addAbility(new TransformAbility()); Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new TransformSourceEffect(true), new TapSourceCost()); ability.addCost(new TapTargetCost(new TargetControlledCreaturePermanent(1, 1, filter, true))); - this.addAbility(ability); + this.addAbility(ability); } public TownGossipmonger(final TownGossipmonger card) { @@ -56,4 +55,4 @@ public final class TownGossipmonger extends CardImpl { public TownGossipmonger copy() { return new TownGossipmonger(this); } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/t/TreetopWarden.java b/Mage.Sets/src/mage/cards/t/TreetopWarden.java new file mode 100644 index 00000000000..2b4b7d2b304 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TreetopWarden.java @@ -0,0 +1,32 @@ +package mage.cards.t; + +import mage.MageInt; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; + +import java.util.UUID; + +/** + * @author JayDi85 + */ +public final class TreetopWarden extends CardImpl { + + public TreetopWarden(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}"); + this.subtype.add(SubType.ELF, SubType.WARRIOR); + + this.power = new MageInt(2); + this.toughness = new MageInt(2); + } + + public TreetopWarden(final TreetopWarden card) { + super(card); + } + + @Override + public TreetopWarden copy() { + return new TreetopWarden(this); + } +} diff --git a/Mage.Sets/src/mage/cards/u/UginTheSpiritDragon.java b/Mage.Sets/src/mage/cards/u/UginTheSpiritDragon.java index 483e29f07ca..d508d489b39 100644 --- a/Mage.Sets/src/mage/cards/u/UginTheSpiritDragon.java +++ b/Mage.Sets/src/mage/cards/u/UginTheSpiritDragon.java @@ -6,7 +6,7 @@ import java.util.Set; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.costs.Cost; import mage.abilities.costs.common.PayVariableLoyaltyCost; import mage.abilities.effects.OneShotEffect; @@ -42,7 +42,7 @@ public final class UginTheSpiritDragon extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.UGIN); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(7)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(7)); // +2: Ugin, the Spirit Dragon deals 3 damage to any target. LoyaltyAbility ability = new LoyaltyAbility(new DamageTargetEffect(3), 2); diff --git a/Mage.Sets/src/mage/cards/u/UktabiKong.java b/Mage.Sets/src/mage/cards/u/UktabiKong.java new file mode 100644 index 00000000000..d3e92b6b972 --- /dev/null +++ b/Mage.Sets/src/mage/cards/u/UktabiKong.java @@ -0,0 +1,62 @@ + +package mage.cards.u; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapTargetCost; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.DestroyAllEffect; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.game.permanent.token.UktabiKongApeToken; +import mage.filter.common.FilterArtifactPermanent; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.filter.predicate.permanent.TappedPredicate; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author LoneFox + */ +public final class UktabiKong extends CardImpl { + + private static final FilterControlledPermanent filter = new FilterControlledPermanent("untapped Apes you control"); + + static { + filter.add(Predicates.not(new TappedPredicate())); + filter.add(new SubtypePredicate(SubType.APE)); + } + + public UktabiKong(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{5}{G}{G}{G}"); + this.subtype.add(SubType.APE); + this.power = new MageInt(8); + this.toughness = new MageInt(8); + + // Trample + this.addAbility(TrampleAbility.getInstance()); + + // When Uktabi Kong enters the battlefield, destroy all artifacts. + this.addAbility(new EntersBattlefieldTriggeredAbility(new DestroyAllEffect(new FilterArtifactPermanent("artifacts")), false)); + + // Tap two untapped Apes you control: Create a 1/1 green Ape creature token. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new UktabiKongApeToken()), new TapTargetCost(new TargetControlledPermanent(2, 2, filter, true)))); + } + + public UktabiKong(final UktabiKong card) { + super(card); + } + + @Override + public UktabiKong copy() { + return new UktabiKong(this); + } +} diff --git a/Mage.Sets/src/mage/cards/u/UnclaimedTerritory.java b/Mage.Sets/src/mage/cards/u/UnclaimedTerritory.java index bc26083105e..9b3cd9cc205 100644 --- a/Mage.Sets/src/mage/cards/u/UnclaimedTerritory.java +++ b/Mage.Sets/src/mage/cards/u/UnclaimedTerritory.java @@ -57,7 +57,7 @@ class UnclaimedTerritoryManaBuilder extends ConditionalManaBuilder { @Override public ConditionalManaBuilder setMana(Mana mana, Ability source, Game game) { - SubType subType = ChooseCreatureTypeEffect.getChoosenCreatureType(source.getSourceId(), game); + SubType subType = ChooseCreatureTypeEffect.getChosenCreatureType(source.getSourceId(), game); if (subType != null) { creatureType = subType; } diff --git a/Mage.Sets/src/mage/cards/u/UndercityNecrolisk.java b/Mage.Sets/src/mage/cards/u/UndercityNecrolisk.java new file mode 100644 index 00000000000..f1adb8461a8 --- /dev/null +++ b/Mage.Sets/src/mage/cards/u/UndercityNecrolisk.java @@ -0,0 +1,69 @@ +package mage.cards.u; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.ActivateAsSorceryActivatedAbility; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.keyword.MenaceAbility; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.permanent.AnotherPredicate; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author TheElk801 + */ +public final class UndercityNecrolisk extends CardImpl { + + private static final FilterControlledPermanent filter + = new FilterControlledCreaturePermanent("another creature"); + + static { + filter.add(new AnotherPredicate()); + } + + public UndercityNecrolisk(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}"); + + this.subtype.add(SubType.ZOMBIE); + this.subtype.add(SubType.LIZARD); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // {1}, Sacrifice another creature: Put a +1/+1 counter on Undercity Necrolisk. It gains menace until end of turn. Activate this ability only any time you could cast a sorcery. + Ability ability = new ActivateAsSorceryActivatedAbility( + Zone.BATTLEFIELD, + new AddCountersSourceEffect(CounterType.P1P1.createInstance()), + new GenericManaCost(1) + ); + ability.addEffect(new GainAbilitySourceEffect( + new MenaceAbility(), + Duration.EndOfTurn + ).setText("It gains menace until end of turn.")); + ability.addCost(new SacrificeTargetCost( + new TargetControlledPermanent(filter) + )); + this.addAbility(ability); + } + + public UndercityNecrolisk(final UndercityNecrolisk card) { + super(card); + } + + @Override + public UndercityNecrolisk copy() { + return new UndercityNecrolisk(this); + } +} diff --git a/Mage.Sets/src/mage/cards/u/UndercityUprising.java b/Mage.Sets/src/mage/cards/u/UndercityUprising.java index 86eb2368340..da820f372b8 100644 --- a/Mage.Sets/src/mage/cards/u/UndercityUprising.java +++ b/Mage.Sets/src/mage/cards/u/UndercityUprising.java @@ -31,12 +31,13 @@ public final class UndercityUprising extends CardImpl { public UndercityUprising(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{B}{G}"); - // Creatures you control gain deathtouch until end of turn. Target creature you control fights target creature you don't control. + // Creatures you control gain deathtouch until end of turn. Then target creature you control fights target creature you don't control. this.getSpellAbility().addEffect(new GainAbilityControlledEffect( DeathtouchAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_CONTROLLED_CREATURES )); - this.getSpellAbility().addEffect(new FightTargetsEffect()); + this.getSpellAbility().addEffect(new FightTargetsEffect() + .setText("Then target creature you control fights target creature you don't control")); this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent()); this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter)); } diff --git a/Mage.Sets/src/mage/cards/u/UnmooredEgo.java b/Mage.Sets/src/mage/cards/u/UnmooredEgo.java new file mode 100644 index 00000000000..8b09521818b --- /dev/null +++ b/Mage.Sets/src/mage/cards/u/UnmooredEgo.java @@ -0,0 +1,124 @@ +package mage.cards.u; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ChooseACardNameEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.Cards; +import mage.cards.CardsImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.predicate.mageobject.NamePredicate; +import mage.game.Game; +import mage.players.Player; +import mage.target.TargetCard; +import mage.target.common.TargetCardInLibrary; +import mage.target.common.TargetOpponent; + +/** + * + * @author LevelX2 + */ +public final class UnmooredEgo extends CardImpl { + + public UnmooredEgo(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{U}{B}"); + + // Choose a card name. Search target opponent's graveyard, hand, and library for up to four cards with that name and exile them. That player shuffles their library, then draws a card for each card exiled from their hand this way. + this.getSpellAbility().addEffect((new ChooseACardNameEffect(ChooseACardNameEffect.TypeOfName.ALL))); + this.getSpellAbility().addEffect(new UnmooredEgoEffect()); + this.getSpellAbility().addTarget(new TargetOpponent()); + } + + public UnmooredEgo(final UnmooredEgo card) { + super(card); + } + + @Override + public UnmooredEgo copy() { + return new UnmooredEgo(this); + } +} + +class UnmooredEgoEffect extends OneShotEffect { + + public UnmooredEgoEffect() { + super(Outcome.Benefit); + this.staticText = "Search target opponent's graveyard, hand, and library for up to four cards with that name and exile them. That player shuffles their library, then draws a card for each card exiled from their hand this way"; + } + + public UnmooredEgoEffect(final UnmooredEgoEffect effect) { + super(effect); + } + + @Override + public UnmooredEgoEffect copy() { + return new UnmooredEgoEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + String cardName = (String) game.getState().getValue(source.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY); + Player controller = game.getPlayer(source.getControllerId()); + if (cardName != null && controller != null) { + int numberOfCardsStillToRemove = 4; + int numberOfCardsExiledFromHand = 0; + Player targetPlayer = game.getPlayer(getTargetPointer().getFirst(game, source)); + if (targetPlayer != null) { + FilterCard filter = new FilterCard("card named " + cardName); + filter.add(new NamePredicate(cardName)); + + // cards in Graveyard + int cardsCount = (cardName.isEmpty() ? 0 : targetPlayer.getGraveyard().count(filter, game)); + if (cardsCount > 0) { + filter.setMessage("card named " + cardName + " in the graveyard of " + targetPlayer.getName()); + TargetCard target = new TargetCard(Math.min(cardsCount, numberOfCardsStillToRemove), + Math.min(cardsCount, numberOfCardsStillToRemove), Zone.GRAVEYARD, filter); + if (controller.choose(Outcome.Exile, targetPlayer.getGraveyard(), target, game)) { + numberOfCardsStillToRemove -= target.getTargets().size(); + controller.moveCards(new CardsImpl(target.getTargets()), Zone.EXILED, source, game); + } + } + + // cards in Hand + if (numberOfCardsStillToRemove > 0) { + cardsCount = (cardName.isEmpty() ? 0 : targetPlayer.getHand().count(filter, game)); + filter.setMessage("card named " + cardName + " in the hand of " + targetPlayer.getName()); + TargetCard target = new TargetCard(0, Math.min(cardsCount, numberOfCardsStillToRemove), Zone.HAND, filter); + if (controller.choose(Outcome.Exile, targetPlayer.getHand(), target, game)) { + numberOfCardsExiledFromHand = target.getTargets().size(); + numberOfCardsStillToRemove -= target.getTargets().size(); + controller.moveCards(new CardsImpl(target.getTargets()), Zone.EXILED, source, game); + } + } + + // cards in Library + if (numberOfCardsStillToRemove > 0) { + Cards cardsInLibrary = new CardsImpl(); + cardsInLibrary.addAll(targetPlayer.getLibrary().getCards(game)); + cardsCount = (cardName.isEmpty() ? 0 : cardsInLibrary.count(filter, game)); + filter.setMessage("card named " + cardName + " in the library of " + targetPlayer.getLogName()); + TargetCardInLibrary targetLib = new TargetCardInLibrary(0, Math.min(cardsCount, numberOfCardsStillToRemove), filter); + if (controller.choose(Outcome.Exile, cardsInLibrary, targetLib, game)) { + controller.moveCards(new CardsImpl(targetLib.getTargets()), Zone.EXILED, source, game); + } + } + targetPlayer.shuffleLibrary(source, game); + + if (numberOfCardsExiledFromHand > 0) { + game.getState().applyEffects(game); + targetPlayer.drawCards(numberOfCardsExiledFromHand, game); + } + } + + return true; + } + + return false; + } + +} diff --git a/Mage.Sets/src/mage/cards/u/UrzasHotTub.java b/Mage.Sets/src/mage/cards/u/UrzasHotTub.java new file mode 100644 index 00000000000..6a816e8d97b --- /dev/null +++ b/Mage.Sets/src/mage/cards/u/UrzasHotTub.java @@ -0,0 +1,130 @@ + +package mage.cards.u; + +import java.util.UUID; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.Cost; +import mage.abilities.costs.common.DiscardTargetCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.SplitCard; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SpellAbilityType; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.predicate.Predicate; +import mage.game.Game; +import mage.game.stack.Spell; +import mage.target.common.TargetCardInHand; +import mage.target.common.TargetCardInLibrary; + +/** + * + * @author L_J + */ +public class UrzasHotTub extends CardImpl { + + public UrzasHotTub(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{2}"); + + // {2}, Discard a card: Search your library for a card that shares a complete word in its name with the discarded card, reveal it, put it into your hand, then shuffle your library. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new UrzasHotTubEffect(), new ManaCostsImpl("{2}")); + ability.addCost(new DiscardTargetCost(new TargetCardInHand())); + this.addAbility(ability); + } + + public UrzasHotTub(final UrzasHotTub card) { + super(card); + } + + @Override + public UrzasHotTub copy() { + return new UrzasHotTub(this); + } +} + +class UrzasHotTubEffect extends OneShotEffect { + + public UrzasHotTubEffect() { + super(Outcome.ReturnToHand); + this.staticText = "Search your library for a card that shares a complete word in its name with the discarded card, reveal it, put it into your hand, then shuffle your library"; + } + + public UrzasHotTubEffect(final UrzasHotTubEffect effect) { + super(effect); + } + + @Override + public UrzasHotTubEffect copy() { + return new UrzasHotTubEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + for (Cost cost : source.getCosts()) { + if (cost instanceof DiscardTargetCost) { + DiscardTargetCost discardCost = (DiscardTargetCost) cost; + Card discardedCard = discardCost.getCards().get(0); + if (discardedCard != null) { + FilterCard filter = new FilterCard(); + filter.add(new UrzasHotTubPredicate(discardedCard.getName())); + return new SearchLibraryPutInHandEffect(new TargetCardInLibrary(filter), true, true).apply(game, source); + } + } + } + return false; + } +} + +class UrzasHotTubPredicate implements Predicate { + + private final String referenceName; + + public UrzasHotTubPredicate(String referenceName) { + this.referenceName = referenceName; + } + + @Override + public boolean apply(MageObject input, Game game) { + String name = input.getName(); + if (input instanceof SplitCard) { + return sharesWordWithName(((SplitCard)input).getLeftHalfCard().getName()) || sharesWordWithName(((SplitCard)input).getRightHalfCard().getName()); + } else if (input instanceof Spell && ((Spell) input).getSpellAbility().getSpellAbilityType() == SpellAbilityType.SPLIT_FUSED){ + SplitCard card = (SplitCard) ((Spell)input).getCard(); + return sharesWordWithName(card.getLeftHalfCard().getName()) || sharesWordWithName(card.getRightHalfCard().getName()); + } else { + if (name.contains(" // ")) { + String leftName = name.substring(0, name.indexOf(" // ")); + String rightName = name.substring(name.indexOf(" // ") + 4, name.length()); + return sharesWordWithName(leftName) || sharesWordWithName(rightName); + } else { + return sharesWordWithName(name); + } + } + } + + private boolean sharesWordWithName(String str) { + if (referenceName == null || referenceName == "") { + return false; + } + String[] arr = referenceName.split("\\s+"); + for (int i = 0; i < arr.length; i++) { + if (str.contains(arr[i].replaceAll(",", ""))) { + return true; + } + } + return false; + } + + @Override + public String toString() { + return ""; + } +} diff --git a/Mage.Sets/src/mage/cards/v/ValorInAkros.java b/Mage.Sets/src/mage/cards/v/ValorInAkros.java index 851ff2e66ab..3f778cba22b 100644 --- a/Mage.Sets/src/mage/cards/v/ValorInAkros.java +++ b/Mage.Sets/src/mage/cards/v/ValorInAkros.java @@ -1,25 +1,32 @@ package mage.cards.v; -import java.util.UUID; -import mage.abilities.common.CreatureEntersBattlefieldTriggeredAbility; +import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; import mage.abilities.effects.common.continuous.BoostControlledEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; +import mage.constants.Zone; +import mage.filter.StaticFilters; + +import java.util.UUID; /** - * * @author LevelX2 */ public final class ValorInAkros extends CardImpl { public ValorInAkros(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{3}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{W}"); // Whenever a creature enters the battlefield under your control, creatures you control get +1/+1 until end of turn. - this.addAbility(new CreatureEntersBattlefieldTriggeredAbility(new BoostControlledEffect(1,1,Duration.EndOfTurn))); + this.addAbility(new EntersBattlefieldControlledTriggeredAbility( + Zone.BATTLEFIELD, + new BoostControlledEffect(1, 1, Duration.EndOfTurn), + StaticFilters.FILTER_PERMANENT_CREATURE_A, + false) + ); } public ValorInAkros(final ValorInAkros card) { diff --git a/Mage.Sets/src/mage/cards/v/VancesBlastingCannons.java b/Mage.Sets/src/mage/cards/v/VancesBlastingCannons.java index c29c57a9a21..e69e0dc6346 100644 --- a/Mage.Sets/src/mage/cards/v/VancesBlastingCannons.java +++ b/Mage.Sets/src/mage/cards/v/VancesBlastingCannons.java @@ -2,6 +2,7 @@ package mage.cards.v; import java.util.UUID; + import mage.abilities.Ability; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; @@ -13,7 +14,6 @@ import mage.abilities.keyword.TransformAbility; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.s.SpitfireBastion; import mage.constants.AsThoughEffectType; import mage.constants.CardType; import mage.constants.Duration; @@ -29,7 +29,6 @@ import mage.target.targetpointer.FixedTarget; import mage.watchers.common.CastSpellLastTurnWatcher; /** - * * @author TheElk801 */ public final class VancesBlastingCannons extends CardImpl { @@ -39,7 +38,7 @@ public final class VancesBlastingCannons extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.transformable = true; - this.secondSideCardClazz = SpitfireBastion.class; + this.secondSideCardClazz = mage.cards.s.SpitfireBastion.class; // At the beginning of your upkeep, exile the top card of your library. If it's a nonland card, you may cast that card this turn. this.addAbility(new BeginningOfUpkeepTriggeredAbility(new VancesBlastingCannonsExileEffect(), TargetController.YOU, false)); diff --git a/Mage.Sets/src/mage/cards/v/VanquishersBanner.java b/Mage.Sets/src/mage/cards/v/VanquishersBanner.java index 87a0cc004f9..63a8cfd65d3 100644 --- a/Mage.Sets/src/mage/cards/v/VanquishersBanner.java +++ b/Mage.Sets/src/mage/cards/v/VanquishersBanner.java @@ -81,7 +81,7 @@ class DrawCardIfCreatureTypeAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { - SubType subType = ChooseCreatureTypeEffect.getChoosenCreatureType(getSourceId(), game); + SubType subType = ChooseCreatureTypeEffect.getChosenCreatureType(getSourceId(), game); if (subType != null) { Spell spell = game.getStack().getSpell(event.getTargetId()); if (spell != null diff --git a/Mage.Sets/src/mage/cards/v/VarchildBetrayerOfKjeldor.java b/Mage.Sets/src/mage/cards/v/VarchildBetrayerOfKjeldor.java index bbff89dbf7c..ae1f7cceec0 100644 --- a/Mage.Sets/src/mage/cards/v/VarchildBetrayerOfKjeldor.java +++ b/Mage.Sets/src/mage/cards/v/VarchildBetrayerOfKjeldor.java @@ -6,18 +6,19 @@ import mage.abilities.Ability; import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; 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.CreateTokenTargetEffect; import mage.abilities.effects.common.combat.CantAttackYouOrPlaneswalkerAllEffect; import mage.abilities.effects.common.combat.CantBlockAllEffect; import mage.abilities.effects.common.continuous.GainControlAllEffect; -import mage.constants.SubType; -import mage.constants.SuperType; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; +import mage.constants.SubType; +import mage.constants.SuperType; import mage.constants.TargetController; import mage.constants.Zone; import mage.filter.common.FilterCreaturePermanent; @@ -108,9 +109,9 @@ class VarchildBetrayerOfKjeldorEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { int damage = (int) this.getValue("damage"); if (damage > 0) { - return new CreateTokenTargetEffect( - new SurvivorToken(), damage - ).apply(game, source); + Effect effect = new CreateTokenTargetEffect(new SurvivorToken(), damage); + effect.setTargetPointer(getTargetPointer()); + return effect.apply(game, source); } return false; } diff --git a/Mage.Sets/src/mage/cards/v/VedalkenMesmerist.java b/Mage.Sets/src/mage/cards/v/VedalkenMesmerist.java new file mode 100644 index 00000000000..ad7fe4d57ec --- /dev/null +++ b/Mage.Sets/src/mage/cards/v/VedalkenMesmerist.java @@ -0,0 +1,45 @@ +package mage.cards.v; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.target.common.TargetOpponentsCreaturePermanent; + +/** + * + * @author TheElk801 + */ +public final class VedalkenMesmerist extends CardImpl { + + public VedalkenMesmerist(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}"); + + this.subtype.add(SubType.VEDALKEN); + this.subtype.add(SubType.WIZARD); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // Whenever Vedalken Mesmerist attacks, target creature an opponent controls gets -2/-0 until end of turn. + Ability ability = new AttacksTriggeredAbility( + new BoostTargetEffect(-2, 0, Duration.EndOfTurn), false + ); + ability.addTarget(new TargetOpponentsCreaturePermanent()); + this.addAbility(ability); + } + + public VedalkenMesmerist(final VedalkenMesmerist card) { + super(card); + } + + @Override + public VedalkenMesmerist copy() { + return new VedalkenMesmerist(this); + } +} diff --git a/Mage.Sets/src/mage/cards/v/VenserTheSojourner.java b/Mage.Sets/src/mage/cards/v/VenserTheSojourner.java index 291ea0a03fa..87b3754f20e 100644 --- a/Mage.Sets/src/mage/cards/v/VenserTheSojourner.java +++ b/Mage.Sets/src/mage/cards/v/VenserTheSojourner.java @@ -5,7 +5,7 @@ import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; @@ -42,7 +42,7 @@ public final class VenserTheSojourner extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.VENSER); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3)); // +2: Exile target permanent you own. Return it to the battlefield under your control at the beginning of the next end step. LoyaltyAbility ability1 = new LoyaltyAbility(new VenserTheSojournerEffect(), 2); diff --git a/Mage.Sets/src/mage/cards/v/ViciousRumors.java b/Mage.Sets/src/mage/cards/v/ViciousRumors.java new file mode 100644 index 00000000000..447886bd3cd --- /dev/null +++ b/Mage.Sets/src/mage/cards/v/ViciousRumors.java @@ -0,0 +1,48 @@ +package mage.cards.v; + +import java.util.UUID; +import mage.abilities.dynamicvalue.common.StaticValue; +import mage.abilities.effects.common.DamagePlayersEffect; +import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.effects.common.PutTopCardOfLibraryIntoGraveEachPlayerEffect; +import mage.abilities.effects.common.discard.DiscardEachPlayerEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.TargetController; + +/** + * + * @author TheElk801 + */ +public final class ViciousRumors extends CardImpl { + + public ViciousRumors(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{B}"); + + // Vicious Rumors deals 1 damage to each opponent. Each opponent discards a card, then puts the top card of their library into their graveyard. You gain 1 life. + this.getSpellAbility().addEffect( + new DamagePlayersEffect(1, TargetController.OPPONENT) + ); + this.getSpellAbility().addEffect(new DiscardEachPlayerEffect( + new StaticValue(1), false, + TargetController.OPPONENT + )); + this.getSpellAbility().addEffect( + new PutTopCardOfLibraryIntoGraveEachPlayerEffect( + 1, TargetController.OPPONENT + ).setText(", then puts the top card of their library " + + "into their graveyard") + ); + this.getSpellAbility().addEffect(new GainLifeEffect(1)); + } + + public ViciousRumors(final ViciousRumors card) { + super(card); + } + + @Override + public ViciousRumors copy() { + return new ViciousRumors(this); + } +} diff --git a/Mage.Sets/src/mage/cards/v/VigilanteJustice.java b/Mage.Sets/src/mage/cards/v/VigilanteJustice.java index e99e223b5f0..791642147ba 100644 --- a/Mage.Sets/src/mage/cards/v/VigilanteJustice.java +++ b/Mage.Sets/src/mage/cards/v/VigilanteJustice.java @@ -1,9 +1,8 @@ package mage.cards.v; -import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.common.CreatureEntersBattlefieldTriggeredAbility; +import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; import mage.abilities.effects.common.DamageTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -14,24 +13,30 @@ import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.SubtypePredicate; import mage.target.common.TargetAnyTarget; +import java.util.UUID; + /** - * * @author Loki */ public final class VigilanteJustice extends CardImpl { - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Human"); + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("a Human"); static { - filter.add(new SubtypePredicate(SubType.HUMAN)); + filter.add(new SubtypePredicate(SubType.HUMAN)); } public VigilanteJustice(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{3}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{R}"); // Whenever a Human enters the battlefield under your control, Vigilante Justice deals 1 damage to any target. - Ability ability = new CreatureEntersBattlefieldTriggeredAbility(Zone.BATTLEFIELD, new DamageTargetEffect(1), filter, false, false); + Ability ability = new EntersBattlefieldControlledTriggeredAbility( + Zone.BATTLEFIELD, + new DamageTargetEffect(1), + filter, + false + ); ability.addTarget(new TargetAnyTarget()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/v/VigorsporeWurm.java b/Mage.Sets/src/mage/cards/v/VigorsporeWurm.java new file mode 100644 index 00000000000..71214ca815b --- /dev/null +++ b/Mage.Sets/src/mage/cards/v/VigorsporeWurm.java @@ -0,0 +1,69 @@ +package mage.cards.v; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.dynamicvalue.common.CardsInControllerGraveyardCount; +import mage.abilities.effects.common.combat.CantBeBlockedByMoreThanOneSourceEffect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.VigilanceAbility; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Zone; +import mage.filter.StaticFilters; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author TheElk801 + */ +public final class VigorsporeWurm extends CardImpl { + + public VigorsporeWurm(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{G}"); + + this.subtype.add(SubType.WURM); + this.power = new MageInt(6); + this.toughness = new MageInt(4); + + // Undergrowth — When Vigorspore Wurm enters the battlefield, target creature gains vigilance and gets +X/+X until end of turn, where X is the number of creature cards in your graveyard. + DynamicValue xValue = new CardsInControllerGraveyardCount( + StaticFilters.FILTER_CARD_CREATURE + ); + Ability ability = new EntersBattlefieldTriggeredAbility( + new GainAbilityTargetEffect( + VigilanceAbility.getInstance(), + Duration.EndOfTurn + ).setText("target creature gains vigilance"), + false, "Undergrowth — " + ); + ability.addEffect(new BoostTargetEffect( + xValue, xValue, Duration.EndOfTurn, true + ).setText("and gets +X/+X until end of turn, " + + "where X is the number of creature cards in your graveyard.")); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + + // Vigorspore Wurm can't be blocked by more than one creature. + this.addAbility(new SimpleStaticAbility( + Zone.BATTLEFIELD, + new CantBeBlockedByMoreThanOneSourceEffect() + )); + } + + public VigorsporeWurm(final VigorsporeWurm card) { + super(card); + } + + @Override + public VigorsporeWurm copy() { + return new VigorsporeWurm(this); + } +} diff --git a/Mage.Sets/src/mage/cards/v/VildinPackOutcast.java b/Mage.Sets/src/mage/cards/v/VildinPackOutcast.java index 05c7691469e..bba28333bcc 100644 --- a/Mage.Sets/src/mage/cards/v/VildinPackOutcast.java +++ b/Mage.Sets/src/mage/cards/v/VildinPackOutcast.java @@ -2,6 +2,7 @@ package mage.cards.v; import java.util.UUID; + import mage.MageInt; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; @@ -11,27 +12,25 @@ import mage.abilities.keyword.TrampleAbility; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.d.DronepackKindred; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Duration; import mage.constants.Zone; /** - * * @author fireshoes */ public final class VildinPackOutcast extends CardImpl { public VildinPackOutcast(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{R}"); this.subtype.add(SubType.WEREWOLF); this.subtype.add(SubType.HORROR); this.power = new MageInt(4); this.toughness = new MageInt(4); this.transformable = true; - this.secondSideCardClazz = DronepackKindred.class; + this.secondSideCardClazz = mage.cards.d.DronepackKindred.class; // Trample this.addAbility(TrampleAbility.getInstance()); diff --git a/Mage.Sets/src/mage/cards/v/VileRequiem.java b/Mage.Sets/src/mage/cards/v/VileRequiem.java index 7bc935cc243..e602b7b6b31 100644 --- a/Mage.Sets/src/mage/cards/v/VileRequiem.java +++ b/Mage.Sets/src/mage/cards/v/VileRequiem.java @@ -1,4 +1,3 @@ - package mage.cards.v; import java.util.UUID; @@ -14,7 +13,6 @@ import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.TargetAdjustment; import mage.constants.TargetController; import mage.constants.Zone; import mage.counters.CounterType; @@ -23,6 +21,7 @@ import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.CardTypePredicate; import mage.filter.predicate.mageobject.ColorPredicate; import mage.target.TargetPermanent; +import mage.target.targetadjustment.VerseCounterAdjuster; /** * @@ -50,7 +49,7 @@ public final class VileRequiem extends CardImpl { Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("{1}{B}")); ability.addCost(new SacrificeSourceCost()); ability.addTarget(new TargetPermanent(0, 0, filter, false)); - ability.setTargetAdjustment(TargetAdjustment.VERSE_COUNTER_TARGETS); + ability.setTargetAdjuster(VerseCounterAdjuster.instance); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/v/VillageIronsmith.java b/Mage.Sets/src/mage/cards/v/VillageIronsmith.java index 2ab6e27cdec..ab4b8c68791 100644 --- a/Mage.Sets/src/mage/cards/v/VillageIronsmith.java +++ b/Mage.Sets/src/mage/cards/v/VillageIronsmith.java @@ -2,6 +2,7 @@ package mage.cards.v; import java.util.UUID; + import mage.MageInt; import mage.abilities.TriggeredAbility; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; @@ -12,7 +13,6 @@ import mage.abilities.keyword.FirstStrikeAbility; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.i.Ironfang; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.TargetController; @@ -23,12 +23,12 @@ import mage.constants.TargetController; public final class VillageIronsmith extends CardImpl { public VillageIronsmith(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.WEREWOLF); this.transformable = true; - this.secondSideCardClazz = Ironfang.class; + this.secondSideCardClazz = mage.cards.i.Ironfang.class; this.power = new MageInt(1); this.toughness = new MageInt(1); diff --git a/Mage.Sets/src/mage/cards/v/VillageMessenger.java b/Mage.Sets/src/mage/cards/v/VillageMessenger.java index ef0a93f8941..73e15f33012 100644 --- a/Mage.Sets/src/mage/cards/v/VillageMessenger.java +++ b/Mage.Sets/src/mage/cards/v/VillageMessenger.java @@ -2,6 +2,7 @@ package mage.cards.v; import java.util.UUID; + import mage.MageInt; import mage.abilities.TriggeredAbility; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; @@ -12,26 +13,24 @@ import mage.abilities.keyword.HasteAbility; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.m.MoonriseIntruder; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.TargetController; /** - * * @author fireshoes */ public final class VillageMessenger extends CardImpl { public VillageMessenger(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{R}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{R}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.WEREWOLF); this.power = new MageInt(1); this.toughness = new MageInt(1); this.transformable = true; - this.secondSideCardClazz = MoonriseIntruder.class; + this.secondSideCardClazz = mage.cards.m.MoonriseIntruder.class; // Haste this.addAbility(HasteAbility.getInstance()); @@ -50,4 +49,4 @@ public final class VillageMessenger extends CardImpl { public VillageMessenger copy() { return new VillageMessenger(this); } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/v/VillagersOfEstwald.java b/Mage.Sets/src/mage/cards/v/VillagersOfEstwald.java index a320c5a6f3b..e8e5d20c836 100644 --- a/Mage.Sets/src/mage/cards/v/VillagersOfEstwald.java +++ b/Mage.Sets/src/mage/cards/v/VillagersOfEstwald.java @@ -2,6 +2,7 @@ package mage.cards.v; import java.util.UUID; + import mage.MageInt; import mage.abilities.TriggeredAbility; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; @@ -11,7 +12,6 @@ import mage.abilities.effects.common.TransformSourceEffect; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.h.HowlpackOfEstwald; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.TargetController; @@ -22,12 +22,12 @@ import mage.constants.TargetController; public final class VillagersOfEstwald extends CardImpl { public VillagersOfEstwald(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.WEREWOLF); this.transformable = true; - this.secondSideCardClazz = HowlpackOfEstwald.class; + this.secondSideCardClazz = mage.cards.h.HowlpackOfEstwald.class; this.power = new MageInt(2); this.toughness = new MageInt(3); diff --git a/Mage.Sets/src/mage/cards/v/VividRevival.java b/Mage.Sets/src/mage/cards/v/VividRevival.java index 830b6d585ac..267bf076bb8 100644 --- a/Mage.Sets/src/mage/cards/v/VividRevival.java +++ b/Mage.Sets/src/mage/cards/v/VividRevival.java @@ -16,7 +16,7 @@ import mage.target.common.TargetCardInYourGraveyard; */ public final class VividRevival extends CardImpl { - private static final FilterCard filter = new FilterCard("multicolored cards"); + private static final FilterCard filter = new FilterCard("multicolored cards from your graveyard"); static { filter.add(new MulticoloredPredicate()); diff --git a/Mage.Sets/src/mage/cards/v/VivienOfTheArkbow.java b/Mage.Sets/src/mage/cards/v/VivienOfTheArkbow.java index f40809e0bb2..b3068b7a35d 100644 --- a/Mage.Sets/src/mage/cards/v/VivienOfTheArkbow.java +++ b/Mage.Sets/src/mage/cards/v/VivienOfTheArkbow.java @@ -3,7 +3,7 @@ package mage.cards.v; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.common.DamageWithPowerTargetEffect; import mage.abilities.effects.common.continuous.BoostControlledEffect; import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; @@ -40,7 +40,7 @@ public final class VivienOfTheArkbow extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.VIVIEN); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(5)); // +2: Put two +1/+1 counters on up to one target creature. Ability ability = new LoyaltyAbility(new AddCountersTargetEffect(CounterType.P1P1.createInstance(2)), 2); diff --git a/Mage.Sets/src/mage/cards/v/VivienReid.java b/Mage.Sets/src/mage/cards/v/VivienReid.java index 219a8c5a3cd..2ef81f81890 100644 --- a/Mage.Sets/src/mage/cards/v/VivienReid.java +++ b/Mage.Sets/src/mage/cards/v/VivienReid.java @@ -3,7 +3,7 @@ package mage.cards.v; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.common.DestroyTargetEffect; import mage.abilities.effects.common.GetEmblemEffect; @@ -52,7 +52,7 @@ public final class VivienReid extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.VIVIEN); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(5)); // +1: Look at the top four cards of your library. You may reveal a creature or land 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 LoyaltyAbility( diff --git a/Mage.Sets/src/mage/cards/v/VizierOfTheMenagerie.java b/Mage.Sets/src/mage/cards/v/VizierOfTheMenagerie.java index cfca3c4884a..4df002baa7b 100644 --- a/Mage.Sets/src/mage/cards/v/VizierOfTheMenagerie.java +++ b/Mage.Sets/src/mage/cards/v/VizierOfTheMenagerie.java @@ -1,7 +1,6 @@ package mage.cards.v; -import java.util.UUID; import mage.MageInt; import mage.MageObject; import mage.abilities.Ability; @@ -12,21 +11,14 @@ import mage.abilities.effects.ContinuousEffectImpl; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.AsThoughEffectType; -import mage.constants.CardType; -import mage.constants.SubType; -import mage.constants.Duration; -import mage.constants.Layer; -import mage.constants.ManaType; -import mage.constants.Outcome; -import mage.constants.SubLayer; -import mage.constants.Zone; +import mage.constants.*; import mage.game.Game; import mage.players.ManaPoolItem; import mage.players.Player; +import java.util.UUID; + /** - * * @author jeffwadsworth */ public final class VizierOfTheMenagerie extends CardImpl { @@ -63,7 +55,7 @@ class VizierOfTheMenagerieTopCardRevealedEffect extends ContinuousEffectImpl { public VizierOfTheMenagerieTopCardRevealedEffect() { super(Duration.WhileOnBattlefield, Layer.PlayerEffects, SubLayer.NA, Outcome.Benefit); - staticText = "You may look at the top card of your library. (You may do this at any time.)"; + staticText = "You may look at the top card of your library any time"; } public VizierOfTheMenagerieTopCardRevealedEffect(final VizierOfTheMenagerieTopCardRevealedEffect effect) { diff --git a/Mage.Sets/src/mage/cards/v/VoldarenPariah.java b/Mage.Sets/src/mage/cards/v/VoldarenPariah.java index 1373589496f..1f4be360d2d 100644 --- a/Mage.Sets/src/mage/cards/v/VoldarenPariah.java +++ b/Mage.Sets/src/mage/cards/v/VoldarenPariah.java @@ -2,6 +2,7 @@ package mage.cards.v; import java.util.UUID; + import mage.MageInt; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.SacrificeTargetCost; @@ -12,7 +13,6 @@ import mage.abilities.keyword.MadnessAbility; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.a.AbolisherOfBloodlines; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Zone; @@ -21,7 +21,6 @@ import mage.filter.predicate.permanent.AnotherPredicate; import mage.target.common.TargetControlledPermanent; /** - * * @author fireshoes */ public final class VoldarenPariah extends CardImpl { @@ -33,14 +32,14 @@ public final class VoldarenPariah extends CardImpl { } public VoldarenPariah(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{B}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}{B}"); this.subtype.add(SubType.VAMPIRE); this.subtype.add(SubType.HORROR); this.power = new MageInt(3); this.toughness = new MageInt(3); this.transformable = true; - this.secondSideCardClazz = AbolisherOfBloodlines.class; + this.secondSideCardClazz = mage.cards.a.AbolisherOfBloodlines.class; // Flying this.addAbility(FlyingAbility.getInstance()); diff --git a/Mage.Sets/src/mage/cards/v/VolrathsLaboratory.java b/Mage.Sets/src/mage/cards/v/VolrathsLaboratory.java index faeaa328c4d..3ddb23ac0cb 100644 --- a/Mage.Sets/src/mage/cards/v/VolrathsLaboratory.java +++ b/Mage.Sets/src/mage/cards/v/VolrathsLaboratory.java @@ -19,7 +19,6 @@ import mage.constants.Outcome; import mage.constants.SubType; import mage.constants.Zone; import mage.game.Game; -import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; import mage.game.permanent.token.VolrathsLaboratoryToken; @@ -74,7 +73,7 @@ class VolrathsLaboratoryEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { ObjectColor color = (ObjectColor) game.getState().getValue(source.getSourceId() + "_color"); - SubType subType = ChooseCreatureTypeEffect.getChoosenCreatureType(source.getSourceId(), game); + SubType subType = ChooseCreatureTypeEffect.getChosenCreatureType(source.getSourceId(), game); Token token = new VolrathsLaboratoryToken(color, subType); return token.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId()); } diff --git a/Mage.Sets/src/mage/cards/v/VoraciousDragon.java b/Mage.Sets/src/mage/cards/v/VoraciousDragon.java index 23b141bf435..f088c0551c0 100644 --- a/Mage.Sets/src/mage/cards/v/VoraciousDragon.java +++ b/Mage.Sets/src/mage/cards/v/VoraciousDragon.java @@ -70,7 +70,7 @@ class TwiceDevouredGoblins implements DynamicValue { DevourEffect devourEffect = (DevourEffect) abilityEffect; int amountGoblins = 0; for (List subtypesItem :devourEffect.getSubtypes(game, sourcePermanent.getId())) { - if (subtypesItem.contains(SubType.GOBLIN)) { + if (subtypesItem.contains(SubType.GOBLIN.toString())) { ++amountGoblins; } } diff --git a/Mage.Sets/src/mage/cards/v/VraskaGolgariQueen.java b/Mage.Sets/src/mage/cards/v/VraskaGolgariQueen.java index 9f3646cdb0a..bb15a7f7222 100644 --- a/Mage.Sets/src/mage/cards/v/VraskaGolgariQueen.java +++ b/Mage.Sets/src/mage/cards/v/VraskaGolgariQueen.java @@ -3,19 +3,19 @@ package mage.cards.v; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.costs.common.SacrificeTargetCost; import mage.abilities.effects.common.DestroyTargetEffect; import mage.abilities.effects.common.DoIfCostPaid; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.GainLifeEffect; import mage.abilities.effects.common.GetEmblemEffect; -import mage.constants.SubType; -import mage.constants.SuperType; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.ComparisonType; +import mage.constants.SubType; +import mage.constants.SuperType; import mage.filter.FilterPermanent; import mage.filter.common.FilterControlledPermanent; import mage.filter.common.FilterNonlandPermanent; @@ -46,18 +46,18 @@ public final class VraskaGolgariQueen extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.VRASKA); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(4)); // +2: You may sacrifice another permanent. If you do, you gain 1 life and draw a card. DoIfCostPaid effect = new DoIfCostPaid( new GainLifeEffect(1), new SacrificeTargetCost(new TargetControlledPermanent(filter1)) ); - effect.addEffect(new DrawCardSourceControllerEffect(1)); + effect.addEffect(new DrawCardSourceControllerEffect(1).setText("and draw a card")); this.addAbility(new LoyaltyAbility(effect, 2)); // -3: Destroy target nonland permanent with converted mana cost 3 or less. - Ability ability = new LoyaltyAbility(new DestroyTargetEffect()); + Ability ability = new LoyaltyAbility(new DestroyTargetEffect(), -3); ability.addTarget(new TargetPermanent(filter2)); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/v/VraskaRegalGorgon.java b/Mage.Sets/src/mage/cards/v/VraskaRegalGorgon.java index c3ae5c81cab..8e35dd757ad 100644 --- a/Mage.Sets/src/mage/cards/v/VraskaRegalGorgon.java +++ b/Mage.Sets/src/mage/cards/v/VraskaRegalGorgon.java @@ -3,7 +3,7 @@ package mage.cards.v; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DestroyTargetEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; @@ -34,7 +34,7 @@ public final class VraskaRegalGorgon extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.VRASKA); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(5)); // +2: Put a +1/+1 counter on up to one target creature. That creature gains menace until end of turn. Ability ability = new LoyaltyAbility(new AddCountersTargetEffect( diff --git a/Mage.Sets/src/mage/cards/v/VraskaRelicSeeker.java b/Mage.Sets/src/mage/cards/v/VraskaRelicSeeker.java index 4c178fb787b..9a792d8e08a 100644 --- a/Mage.Sets/src/mage/cards/v/VraskaRelicSeeker.java +++ b/Mage.Sets/src/mage/cards/v/VraskaRelicSeeker.java @@ -4,7 +4,7 @@ package mage.cards.v; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateTokenEffect; import mage.constants.SubType; @@ -34,7 +34,7 @@ public final class VraskaRelicSeeker extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.VRASKA); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(6)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(6)); //+2: Create a 2/2 black Pirate creature token with menace. this.addAbility(new LoyaltyAbility(new CreateTokenEffect(new PirateToken()), 2)); diff --git a/Mage.Sets/src/mage/cards/v/VraskaSchemingGorgon.java b/Mage.Sets/src/mage/cards/v/VraskaSchemingGorgon.java index bc95698b896..dd25a8487d1 100644 --- a/Mage.Sets/src/mage/cards/v/VraskaSchemingGorgon.java +++ b/Mage.Sets/src/mage/cards/v/VraskaSchemingGorgon.java @@ -5,7 +5,7 @@ import java.util.UUID; import mage.abilities.LoyaltyAbility; import mage.abilities.TriggeredAbility; import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.common.DestroyTargetEffect; import mage.abilities.effects.common.LoseGameTargetPlayerEffect; @@ -32,7 +32,7 @@ public final class VraskaSchemingGorgon extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.VRASKA); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(5)); // +2: Creatures you control get +1/+0 until end of turn. Effect effect = new BoostControlledEffect(1, 0, Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURE); diff --git a/Mage.Sets/src/mage/cards/v/VraskaTheUnseen.java b/Mage.Sets/src/mage/cards/v/VraskaTheUnseen.java index 7699a25e1ea..9ba830b1fa3 100644 --- a/Mage.Sets/src/mage/cards/v/VraskaTheUnseen.java +++ b/Mage.Sets/src/mage/cards/v/VraskaTheUnseen.java @@ -5,7 +5,7 @@ import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; import mage.abilities.TriggeredAbilityImpl; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.effects.Effect; import mage.abilities.effects.common.CreateTokenEffect; @@ -47,7 +47,7 @@ public final class VraskaTheUnseen extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.VRASKA); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(5)); // +1: Until your next turn, whenever a creature deals combat damage to Vraska the Unseen, destroy that creature. this.addAbility(new LoyaltyAbility(new VraskaTheUnseenGainAbilityEffect(new VraskaTheUnseenTriggeredAbility()), 1)); diff --git a/Mage.Sets/src/mage/cards/v/VraskasStoneglare.java b/Mage.Sets/src/mage/cards/v/VraskasStoneglare.java index 71345f6e32e..853236eb458 100644 --- a/Mage.Sets/src/mage/cards/v/VraskasStoneglare.java +++ b/Mage.Sets/src/mage/cards/v/VraskasStoneglare.java @@ -34,7 +34,7 @@ public final class VraskasStoneglare extends CardImpl { this.getSpellAbility().addEffect(new VraskasStoneglareEffect()); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); this.getSpellAbility().addEffect( - new SearchLibraryGraveyardPutInHandEffect(filter, false, false) + new SearchLibraryGraveyardPutInHandEffect(filter, false, true) ); } @@ -53,7 +53,7 @@ class VraskasStoneglareEffect extends OneShotEffect { public VraskasStoneglareEffect() { super(Outcome.Benefit); this.staticText = "Destroy target creature. " - + "You gain life equal to its toughness."; + + "You gain life equal to its toughness"; } public VraskasStoneglareEffect(final VraskasStoneglareEffect effect) { diff --git a/Mage.Sets/src/mage/cards/w/WandOfVertebrae.java b/Mage.Sets/src/mage/cards/w/WandOfVertebrae.java index 0328b935864..81915ca4189 100644 --- a/Mage.Sets/src/mage/cards/w/WandOfVertebrae.java +++ b/Mage.Sets/src/mage/cards/w/WandOfVertebrae.java @@ -74,7 +74,7 @@ class WandOfVertebraeEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getFirstTarget()); + Player player = game.getPlayer(source.getControllerId()); if (player == null) { return false; } diff --git a/Mage.Sets/src/mage/cards/w/WestvaleAbbey.java b/Mage.Sets/src/mage/cards/w/WestvaleAbbey.java index 86dc68633b6..f8063564985 100644 --- a/Mage.Sets/src/mage/cards/w/WestvaleAbbey.java +++ b/Mage.Sets/src/mage/cards/w/WestvaleAbbey.java @@ -2,6 +2,7 @@ package mage.cards.w; import java.util.UUID; + import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.PayLifeCost; @@ -15,7 +16,6 @@ import mage.abilities.keyword.TransformAbility; import mage.abilities.mana.ColorlessManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.o.OrmendahlProfanePrince; import mage.constants.CardType; import mage.constants.Zone; import mage.filter.common.FilterControlledCreaturePermanent; @@ -23,7 +23,6 @@ import mage.game.permanent.token.HumanClericToken; import mage.target.common.TargetControlledPermanent; /** - * * @author fireshoes */ public final class WestvaleAbbey extends CardImpl { @@ -32,7 +31,7 @@ public final class WestvaleAbbey extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); this.transformable = true; - this.secondSideCardClazz = OrmendahlProfanePrince.class; + this.secondSideCardClazz = mage.cards.o.OrmendahlProfanePrince.class; // {T}: Add {C}. this.addAbility(new ColorlessManaAbility()); diff --git a/Mage.Sets/src/mage/cards/w/WhenFluffyBunniesAttack.java b/Mage.Sets/src/mage/cards/w/WhenFluffyBunniesAttack.java new file mode 100644 index 00000000000..a2db93e53c3 --- /dev/null +++ b/Mage.Sets/src/mage/cards/w/WhenFluffyBunniesAttack.java @@ -0,0 +1,101 @@ + +package mage.cards.w; + +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.choices.ChoiceImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.common.TargetCreaturePermanent; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author L_J + */ +public final class WhenFluffyBunniesAttack extends CardImpl { + + public WhenFluffyBunniesAttack (UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{3}{B}"); + + // Target creature gets -X/-X until end of turn, where X is the number of times the letter of your choice appears in that creature’s name. + this.getSpellAbility().addEffect(new WhenFluffyBunniesAttackEffect()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + } + + public WhenFluffyBunniesAttack (final WhenFluffyBunniesAttack card) { + super(card); + } + + @Override + public WhenFluffyBunniesAttack copy() { + return new WhenFluffyBunniesAttack(this); + } + +} + +class WhenFluffyBunniesAttackEffect extends OneShotEffect { + + public WhenFluffyBunniesAttackEffect() { + super(Outcome.Detriment); + staticText = "Target creature gets -X/-X until end of turn, where X is the number of times the letter of your choice appears in that creature’s name"; + } + + public WhenFluffyBunniesAttackEffect(final WhenFluffyBunniesAttackEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + Permanent permanent = game.getPermanent(source.getFirstTarget()); + + ChoiceImpl choice = new ChoiceImpl(true); + choice.setMessage("Choose letter"); + Set choices = new HashSet<>(); + for (Character letter = 'A'; letter <= 'Z'; letter++) { + choices.add(letter.toString()); + } + choice.setChoices(choices); + + if (controller != null && permanent != null && controller.choose(outcome, choice, game)) { + if (!game.isSimulation()) { + MageObject mageObject = game.getObject(source.getSourceId()); + if (mageObject != null) { + game.informPlayers(mageObject.getLogName() + ": " + controller.getLogName() + " has chosen " + choice.getChoice()); + } + } + + Character chosenLetter = choice.getChoice().charAt(0); + int unboostValue = 0; + String permName = permanent.getName(); + for (int i = 0; i < permName.length(); i++) { + Character letter = permName.charAt(i); + if (Character.isLetter(letter) && Character.toUpperCase(letter) == chosenLetter) { + unboostValue--; + } + } + BoostTargetEffect effect = new BoostTargetEffect(unboostValue, unboostValue, Duration.EndOfTurn); + effect.setTargetPointer(new FixedTarget(permanent.getId())); + game.addEffect(effect, source); + return true; + } + return false; + } + + @Override + public WhenFluffyBunniesAttackEffect copy() { + return new WhenFluffyBunniesAttackEffect(this); + } +} diff --git a/Mage.Sets/src/mage/cards/w/WillKenrith.java b/Mage.Sets/src/mage/cards/w/WillKenrith.java index 46759ba62e6..e1d623e8fd9 100644 --- a/Mage.Sets/src/mage/cards/w/WillKenrith.java +++ b/Mage.Sets/src/mage/cards/w/WillKenrith.java @@ -5,7 +5,7 @@ import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; import mage.abilities.common.CanBeYourCommanderAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DrawCardTargetEffect; @@ -40,7 +40,7 @@ public final class WillKenrith extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.WILL); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(4)); // +2: Until your next turn, up to two target creatures each have base power and toughness 0/3 and lose all abilities. Ability ability = new LoyaltyAbility( diff --git a/Mage.Sets/src/mage/cards/w/WolfbittenCaptive.java b/Mage.Sets/src/mage/cards/w/WolfbittenCaptive.java index b9880a923ae..d56a5d9e388 100644 --- a/Mage.Sets/src/mage/cards/w/WolfbittenCaptive.java +++ b/Mage.Sets/src/mage/cards/w/WolfbittenCaptive.java @@ -2,6 +2,7 @@ package mage.cards.w; import java.util.UUID; + import mage.MageInt; import mage.abilities.TriggeredAbility; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; @@ -14,17 +15,15 @@ import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.abilities.keyword.TransformAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.k.KrallenhordeKiller; import mage.constants.*; /** - * * @author Loki */ public final class WolfbittenCaptive extends CardImpl { public WolfbittenCaptive(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{G}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.WEREWOLF); @@ -32,7 +31,7 @@ public final class WolfbittenCaptive extends CardImpl { this.toughness = new MageInt(1); this.transformable = true; - this.secondSideCardClazz = KrallenhordeKiller.class; + this.secondSideCardClazz = mage.cards.k.KrallenhordeKiller.class; // {1}{G}: Wolfbitten Captive gets +2/+2 until end of turn. Activate this ability only once each turn. this.addAbility(new LimitedTimesPerTurnActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(2, 2, Duration.EndOfTurn), new ManaCostsImpl("{1}{G}"))); diff --git a/Mage.Sets/src/mage/cards/w/WordOfCommand.java b/Mage.Sets/src/mage/cards/w/WordOfCommand.java index d03d0332667..a73cc01035b 100644 --- a/Mage.Sets/src/mage/cards/w/WordOfCommand.java +++ b/Mage.Sets/src/mage/cards/w/WordOfCommand.java @@ -98,7 +98,7 @@ class WordOfCommandEffect extends OneShotEffect { // You control that player until Word of Command finishes resolving controller.controlPlayersTurn(game, targetPlayer.getId()); - while (controller != null && controller.canRespond()) { + while (controller.canRespond()) { if (controller.chooseUse(Outcome.Benefit, "Resolve " + sourceObject.getLogName() + " now" + (card != null ? " and play " + card.getLogName() : "") + '?', source, game)) { // this is used to give the controller a little space to utilize his player controlling effect (look at face down creatures, hand, etc.) break; diff --git a/Mage.Sets/src/mage/cards/w/Wordmail.java b/Mage.Sets/src/mage/cards/w/Wordmail.java new file mode 100644 index 00000000000..e6aa8654e1e --- /dev/null +++ b/Mage.Sets/src/mage/cards/w/Wordmail.java @@ -0,0 +1,90 @@ + +package mage.cards.w; + +import java.util.UUID; +import java.util.regex.Pattern; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.continuous.BoostEnchantedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author L_J + */ +public final class Wordmail extends CardImpl { + + public Wordmail(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{W}"); + this.subtype.add(SubType.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 +1/+1 for each word in its name. + WordmailCount count = new WordmailCount(); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(count, count, Duration.WhileOnBattlefield))); + } + + public Wordmail(final Wordmail card) { + super(card); + } + + @Override + public Wordmail copy() { + return new Wordmail(this); + } +} + +class WordmailCount implements DynamicValue { + + public WordmailCount() { + } + + public WordmailCount(final WordmailCount dynamicValue) { + } + + @Override + public int calculate(Game game, Ability source, Effect effect) { + Permanent aura = game.getPermanent(source.getSourceId()); + if (aura != null) { + Permanent permanent = game.getPermanent(aura.getAttachedTo()); + if (permanent != null) { + return Pattern.compile("\\s+").split(permanent.getName()).length; + } + } + return 0; + } + + @Override + public WordmailCount copy() { + return new WordmailCount(this); + } + + @Override + public String toString() { + return "1"; + } + + @Override + public String getMessage() { + return "word in its name"; + } +} diff --git a/Mage.Sets/src/mage/cards/w/WorldBottlingKit.java b/Mage.Sets/src/mage/cards/w/WorldBottlingKit.java new file mode 100644 index 00000000000..60d683a620c --- /dev/null +++ b/Mage.Sets/src/mage/cards/w/WorldBottlingKit.java @@ -0,0 +1,94 @@ + +package mage.cards.w; + +import java.util.List; +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.OneShotEffect; +import mage.abilities.effects.common.ChooseExpansionSetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SuperType; +import mage.constants.Zone; +import mage.filter.FilterPermanent; +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; + +/** + * + * @author L_J + */ +public final class WorldBottlingKit extends CardImpl { + + public WorldBottlingKit(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{5}"); + + // {5}, Sacrifice World-Bottling Kit: Choose a Magic set. Exile all permanents with that set’s expansion symbol except for basic lands. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new WorldBottlingKitEffect(), new ManaCostsImpl("{5}")); + ability.addCost(new SacrificeSourceCost()); + this.addAbility(ability); + } + + public WorldBottlingKit(final WorldBottlingKit card) { + super(card); + } + + @Override + public WorldBottlingKit copy() { + return new WorldBottlingKit(this); + } +} + +class WorldBottlingKitEffect extends OneShotEffect { + + public WorldBottlingKitEffect() { + super(Outcome.DestroyPermanent); + this.staticText = "Choose a Magic set. Exile all permanents with that set’s expansion symbol except for basic lands"; + } + + public WorldBottlingKitEffect(final WorldBottlingKitEffect effect) { + super(effect); + } + + @Override + public WorldBottlingKitEffect copy() { + return new WorldBottlingKitEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + ChooseExpansionSetEffect effect = new ChooseExpansionSetEffect(Outcome.Exile); + effect.apply(game, source); + String setChosen = null; + if (effect.getValue("setchosen") != null) { + setChosen = (String) effect.getValue("setchosen"); + } else if (game.getState().getValue(this.getId() + "_set") != null) { + setChosen = (String) game.getState().getValue(this.getId() + "_set"); + } + if (setChosen != null) { + game.informPlayers(controller.getLogName() + " has chosen set " + setChosen); + FilterPermanent filter = new FilterPermanent(); + filter.add(Predicates.not(Predicates.and(new CardTypePredicate(CardType.LAND), new SupertypePredicate(SuperType.BASIC)))); + List permanents = game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source.getSourceId(), game); + for (Permanent permanent : permanents) { + if (permanent.getExpansionSetCode().equals(setChosen)) { + controller.moveCardToExileWithInfo(permanent, null, "", source.getSourceId(), game, Zone.BATTLEFIELD, true); + } + } + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/x/XenagosTheReveler.java b/Mage.Sets/src/mage/cards/x/XenagosTheReveler.java index a4b279e83d4..e09453a1390 100644 --- a/Mage.Sets/src/mage/cards/x/XenagosTheReveler.java +++ b/Mage.Sets/src/mage/cards/x/XenagosTheReveler.java @@ -7,7 +7,7 @@ import java.util.UUID; import mage.Mana; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateTokenEffect; import mage.cards.CardImpl; @@ -41,7 +41,7 @@ public final class XenagosTheReveler extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.XENAGOS); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3)); // +1: Add X mana in any combination of {R} and/or {G}, where X is the number of creatures you control. this.addAbility(new LoyaltyAbility(new XenagosManaEffect(), +1)); diff --git a/Mage.Sets/src/mage/cards/x/Xenograft.java b/Mage.Sets/src/mage/cards/x/Xenograft.java index c25914ae081..2e08278a7a9 100644 --- a/Mage.Sets/src/mage/cards/x/Xenograft.java +++ b/Mage.Sets/src/mage/cards/x/Xenograft.java @@ -53,7 +53,7 @@ class XenograftAddSubtypeEffect extends ContinuousEffectImpl { @Override public boolean apply(Game game, Ability source) { - SubType subType = ChooseCreatureTypeEffect.getChoosenCreatureType(source.getSourceId(), game); + SubType subType = ChooseCreatureTypeEffect.getChosenCreatureType(source.getSourceId(), game); if (subType != null) { List permanents = game.getBattlefield().getAllActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURE, source.getControllerId(), game); for (Permanent permanent : permanents) { diff --git a/Mage.Sets/src/mage/cards/y/YodaJediMaster.java b/Mage.Sets/src/mage/cards/y/YodaJediMaster.java index 3b1dcb27d6f..94bd681f28d 100644 --- a/Mage.Sets/src/mage/cards/y/YodaJediMaster.java +++ b/Mage.Sets/src/mage/cards/y/YodaJediMaster.java @@ -4,7 +4,7 @@ package mage.cards.y; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.Effect; @@ -46,7 +46,7 @@ public final class YodaJediMaster extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{1}{G}{U}"); this.subtype.add(SubType.YODA); - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3)); // +1: Look at the top two cards of your library. Put one on the bottom of your library. Effect effect = new LookLibraryAndPickControllerEffect(new StaticValue(2), false, new StaticValue(1), diff --git a/Mage.Sets/src/mage/cards/z/ZephyrGull.java b/Mage.Sets/src/mage/cards/z/ZephyrGull.java new file mode 100644 index 00000000000..5b246992051 --- /dev/null +++ b/Mage.Sets/src/mage/cards/z/ZephyrGull.java @@ -0,0 +1,36 @@ +package mage.cards.z; + +import mage.MageInt; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; + +import java.util.UUID; + +/** + * @author JayDi85 + */ +public final class ZephyrGull extends CardImpl { + + public ZephyrGull(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{U}"); + this.subtype.add(SubType.BIRD); + + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + } + + public ZephyrGull(final ZephyrGull card) { + super(card); + } + + @Override + public ZephyrGull copy() { + return new ZephyrGull(this); + } +} diff --git a/Mage.Sets/src/mage/cards/z/ZzzyxassAbyss.java b/Mage.Sets/src/mage/cards/z/ZzzyxassAbyss.java new file mode 100644 index 00000000000..62b9a3cd679 --- /dev/null +++ b/Mage.Sets/src/mage/cards/z/ZzzyxassAbyss.java @@ -0,0 +1,82 @@ + +package mage.cards.z; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DestroyAllEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.TargetController; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterNonlandPermanent; +import mage.filter.predicate.mageobject.NamePredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; + +/** + * + * @author L_J + */ +public final class ZzzyxassAbyss extends CardImpl { + + public ZzzyxassAbyss(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{1}{B}{B}"); + + // At the beginning of your upkeep, destroy all nonland permanents with the first name alphabetically among nonland permanents. + this.addAbility(new BeginningOfUpkeepTriggeredAbility(new ZzzyxassAbyssEffect(), TargetController.YOU, false)); + } + + public ZzzyxassAbyss(final ZzzyxassAbyss card) { + super(card); + } + + @Override + public ZzzyxassAbyss copy() { + return new ZzzyxassAbyss(this); + } + +} + +class ZzzyxassAbyssEffect extends OneShotEffect { + + public ZzzyxassAbyssEffect() { + super(Outcome.DestroyPermanent); + this.staticText = "destroy all nonland permanents with the first name alphabetically among nonland permanents"; + } + + public ZzzyxassAbyssEffect(final ZzzyxassAbyssEffect effect) { + super(effect); + } + + @Override + public ZzzyxassAbyssEffect copy() { + return new ZzzyxassAbyssEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + List permanentNames = new ArrayList<>(); + FilterPermanent filter = new FilterNonlandPermanent(); + for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, controller.getId(), game)) { + permanentNames.add(permanent.getName()); + } + if (permanentNames.isEmpty()) { + return true; + } + Collections.sort(permanentNames); + filter.add(new NamePredicate(permanentNames.get(0))); + return new DestroyAllEffect(filter).apply(game, source); + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/Alliances.java b/Mage.Sets/src/mage/sets/Alliances.java index 1553e50b598..e53b14b61d4 100644 --- a/Mage.Sets/src/mage/sets/Alliances.java +++ b/Mage.Sets/src/mage/sets/Alliances.java @@ -23,6 +23,7 @@ public final class Alliances extends ExpansionSet { this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; + cards.add(new SetCardInfo("Aesthir Glider", "116a", Rarity.COMMON, mage.cards.a.AesthirGlider.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Aesthir Glider", "116b", Rarity.COMMON, mage.cards.a.AesthirGlider.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Agent of Stromgald", "64a", Rarity.COMMON, mage.cards.a.AgentOfStromgald.class, NON_FULL_USE_VARIOUS)); @@ -67,12 +68,12 @@ public final class Alliances extends ExpansionSet { cards.add(new SetCardInfo("False Demise", "27b", Rarity.COMMON, mage.cards.f.FalseDemise.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Feast or Famine", "49a", Rarity.COMMON, mage.cards.f.FeastOrFamine.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Feast or Famine", "49b", Rarity.COMMON, mage.cards.f.FeastOrFamine.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Fevered Strength", "50a", Rarity.COMMON, mage.cards.f.FeveredStrength.class)); - cards.add(new SetCardInfo("Fevered Strength", "50b", Rarity.COMMON, mage.cards.f.FeveredStrength.class)); + cards.add(new SetCardInfo("Fevered Strength", "50a", Rarity.COMMON, mage.cards.f.FeveredStrength.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Fevered Strength", "50b", Rarity.COMMON, mage.cards.f.FeveredStrength.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Floodwater Dam", 119, Rarity.RARE, mage.cards.f.FloodwaterDam.class)); cards.add(new SetCardInfo("Force of Will", 28, Rarity.UNCOMMON, mage.cards.f.ForceOfWill.class)); - cards.add(new SetCardInfo("Foresight", "29a", Rarity.COMMON, mage.cards.f.Foresight.class)); - cards.add(new SetCardInfo("Foresight", "29b", Rarity.COMMON, mage.cards.f.Foresight.class)); + cards.add(new SetCardInfo("Foresight", "29a", Rarity.COMMON, mage.cards.f.Foresight.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Foresight", "29b", Rarity.COMMON, mage.cards.f.Foresight.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Gorilla Berserkers", "93a", Rarity.COMMON, mage.cards.g.GorillaBerserkers.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Gorilla Berserkers", "93b", Rarity.COMMON, mage.cards.g.GorillaBerserkers.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Gorilla Chieftain", "94a", Rarity.COMMON, mage.cards.g.GorillaChieftain.class, NON_FULL_USE_VARIOUS)); @@ -100,8 +101,8 @@ public final class Alliances extends ExpansionSet { cards.add(new SetCardInfo("Krovikan Horror", 53, Rarity.RARE, mage.cards.k.KrovikanHorror.class)); cards.add(new SetCardInfo("Krovikan Plague", 54, Rarity.UNCOMMON, mage.cards.k.KrovikanPlague.class)); cards.add(new SetCardInfo("Lake of the Dead", 140, Rarity.RARE, mage.cards.l.LakeOfTheDead.class)); - cards.add(new SetCardInfo("Lat-Nam's Legacy", "30a", Rarity.COMMON, mage.cards.l.LatNamsLegacy.class)); - cards.add(new SetCardInfo("Lat-Nam's Legacy", "30b", Rarity.COMMON, mage.cards.l.LatNamsLegacy.class)); + cards.add(new SetCardInfo("Lat-Nam's Legacy", "30a", Rarity.COMMON, mage.cards.l.LatNamsLegacy.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Lat-Nam's Legacy", "30b", Rarity.COMMON, mage.cards.l.LatNamsLegacy.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Library of Lat-Nam", 31, Rarity.RARE, mage.cards.l.LibraryOfLatNam.class)); cards.add(new SetCardInfo("Lim-Dul's High Guard", "55a", Rarity.COMMON, mage.cards.l.LimDulsHighGuard.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Lim-Dul's High Guard", "55b", Rarity.COMMON, mage.cards.l.LimDulsHighGuard.class, NON_FULL_USE_VARIOUS)); @@ -136,8 +137,8 @@ public final class Alliances extends ExpansionSet { cards.add(new SetCardInfo("Reprisal", "13b", Rarity.COMMON, mage.cards.r.Reprisal.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Ritual of the Machine", 59, Rarity.RARE, mage.cards.r.RitualOfTheMachine.class)); cards.add(new SetCardInfo("Royal Decree", 14, Rarity.RARE, mage.cards.r.RoyalDecree.class)); - cards.add(new SetCardInfo("Royal Herbalist", "15a", Rarity.COMMON, mage.cards.r.RoyalHerbalist.class)); - cards.add(new SetCardInfo("Royal Herbalist", "15b", Rarity.COMMON, mage.cards.r.RoyalHerbalist.class)); + cards.add(new SetCardInfo("Royal Herbalist", "15a", Rarity.COMMON, mage.cards.r.RoyalHerbalist.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Royal Herbalist", "15b", Rarity.COMMON, mage.cards.r.RoyalHerbalist.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("School of the Unseen", 141, Rarity.UNCOMMON, mage.cards.s.SchoolOfTheUnseen.class)); cards.add(new SetCardInfo("Seasoned Tactician", 17, Rarity.UNCOMMON, mage.cards.s.SeasonedTactician.class)); cards.add(new SetCardInfo("Sheltered Valley", 142, Rarity.RARE, mage.cards.s.ShelteredValley.class)); @@ -159,8 +160,8 @@ public final class Alliances extends ExpansionSet { cards.add(new SetCardInfo("Storm Cauldron", 134, Rarity.RARE, mage.cards.s.StormCauldron.class)); cards.add(new SetCardInfo("Storm Crow", "36a", Rarity.COMMON, mage.cards.s.StormCrow.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Storm Crow", "36b", Rarity.COMMON, mage.cards.s.StormCrow.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Storm Shaman", "81a", Rarity.COMMON, mage.cards.s.StormShaman.class)); - cards.add(new SetCardInfo("Storm Shaman", "81b", Rarity.COMMON, mage.cards.s.StormShaman.class)); + cards.add(new SetCardInfo("Storm Shaman", "81a", Rarity.COMMON, mage.cards.s.StormShaman.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Storm Shaman", "81b", Rarity.COMMON, mage.cards.s.StormShaman.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Stromgald Spy", 62, Rarity.UNCOMMON, mage.cards.s.StromgaldSpy.class)); cards.add(new SetCardInfo("Surge of Strength", 109, Rarity.UNCOMMON, mage.cards.s.SurgeOfStrength.class)); cards.add(new SetCardInfo("Sustaining Spirit", 18, Rarity.RARE, mage.cards.s.SustainingSpirit.class)); diff --git a/Mage.Sets/src/mage/sets/Anthologies.java b/Mage.Sets/src/mage/sets/Anthologies.java new file mode 100644 index 00000000000..17df9798d6c --- /dev/null +++ b/Mage.Sets/src/mage/sets/Anthologies.java @@ -0,0 +1,110 @@ +package mage.sets; + +import mage.cards.ExpansionSet; +import mage.constants.Rarity; +import mage.constants.SetType; + +/** + * + * @author JayDi85 + */ +public final class Anthologies extends ExpansionSet { + + private static final Anthologies instance = new Anthologies(); + + public static Anthologies getInstance() { + return instance; + } + + private Anthologies() { + super("Anthologies", "ATH", ExpansionSet.buildDate(1998, 11, 01), SetType.SUPPLEMENTAL); + this.hasBoosters = false; + this.hasBasicLands = true; + + cards.add(new SetCardInfo("Aesthir Glider", 67, Rarity.COMMON, mage.cards.a.AesthirGlider.class)); + cards.add(new SetCardInfo("Armageddon", 1, Rarity.RARE, mage.cards.a.Armageddon.class)); + cards.add(new SetCardInfo("Armored Pegasus", 2, Rarity.COMMON, mage.cards.a.ArmoredPegasus.class)); + cards.add(new SetCardInfo("Benalish Knight", 3, Rarity.COMMON, mage.cards.b.BenalishKnight.class)); + cards.add(new SetCardInfo("Black Knight", 20, Rarity.UNCOMMON, mage.cards.b.BlackKnight.class)); + cards.add(new SetCardInfo("Brushland", 71, Rarity.RARE, mage.cards.b.Brushland.class)); + cards.add(new SetCardInfo("Canopy Spider", 52, Rarity.COMMON, mage.cards.c.CanopySpider.class)); + cards.add(new SetCardInfo("Carnivorous Plant", 53, Rarity.COMMON, mage.cards.c.CarnivorousPlant.class)); + cards.add(new SetCardInfo("Combat Medic", 4, Rarity.COMMON, mage.cards.c.CombatMedic.class)); + cards.add(new SetCardInfo("Cuombajj Witches", 21, Rarity.COMMON, mage.cards.c.CuombajjWitches.class)); + cards.add(new SetCardInfo("Disenchant", 5, Rarity.COMMON, mage.cards.d.Disenchant.class)); + cards.add(new SetCardInfo("Drifting Meadow", 72, Rarity.COMMON, mage.cards.d.DriftingMeadow.class)); + cards.add(new SetCardInfo("Erhnam Djinn", 54, Rarity.UNCOMMON, mage.cards.e.ErhnamDjinn.class)); + cards.add(new SetCardInfo("Feast of the Unicorn", 22, Rarity.COMMON, mage.cards.f.FeastOfTheUnicorn.class)); + cards.add(new SetCardInfo("Fireball", 29, Rarity.COMMON, mage.cards.f.Fireball.class)); + cards.add(new SetCardInfo("Forest", 84, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Forest", 85, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Freewind Falcon", 6, Rarity.COMMON, mage.cards.f.FreewindFalcon.class)); + cards.add(new SetCardInfo("Giant Growth", 55, Rarity.COMMON, mage.cards.g.GiantGrowth.class)); + cards.add(new SetCardInfo("Giant Spider", 56, Rarity.COMMON, mage.cards.g.GiantSpider.class)); + cards.add(new SetCardInfo("Goblin Balloon Brigade", 30, Rarity.COMMON, mage.cards.g.GoblinBalloonBrigade.class)); + cards.add(new SetCardInfo("Goblin Digging Team", 31, Rarity.COMMON, mage.cards.g.GoblinDiggingTeam.class)); + cards.add(new SetCardInfo("Goblin Grenade", 32, Rarity.COMMON, mage.cards.g.GoblinGrenade.class)); + cards.add(new SetCardInfo("Goblin Hero", 33, Rarity.COMMON, mage.cards.g.GoblinHero.class)); + cards.add(new SetCardInfo("Goblin King", 34, Rarity.RARE, mage.cards.g.GoblinKing.class)); + cards.add(new SetCardInfo("Goblin Matron", 35, Rarity.UNCOMMON, mage.cards.g.GoblinMatron.class)); + cards.add(new SetCardInfo("Goblin Mutant", 36, Rarity.UNCOMMON, mage.cards.g.GoblinMutant.class)); + cards.add(new SetCardInfo("Goblin Offensive", 37, Rarity.UNCOMMON, mage.cards.g.GoblinOffensive.class)); + cards.add(new SetCardInfo("Goblin Recruiter", 38, Rarity.UNCOMMON, mage.cards.g.GoblinRecruiter.class)); + cards.add(new SetCardInfo("Goblin Snowman", 39, Rarity.UNCOMMON, mage.cards.g.GoblinSnowman.class)); + cards.add(new SetCardInfo("Goblin Tinkerer", 40, Rarity.COMMON, mage.cards.g.GoblinTinkerer.class)); + cards.add(new SetCardInfo("Goblin Vandal", 41, Rarity.COMMON, mage.cards.g.GoblinVandal.class)); + cards.add(new SetCardInfo("Goblin Warrens", 42, Rarity.RARE, mage.cards.g.GoblinWarrens.class)); + cards.add(new SetCardInfo("Gorilla Chieftain", 57, Rarity.COMMON, mage.cards.g.GorillaChieftain.class)); + cards.add(new SetCardInfo("Hurricane", 58, Rarity.UNCOMMON, mage.cards.h.Hurricane.class)); + cards.add(new SetCardInfo("Hymn to Tourach", 23, Rarity.COMMON, mage.cards.h.HymnToTourach.class)); + cards.add(new SetCardInfo("Hypnotic Specter", 24, Rarity.UNCOMMON, mage.cards.h.HypnoticSpecter.class)); + cards.add(new SetCardInfo("Icatian Javelineers", 7, Rarity.COMMON, mage.cards.i.IcatianJavelineers.class)); + cards.add(new SetCardInfo("Ihsan's Shade", 25, Rarity.UNCOMMON, mage.cards.i.IhsansShade.class)); + cards.add(new SetCardInfo("Infantry Veteran", 8, Rarity.COMMON, mage.cards.i.InfantryVeteran.class)); + cards.add(new SetCardInfo("Jalum Tome", 68, Rarity.UNCOMMON, mage.cards.j.JalumTome.class)); + cards.add(new SetCardInfo("Knight of Stromgald", 26, Rarity.UNCOMMON, mage.cards.k.KnightOfStromgald.class)); + cards.add(new SetCardInfo("Lady Orca", 65, Rarity.UNCOMMON, mage.cards.l.LadyOrca.class)); + cards.add(new SetCardInfo("Lightning Bolt", 43, Rarity.COMMON, mage.cards.l.LightningBolt.class)); + cards.add(new SetCardInfo("Llanowar Elves", 59, Rarity.COMMON, mage.cards.l.LlanowarElves.class)); + cards.add(new SetCardInfo("Mirri, Cat Warrior", 60, Rarity.UNCOMMON, mage.cards.m.MirriCatWarrior.class)); + cards.add(new SetCardInfo("Mogg Fanatic", 44, Rarity.COMMON, mage.cards.m.MoggFanatic.class)); + cards.add(new SetCardInfo("Mogg Flunkies", 45, Rarity.COMMON, mage.cards.m.MoggFlunkies.class)); + cards.add(new SetCardInfo("Mogg Raider", 46, Rarity.COMMON, mage.cards.m.MoggRaider.class)); + cards.add(new SetCardInfo("Mountain", 82, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mountain", 83, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Nevinyrral's Disk", 69, Rarity.RARE, mage.cards.n.NevinyrralsDisk.class)); + cards.add(new SetCardInfo("Order of the White Shield", 9, Rarity.UNCOMMON, mage.cards.o.OrderOfTheWhiteShield.class)); + cards.add(new SetCardInfo("Overrun", 61, Rarity.UNCOMMON, mage.cards.o.Overrun.class)); + cards.add(new SetCardInfo("Pacifism", 10, Rarity.COMMON, mage.cards.p.Pacifism.class)); + cards.add(new SetCardInfo("Pegasus Charger", 11, Rarity.COMMON, mage.cards.p.PegasusCharger.class)); + cards.add(new SetCardInfo("Pegasus Stampede", 12, Rarity.UNCOMMON, mage.cards.p.PegasusStampede.class)); + cards.add(new SetCardInfo("Pendelhaven", 73, Rarity.UNCOMMON, mage.cards.p.Pendelhaven.class)); + cards.add(new SetCardInfo("Plains", 78, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Plains", 79, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Polluted Mire", 74, Rarity.COMMON, mage.cards.p.PollutedMire.class)); + cards.add(new SetCardInfo("Pyrokinesis", 47, Rarity.UNCOMMON, mage.cards.p.Pyrokinesis.class)); + cards.add(new SetCardInfo("Pyrotechnics", 48, Rarity.COMMON, mage.cards.p.Pyrotechnics.class)); + cards.add(new SetCardInfo("Raging Goblin", 49, Rarity.UNCOMMON, mage.cards.r.RagingGoblin.class)); + cards.add(new SetCardInfo("Ranger en-Vec", 66, Rarity.UNCOMMON, mage.cards.r.RangerEnVec.class)); + cards.add(new SetCardInfo("Sacred Mesa", 13, Rarity.RARE, mage.cards.s.SacredMesa.class)); + cards.add(new SetCardInfo("Samite Healer", 14, Rarity.COMMON, mage.cards.s.SamiteHealer.class)); + cards.add(new SetCardInfo("Scavenger Folk", 62, Rarity.COMMON, mage.cards.s.ScavengerFolk.class)); + cards.add(new SetCardInfo("Serra Angel", 15, Rarity.UNCOMMON, mage.cards.s.SerraAngel.class)); + cards.add(new SetCardInfo("Serrated Arrows", 70, Rarity.COMMON, mage.cards.s.SerratedArrows.class)); + cards.add(new SetCardInfo("Slippery Karst", 75, Rarity.COMMON, mage.cards.s.SlipperyKarst.class)); + cards.add(new SetCardInfo("Smoldering Crater", 76, Rarity.COMMON, mage.cards.s.SmolderingCrater.class)); + cards.add(new SetCardInfo("Spectral Bears", 63, Rarity.UNCOMMON, mage.cards.s.SpectralBears.class)); + cards.add(new SetCardInfo("Strip Mine", 77, Rarity.RARE, mage.cards.s.StripMine.class)); + cards.add(new SetCardInfo("Swamp", 80, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Swamp", 81, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Swords to Plowshares", 16, Rarity.UNCOMMON, mage.cards.s.SwordsToPlowshares.class)); + cards.add(new SetCardInfo("Terror", 27, Rarity.COMMON, mage.cards.t.Terror.class)); + cards.add(new SetCardInfo("Unholy Strength", 28, Rarity.COMMON, mage.cards.u.UnholyStrength.class)); + cards.add(new SetCardInfo("Uthden Troll", 50, Rarity.UNCOMMON, mage.cards.u.UthdenTroll.class)); + cards.add(new SetCardInfo("Volcanic Dragon", 51, Rarity.RARE, mage.cards.v.VolcanicDragon.class)); + cards.add(new SetCardInfo("Warrior's Honor", 17, Rarity.COMMON, mage.cards.w.WarriorsHonor.class)); + cards.add(new SetCardInfo("White Knight", 18, Rarity.UNCOMMON, mage.cards.w.WhiteKnight.class)); + cards.add(new SetCardInfo("Woolly Spider", 64, Rarity.COMMON, mage.cards.w.WoollySpider.class)); + cards.add(new SetCardInfo("Youthful Knight", 19, Rarity.COMMON, mage.cards.y.YouthfulKnight.class)); + } +} diff --git a/Mage.Sets/src/mage/sets/Antiquities.java b/Mage.Sets/src/mage/sets/Antiquities.java index 45188cd211f..d9ab4d74dd7 100644 --- a/Mage.Sets/src/mage/sets/Antiquities.java +++ b/Mage.Sets/src/mage/sets/Antiquities.java @@ -1,4 +1,3 @@ - package mage.sets; import mage.cards.ExpansionSet; @@ -41,7 +40,7 @@ public final class Antiquities extends ExpansionSet { cards.add(new SetCardInfo("Atog", 23, Rarity.COMMON, mage.cards.a.Atog.class)); cards.add(new SetCardInfo("Battering Ram", 41, Rarity.COMMON, mage.cards.b.BatteringRam.class)); cards.add(new SetCardInfo("Candelabra of Tawnos", 43, Rarity.RARE, mage.cards.c.CandelabraOfTawnos.class)); - cards.add(new SetCardInfo("Circle of Protection: Artifacts", 4, Rarity.COMMON, mage.cards.c.CircleOfProtectionArtifacts.class)); + cards.add(new SetCardInfo("Circle of Protection: Artifacts", 4, Rarity.UNCOMMON, mage.cards.c.CircleOfProtectionArtifacts.class)); cards.add(new SetCardInfo("Citanul Druid", 31, Rarity.UNCOMMON, mage.cards.c.CitanulDruid.class)); cards.add(new SetCardInfo("Clay Statue", 44, Rarity.COMMON, mage.cards.c.ClayStatue.class)); cards.add(new SetCardInfo("Clockwork Avian", 45, Rarity.RARE, mage.cards.c.ClockworkAvian.class)); diff --git a/Mage.Sets/src/mage/sets/ArabianNights.java b/Mage.Sets/src/mage/sets/ArabianNights.java index 7776d5f2bb6..05f01c9e54e 100644 --- a/Mage.Sets/src/mage/sets/ArabianNights.java +++ b/Mage.Sets/src/mage/sets/ArabianNights.java @@ -2,18 +2,10 @@ package mage.sets; import mage.cards.ExpansionSet; -import mage.cards.a.ArmyOfAllah; -import mage.cards.f.FishliverOil; -import mage.cards.n.NafsAsp; -import mage.cards.o.Oubliette; -import mage.cards.p.Piety; -import mage.cards.r.RukhEgg; -import mage.cards.s.StoneThrowingDevils; import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author North */ public final class ArabianNights extends ExpansionSet { @@ -26,21 +18,22 @@ public final class ArabianNights extends ExpansionSet { private ArabianNights() { super("Arabian Nights", "ARN", ExpansionSet.buildDate(1993, 11, 1), SetType.EXPANSION); - this.hasBasicLands = false; + this.hasBasicLands = true; this.hasBoosters = true; this.numBoosterLands = 1; this.numBoosterCommon = 10; this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; + cards.add(new SetCardInfo("Abu Ja'far", 1, Rarity.UNCOMMON, mage.cards.a.AbuJafar.class)); cards.add(new SetCardInfo("Aladdin", 34, Rarity.RARE, mage.cards.a.Aladdin.class)); cards.add(new SetCardInfo("Aladdin's Lamp", 56, Rarity.RARE, mage.cards.a.AladdinsLamp.class)); cards.add(new SetCardInfo("Aladdin's Ring", 57, Rarity.RARE, mage.cards.a.AladdinsRing.class)); cards.add(new SetCardInfo("Ali Baba", 35, Rarity.UNCOMMON, mage.cards.a.AliBaba.class)); cards.add(new SetCardInfo("Ali from Cairo", 36, Rarity.RARE, mage.cards.a.AliFromCairo.class)); - cards.add(new SetCardInfo("Army of Allah", "2a", Rarity.COMMON, ArmyOfAllah.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Army of Allah", "2b", Rarity.COMMON, ArmyOfAllah.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Army of Allah", "2a", Rarity.COMMON, mage.cards.a.ArmyOfAllah.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Army of Allah", "2b", Rarity.COMMON, mage.cards.a.ArmyOfAllah.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Bazaar of Baghdad", 70, Rarity.UNCOMMON, mage.cards.b.BazaarOfBaghdad.class)); cards.add(new SetCardInfo("Bird Maiden", "37a", Rarity.COMMON, mage.cards.b.BirdMaiden.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Bird Maiden", "37b", Rarity.COMMON, mage.cards.b.BirdMaiden.class, NON_FULL_USE_VARIOUS)); @@ -65,8 +58,8 @@ public final class ArabianNights extends ExpansionSet { cards.add(new SetCardInfo("Erg Raiders", "25b", Rarity.COMMON, mage.cards.e.ErgRaiders.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Erhnam Djinn", 48, Rarity.RARE, mage.cards.e.ErhnamDjinn.class)); cards.add(new SetCardInfo("Eye for an Eye", 4, Rarity.UNCOMMON, mage.cards.e.EyeForAnEye.class)); - cards.add(new SetCardInfo("Fishliver Oil", "13a", Rarity.COMMON, FishliverOil.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Fishliver Oil", "13b", Rarity.COMMON, FishliverOil.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Fishliver Oil", "13a", Rarity.COMMON, mage.cards.f.FishliverOil.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Fishliver Oil", "13b", Rarity.COMMON, mage.cards.f.FishliverOil.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Flying Carpet", 63, Rarity.UNCOMMON, mage.cards.f.FlyingCarpet.class)); cards.add(new SetCardInfo("Flying Men", 14, Rarity.COMMON, mage.cards.f.FlyingMen.class)); cards.add(new SetCardInfo("Ghazban Ogre", 49, Rarity.COMMON, mage.cards.g.GhazbanOgre.class)); @@ -95,19 +88,19 @@ public final class ArabianNights extends ExpansionSet { cards.add(new SetCardInfo("Moorish Cavalry", "7a", Rarity.COMMON, mage.cards.m.MoorishCavalry.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Moorish Cavalry", "7b", Rarity.COMMON, mage.cards.m.MoorishCavalry.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Mountain", 77, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Nafs Asp", "52a", Rarity.COMMON, NafsAsp.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Nafs Asp", "52b", Rarity.COMMON, NafsAsp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Nafs Asp", "52a", Rarity.COMMON, mage.cards.n.NafsAsp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Nafs Asp", "52b", Rarity.COMMON, mage.cards.n.NafsAsp.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Oasis", 78, Rarity.UNCOMMON, mage.cards.o.Oasis.class)); cards.add(new SetCardInfo("Old Man of the Sea", 18, Rarity.RARE, mage.cards.o.OldManOfTheSea.class)); - cards.add(new SetCardInfo("Oubliette", "31a", Rarity.COMMON, Oubliette.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Oubliette", "31b", Rarity.COMMON, Oubliette.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Piety", "8a", Rarity.COMMON, Piety.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Piety", "8b", Rarity.COMMON, Piety.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Oubliette", "31a", Rarity.COMMON, mage.cards.o.Oubliette.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Oubliette", "31b", Rarity.COMMON, mage.cards.o.Oubliette.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Piety", "8a", Rarity.COMMON, mage.cards.p.Piety.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Piety", "8b", Rarity.COMMON, mage.cards.p.Piety.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Pyramids", 67, Rarity.RARE, mage.cards.p.Pyramids.class)); cards.add(new SetCardInfo("Repentant Blacksmith", 9, Rarity.RARE, mage.cards.r.RepentantBlacksmith.class)); cards.add(new SetCardInfo("Ring of Ma'ruf", 68, Rarity.RARE, mage.cards.r.RingOfMaruf.class)); - cards.add(new SetCardInfo("Rukh Egg", "43a", Rarity.COMMON, RukhEgg.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Rukh Egg", "43b", Rarity.COMMON, RukhEgg.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Rukh Egg", "43a", Rarity.COMMON, mage.cards.r.RukhEgg.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Rukh Egg", "43b", Rarity.COMMON, mage.cards.r.RukhEgg.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Sandals of Abdallah", 69, Rarity.UNCOMMON, mage.cards.s.SandalsOfAbdallah.class)); cards.add(new SetCardInfo("Sandstorm", 53, Rarity.COMMON, mage.cards.s.Sandstorm.class)); cards.add(new SetCardInfo("Serendib Djinn", 19, Rarity.RARE, mage.cards.s.SerendibDjinn.class)); @@ -115,8 +108,8 @@ public final class ArabianNights extends ExpansionSet { cards.add(new SetCardInfo("Sindbad", 21, Rarity.UNCOMMON, mage.cards.s.Sindbad.class)); cards.add(new SetCardInfo("Singing Tree", 54, Rarity.RARE, mage.cards.s.SingingTree.class)); cards.add(new SetCardInfo("Sorceress Queen", 32, Rarity.UNCOMMON, mage.cards.s.SorceressQueen.class)); - cards.add(new SetCardInfo("Stone-Throwing Devils", "33a", Rarity.COMMON, StoneThrowingDevils.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Stone-Throwing Devils", "33b", Rarity.COMMON, StoneThrowingDevils.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Stone-Throwing Devils", "33a", Rarity.COMMON, mage.cards.s.StoneThrowingDevils.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Stone-Throwing Devils", "33b", Rarity.COMMON, mage.cards.s.StoneThrowingDevils.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Unstable Mutation", 22, Rarity.COMMON, mage.cards.u.UnstableMutation.class)); cards.add(new SetCardInfo("War Elephant", "11a", Rarity.COMMON, mage.cards.w.WarElephant.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("War Elephant", "11b", Rarity.COMMON, mage.cards.w.WarElephant.class, NON_FULL_USE_VARIOUS)); @@ -124,4 +117,4 @@ public final class ArabianNights extends ExpansionSet { cards.add(new SetCardInfo("Wyluli Wolf", "55b", Rarity.COMMON, mage.cards.w.WyluliWolf.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Ydwen Efreet", 44, Rarity.RARE, mage.cards.y.YdwenEfreet.class)); } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/ArenaNewPlayerExperience.java b/Mage.Sets/src/mage/sets/ArenaNewPlayerExperience.java new file mode 100644 index 00000000000..aaad1327f93 --- /dev/null +++ b/Mage.Sets/src/mage/sets/ArenaNewPlayerExperience.java @@ -0,0 +1,63 @@ +package mage.sets; + +import mage.cards.ExpansionSet; +import mage.constants.Rarity; +import mage.constants.SetType; + +/** + * @author JayDi85 + */ +public final class ArenaNewPlayerExperience extends ExpansionSet { + + private static final ArenaNewPlayerExperience instance = new ArenaNewPlayerExperience(); + + public static ArenaNewPlayerExperience getInstance() { + return instance; + } + + private ArenaNewPlayerExperience() { + super("Arena New Player Experience", "ANA", ExpansionSet.buildDate(2018, 7, 29), SetType.MAGIC_ONLINE); + this.hasBoosters = false; + this.hasBasicLands = false; + + cards.add(new SetCardInfo("Altar's Reap", 24, Rarity.COMMON, mage.cards.a.AltarsReap.class)); + cards.add(new SetCardInfo("Ambition's Cost", 25, Rarity.UNCOMMON, mage.cards.a.AmbitionsCost.class)); + cards.add(new SetCardInfo("Angelic Reward", 1, Rarity.UNCOMMON, mage.cards.a.AngelicReward.class)); + cards.add(new SetCardInfo("Blinding Radiance", 2, Rarity.UNCOMMON, mage.cards.b.BlindingRadiance.class)); + cards.add(new SetCardInfo("Chaos Maw", 36, Rarity.RARE, mage.cards.c.ChaosMaw.class)); + cards.add(new SetCardInfo("Confront the Assault", 3, Rarity.UNCOMMON, mage.cards.c.ConfrontTheAssault.class)); + cards.add(new SetCardInfo("Cruel Cut", 26, Rarity.COMMON, mage.cards.c.CruelCut.class)); + cards.add(new SetCardInfo("Divination", 14, Rarity.COMMON, mage.cards.d.Divination.class)); + cards.add(new SetCardInfo("Doublecast", 37, Rarity.UNCOMMON, mage.cards.d.Doublecast.class)); + cards.add(new SetCardInfo("Feral Roar", 46, Rarity.COMMON, mage.cards.f.FeralRoar.class)); + cards.add(new SetCardInfo("Goblin Bruiser", 39, Rarity.UNCOMMON, mage.cards.g.GoblinBruiser.class)); + cards.add(new SetCardInfo("Goblin Gang Leader", 40, Rarity.UNCOMMON, mage.cards.g.GoblinGangLeader.class)); + cards.add(new SetCardInfo("Goblin Grenade", 41, Rarity.UNCOMMON, mage.cards.g.GoblinGrenade.class)); + cards.add(new SetCardInfo("Inspiring Commander", 5, Rarity.RARE, mage.cards.i.InspiringCommander.class)); + cards.add(new SetCardInfo("Knight's Pledge", 6, Rarity.COMMON, mage.cards.k.KnightsPledge.class)); + cards.add(new SetCardInfo("Loxodon Line Breaker", 7, Rarity.COMMON, mage.cards.l.LoxodonLineBreaker.class)); + cards.add(new SetCardInfo("Miasmic Mummy", 29, Rarity.COMMON, mage.cards.m.MiasmicMummy.class)); + cards.add(new SetCardInfo("Nimble Pilferer", 31, Rarity.COMMON, mage.cards.n.NimblePilferer.class)); + cards.add(new SetCardInfo("Ogre Painbringer", 42, Rarity.RARE, mage.cards.o.OgrePainbringer.class)); + cards.add(new SetCardInfo("Overflowing Insight", 16, Rarity.MYTHIC, mage.cards.o.OverflowingInsight.class)); + cards.add(new SetCardInfo("Raging Goblin", 43, Rarity.COMMON, mage.cards.r.RagingGoblin.class)); + cards.add(new SetCardInfo("Renegade Demon", 33, Rarity.COMMON, mage.cards.r.RenegadeDemon.class)); + cards.add(new SetCardInfo("Rise from the Grave", 34, Rarity.UNCOMMON, mage.cards.r.RiseFromTheGrave.class)); + cards.add(new SetCardInfo("River's Favor", 17, Rarity.COMMON, mage.cards.r.RiversFavor.class)); + cards.add(new SetCardInfo("Rumbling Baloth", 47, Rarity.COMMON, mage.cards.r.RumblingBaloth.class)); + cards.add(new SetCardInfo("Sanctuary Cat", 8, Rarity.COMMON, mage.cards.s.SanctuaryCat.class)); + cards.add(new SetCardInfo("Seismic Rupture", 44, Rarity.UNCOMMON, mage.cards.s.SeismicRupture.class)); + cards.add(new SetCardInfo("Serra Angel", 9, Rarity.UNCOMMON, mage.cards.s.SerraAngel.class)); + cards.add(new SetCardInfo("Shorecomber Crab", 18, Rarity.COMMON, mage.cards.s.ShorecomberCrab.class)); + cards.add(new SetCardInfo("Shrine Keeper", 10, Rarity.COMMON, mage.cards.s.ShrineKeeper.class)); + cards.add(new SetCardInfo("Soulhunter Rakshasa", 35, Rarity.RARE, mage.cards.s.SoulhunterRakshasa.class)); + cards.add(new SetCardInfo("Spiritual Guardian", 11, Rarity.COMMON, mage.cards.s.SpiritualGuardian.class)); + cards.add(new SetCardInfo("Tactical Advantage", 12, Rarity.COMMON, mage.cards.t.TacticalAdvantage.class)); + cards.add(new SetCardInfo("Take Vengeance", 13, Rarity.COMMON, mage.cards.t.TakeVengeance.class)); + cards.add(new SetCardInfo("Titanic Pelagosaur", 19, Rarity.UNCOMMON, mage.cards.t.TitanicPelagosaur.class)); + cards.add(new SetCardInfo("Treetop Warden", 48, Rarity.COMMON, mage.cards.t.TreetopWarden.class)); + cards.add(new SetCardInfo("Volcanic Dragon", 45, Rarity.UNCOMMON, mage.cards.v.VolcanicDragon.class)); + cards.add(new SetCardInfo("Waterknot", 22, Rarity.COMMON, mage.cards.w.Waterknot.class)); + cards.add(new SetCardInfo("Zephyr Gull", 23, Rarity.COMMON, mage.cards.z.ZephyrGull.class)); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/Battlebond.java b/Mage.Sets/src/mage/sets/Battlebond.java index 3c13280af43..e01ffafdef3 100644 --- a/Mage.Sets/src/mage/sets/Battlebond.java +++ b/Mage.Sets/src/mage/sets/Battlebond.java @@ -5,30 +5,29 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author TheElk801 */ public final class Battlebond extends ExpansionSet { - + private static final Battlebond instance = new Battlebond(); - + public static Battlebond getInstance() { return instance; } - - + + private Battlebond() { super("Battlebond", "BBD", ExpansionSet.buildDate(2018, 6, 8), SetType.SUPPLEMENTAL); this.blockName = "Battlebond"; - this.hasBasicLands = false; + this.hasBasicLands = true; this.hasBoosters = true; this.hasPartnerMechanic = true; - this.numBoosterLands = 0; - this.numBoosterCommon = 11; + this.numBoosterLands = 1; + this.numBoosterCommon = 10; this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 8; - + cards.add(new SetCardInfo("Aim High", 189, Rarity.UNCOMMON, mage.cards.a.AimHigh.class)); cards.add(new SetCardInfo("Angel of Retribution", 86, Rarity.UNCOMMON, mage.cards.a.AngelOfRetribution.class)); cards.add(new SetCardInfo("Angelic Chorus", 87, Rarity.RARE, mage.cards.a.AngelicChorus.class)); @@ -212,8 +211,8 @@ public final class Battlebond extends ExpansionSet { cards.add(new SetCardInfo("Rhox Brute", 227, Rarity.COMMON, mage.cards.r.RhoxBrute.class)); cards.add(new SetCardInfo("Riptide Crab", 228, Rarity.COMMON, mage.cards.r.RiptideCrab.class)); cards.add(new SetCardInfo("Rotfeaster Maggot", 157, Rarity.COMMON, mage.cards.r.RotfeasterMaggot.class)); - cards.add(new SetCardInfo("Rowan Kenrith", 2, Rarity.MYTHIC, mage.cards.r.RowanKenrith.class)); - cards.add(new SetCardInfo("Rowan Kenrith", 256, Rarity.MYTHIC, mage.cards.r.RowanKenrith.class)); + cards.add(new SetCardInfo("Rowan Kenrith", 2, Rarity.MYTHIC, mage.cards.r.RowanKenrith.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Rowan Kenrith", 256, Rarity.MYTHIC, mage.cards.r.RowanKenrith.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Royal Trooper", 104, Rarity.COMMON, mage.cards.r.RoyalTrooper.class)); cards.add(new SetCardInfo("Rushblade Commander", 77, Rarity.UNCOMMON, mage.cards.r.RushbladeCommander.class)); cards.add(new SetCardInfo("Saddleback Lagac", 211, Rarity.COMMON, mage.cards.s.SaddlebackLagac.class)); @@ -279,12 +278,12 @@ public final class Battlebond extends ExpansionSet { cards.add(new SetCardInfo("Wandering Wolf", 216, Rarity.COMMON, mage.cards.w.WanderingWolf.class)); cards.add(new SetCardInfo("War's Toll", 187, Rarity.RARE, mage.cards.w.WarsToll.class)); cards.add(new SetCardInfo("Watercourser", 137, Rarity.COMMON, mage.cards.w.Watercourser.class)); - cards.add(new SetCardInfo("Will Kenrith", 1, Rarity.MYTHIC, mage.cards.w.WillKenrith.class)); - cards.add(new SetCardInfo("Will Kenrith", 255, Rarity.MYTHIC, mage.cards.w.WillKenrith.class)); + cards.add(new SetCardInfo("Will Kenrith", 1, Rarity.MYTHIC, mage.cards.w.WillKenrith.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Will Kenrith", 255, Rarity.MYTHIC, mage.cards.w.WillKenrith.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Wrap in Flames", 188, Rarity.COMMON, mage.cards.w.WrapInFlames.class)); cards.add(new SetCardInfo("Yotian Soldier", 249, Rarity.COMMON, mage.cards.y.YotianSoldier.class)); cards.add(new SetCardInfo("Zndrsplt's Judgment", 43, Rarity.RARE, mage.cards.z.ZndrspltsJudgment.class)); cards.add(new SetCardInfo("Zndrsplt, Eye of Wisdom", 5, Rarity.RARE, mage.cards.z.ZndrspltEyeOfWisdom.class)); } - + } diff --git a/Mage.Sets/src/mage/sets/ChampionsOfKamigawa.java b/Mage.Sets/src/mage/sets/ChampionsOfKamigawa.java index 7a61cbb5dae..c941893a4da 100644 --- a/Mage.Sets/src/mage/sets/ChampionsOfKamigawa.java +++ b/Mage.Sets/src/mage/sets/ChampionsOfKamigawa.java @@ -1,7 +1,6 @@ package mage.sets; import mage.cards.ExpansionSet; -import mage.cards.b.BrothersYamazaki; import mage.constants.Rarity; import mage.constants.SetType; @@ -22,6 +21,7 @@ public final class ChampionsOfKamigawa extends ExpansionSet { this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; + cards.add(new SetCardInfo("Akki Avalanchers", 151, Rarity.COMMON, mage.cards.a.AkkiAvalanchers.class)); cards.add(new SetCardInfo("Akki Coalflinger", 152, Rarity.UNCOMMON, mage.cards.a.AkkiCoalflinger.class)); cards.add(new SetCardInfo("Akki Lavarunner", 153, Rarity.RARE, mage.cards.a.AkkiLavarunner.class)); @@ -40,15 +40,15 @@ public final class ChampionsOfKamigawa extends ExpansionSet { cards.add(new SetCardInfo("Blood Speaker", 103, Rarity.UNCOMMON, mage.cards.b.BloodSpeaker.class)); cards.add(new SetCardInfo("Bloodthirsty Ogre", 104, Rarity.UNCOMMON, mage.cards.b.BloodthirstyOgre.class)); cards.add(new SetCardInfo("Boseiju, Who Shelters All", 273, Rarity.RARE, mage.cards.b.BoseijuWhoSheltersAll.class)); - cards.add(new SetCardInfo("Brothers Yamazaki", "160a", Rarity.UNCOMMON, BrothersYamazaki.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Brothers Yamazaki", "160b", Rarity.UNCOMMON, BrothersYamazaki.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Brothers Yamazaki", "160a", Rarity.UNCOMMON, mage.cards.b.BrothersYamazaki.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Brothers Yamazaki", "160b", Rarity.UNCOMMON, mage.cards.b.BrothersYamazaki.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Brutal Deceiver", 161, Rarity.COMMON, mage.cards.b.BrutalDeceiver.class)); cards.add(new SetCardInfo("Budoka Gardener", 202, Rarity.RARE, mage.cards.b.BudokaGardener.class)); cards.add(new SetCardInfo("Burr Grafter", 203, Rarity.COMMON, mage.cards.b.BurrGrafter.class)); cards.add(new SetCardInfo("Bushi Tenderfoot", 2, Rarity.UNCOMMON, mage.cards.b.BushiTenderfoot.class)); cards.add(new SetCardInfo("Cage of Hands", 3, Rarity.COMMON, mage.cards.c.CageOfHands.class)); - cards.add(new SetCardInfo("Callous Deceiver", 53, Rarity.COMMON, mage.cards.c.CallousDeceiver.class)); cards.add(new SetCardInfo("Call to Glory", 4, Rarity.COMMON, mage.cards.c.CallToGlory.class)); + cards.add(new SetCardInfo("Callous Deceiver", 53, Rarity.COMMON, mage.cards.c.CallousDeceiver.class)); cards.add(new SetCardInfo("Candles' Glow", 5, Rarity.UNCOMMON, mage.cards.c.CandlesGlow.class)); cards.add(new SetCardInfo("Cleanfall", 6, Rarity.UNCOMMON, mage.cards.c.Cleanfall.class)); cards.add(new SetCardInfo("Cloudcrest Lake", 274, Rarity.UNCOMMON, mage.cards.c.CloudcrestLake.class)); @@ -100,19 +100,19 @@ public final class ChampionsOfKamigawa extends ExpansionSet { cards.add(new SetCardInfo("Gutwrencher Oni", 113, Rarity.UNCOMMON, mage.cards.g.GutwrencherOni.class)); cards.add(new SetCardInfo("Hair-Strung Koto", 252, Rarity.RARE, mage.cards.h.HairStrungKoto.class)); cards.add(new SetCardInfo("Hall of the Bandit Lord", 277, Rarity.RARE, mage.cards.h.HallOfTheBanditLord.class)); - cards.add(new SetCardInfo("Hanabi Blast", 170, Rarity.UNCOMMON, mage.cards.h.HanabiBlast.class)); cards.add(new SetCardInfo("Hana Kami", 211, Rarity.UNCOMMON, mage.cards.h.HanaKami.class)); + cards.add(new SetCardInfo("Hanabi Blast", 170, Rarity.UNCOMMON, mage.cards.h.HanabiBlast.class)); cards.add(new SetCardInfo("Hankyu", 253, Rarity.UNCOMMON, mage.cards.h.Hankyu.class)); cards.add(new SetCardInfo("Harsh Deceiver", 11, Rarity.COMMON, mage.cards.h.HarshDeceiver.class)); + cards.add(new SetCardInfo("He Who Hungers", 114, Rarity.RARE, mage.cards.h.HeWhoHungers.class)); cards.add(new SetCardInfo("Heartbeat of Spring", 212, Rarity.RARE, mage.cards.h.HeartbeatOfSpring.class)); cards.add(new SetCardInfo("Hearth Kami", 171, Rarity.COMMON, mage.cards.h.HearthKami.class)); - cards.add(new SetCardInfo("He Who Hungers", 114, Rarity.RARE, mage.cards.h.HeWhoHungers.class)); cards.add(new SetCardInfo("Hideous Laughter", 115, Rarity.UNCOMMON, mage.cards.h.HideousLaughter.class)); cards.add(new SetCardInfo("Hikari, Twilight Guardian", 12, Rarity.RARE, mage.cards.h.HikariTwilightGuardian.class)); cards.add(new SetCardInfo("Hinder", 65, Rarity.UNCOMMON, mage.cards.h.Hinder.class)); - cards.add(new SetCardInfo("Hisoka, Minamo Sensei", 66, Rarity.RARE, mage.cards.h.HisokaMinamoSensei.class)); cards.add(new SetCardInfo("Hisoka's Defiance", 67, Rarity.COMMON, mage.cards.h.HisokasDefiance.class)); cards.add(new SetCardInfo("Hisoka's Guard", 68, Rarity.COMMON, mage.cards.h.HisokasGuard.class)); + cards.add(new SetCardInfo("Hisoka, Minamo Sensei", 66, Rarity.RARE, mage.cards.h.HisokaMinamoSensei.class)); cards.add(new SetCardInfo("Hold the Line", 13, Rarity.RARE, mage.cards.h.HoldTheLine.class)); cards.add(new SetCardInfo("Honden of Cleansing Fire", 14, Rarity.UNCOMMON, mage.cards.h.HondenOfCleansingFire.class)); cards.add(new SetCardInfo("Honden of Infinite Rage", 172, Rarity.UNCOMMON, mage.cards.h.HondenOfInfiniteRage.class)); @@ -130,7 +130,7 @@ public final class ChampionsOfKamigawa extends ExpansionSet { cards.add(new SetCardInfo("Indomitable Will", 17, Rarity.COMMON, mage.cards.i.IndomitableWill.class)); cards.add(new SetCardInfo("Initiate of Blood", 173, Rarity.UNCOMMON, mage.cards.i.InitiateOfBlood.class)); cards.add(new SetCardInfo("Innocence Kami", 18, Rarity.UNCOMMON, mage.cards.i.InnocenceKami.class)); - cards.add(new SetCardInfo("Isamaru, Hound of Konda", 19, Rarity.RARE, mage.cards.i.IsamaruHoundofKonda.class)); + cards.add(new SetCardInfo("Isamaru, Hound of Konda", 19, Rarity.RARE, mage.cards.i.IsamaruHoundOfKonda.class)); cards.add(new SetCardInfo("Island", 291, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Island", 292, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Island", 293, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); @@ -167,11 +167,11 @@ public final class ChampionsOfKamigawa extends ExpansionSet { cards.add(new SetCardInfo("Kodama's Might", 224, Rarity.COMMON, mage.cards.k.KodamasMight.class)); cards.add(new SetCardInfo("Kodama's Reach", 225, Rarity.COMMON, mage.cards.k.KodamasReach.class)); cards.add(new SetCardInfo("Kokusho, the Evening Star", 122, Rarity.RARE, mage.cards.k.KokushoTheEveningStar.class)); - cards.add(new SetCardInfo("Konda, Lord of Eiganjo", 30, Rarity.RARE, mage.cards.k.KondaLordOfEiganjo.class)); cards.add(new SetCardInfo("Konda's Banner", 259, Rarity.RARE, mage.cards.k.KondasBanner.class)); cards.add(new SetCardInfo("Konda's Hatamoto", 31, Rarity.UNCOMMON, mage.cards.k.KondasHatamoto.class)); - cards.add(new SetCardInfo("Kumano, Master Yamabushi", 176, Rarity.RARE, mage.cards.k.KumanoMasterYamabushi.class)); + cards.add(new SetCardInfo("Konda, Lord of Eiganjo", 30, Rarity.RARE, mage.cards.k.KondaLordOfEiganjo.class)); cards.add(new SetCardInfo("Kumano's Pupils", 177, Rarity.UNCOMMON, mage.cards.k.KumanosPupils.class)); + cards.add(new SetCardInfo("Kumano, Master Yamabushi", 176, Rarity.RARE, mage.cards.k.KumanoMasterYamabushi.class)); cards.add(new SetCardInfo("Kuro, Pitlord", 123, Rarity.RARE, mage.cards.k.KuroPitlord.class)); cards.add(new SetCardInfo("Kusari-Gama", 260, Rarity.RARE, mage.cards.k.KusariGama.class)); cards.add(new SetCardInfo("Lantern Kami", 32, Rarity.COMMON, mage.cards.l.LanternKami.class)); @@ -280,9 +280,9 @@ public final class ChampionsOfKamigawa extends ExpansionSet { cards.add(new SetCardInfo("Soratami Savant", 90, Rarity.UNCOMMON, mage.cards.s.SoratamiSavant.class)); cards.add(new SetCardInfo("Soratami Seer", 91, Rarity.UNCOMMON, mage.cards.s.SoratamiSeer.class)); cards.add(new SetCardInfo("Sosuke, Son of Seshiro", 244, Rarity.UNCOMMON, mage.cards.s.SosukeSonOfSeshiro.class)); + cards.add(new SetCardInfo("Soul of Magma", 189, Rarity.COMMON, mage.cards.s.SoulOfMagma.class)); cards.add(new SetCardInfo("Soulblast", 190, Rarity.RARE, mage.cards.s.Soulblast.class)); cards.add(new SetCardInfo("Soulless Revival", 144, Rarity.COMMON, mage.cards.s.SoullessRevival.class)); - cards.add(new SetCardInfo("Soul of Magma", 189, Rarity.COMMON, mage.cards.s.SoulOfMagma.class)); cards.add(new SetCardInfo("Squelch", 92, Rarity.UNCOMMON, mage.cards.s.Squelch.class)); cards.add(new SetCardInfo("Stone Rain", 191, Rarity.COMMON, mage.cards.s.StoneRain.class)); cards.add(new SetCardInfo("Strange Inversion", 192, Rarity.UNCOMMON, mage.cards.s.StrangeInversion.class)); @@ -302,7 +302,7 @@ public final class ChampionsOfKamigawa extends ExpansionSet { cards.add(new SetCardInfo("The Unspeakable", 98, Rarity.RARE, mage.cards.t.TheUnspeakable.class)); cards.add(new SetCardInfo("Thief of Hope", 147, Rarity.UNCOMMON, mage.cards.t.ThiefOfHope.class)); cards.add(new SetCardInfo("Thoughtbind", 96, Rarity.COMMON, mage.cards.t.Thoughtbind.class)); - cards.add(new SetCardInfo("Thousand-legged Kami", 246, Rarity.UNCOMMON, mage.cards.t.ThousandleggedKami.class)); + cards.add(new SetCardInfo("Thousand-legged Kami", 246, Rarity.UNCOMMON, mage.cards.t.ThousandLeggedKami.class)); cards.add(new SetCardInfo("Through the Breach", 193, Rarity.RARE, mage.cards.t.ThroughTheBreach.class)); cards.add(new SetCardInfo("Tide of War", 194, Rarity.RARE, mage.cards.t.TideOfWar.class)); cards.add(new SetCardInfo("Time of Need", 247, Rarity.UNCOMMON, mage.cards.t.TimeOfNeed.class)); @@ -329,5 +329,4 @@ public final class ChampionsOfKamigawa extends ExpansionSet { cards.add(new SetCardInfo("Yosei, the Morning Star", 50, Rarity.RARE, mage.cards.y.YoseiTheMorningStar.class)); cards.add(new SetCardInfo("Zo-Zu the Punisher", 200, Rarity.RARE, mage.cards.z.ZoZuThePunisher.class)); } - -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/Champs.java b/Mage.Sets/src/mage/sets/Champs.java index 63e03751e05..f748aa9a94c 100644 --- a/Mage.Sets/src/mage/sets/Champs.java +++ b/Mage.Sets/src/mage/sets/Champs.java @@ -6,7 +6,6 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author fireshoes */ public final class Champs extends ExpansionSet { @@ -20,6 +19,8 @@ public final class Champs extends ExpansionSet { private Champs() { super("Champs", "CP", ExpansionSet.buildDate(2006, 3, 18), SetType.PROMOTIONAL); this.hasBoosters = false; + this.hasBasicLands = false; + cards.add(new SetCardInfo("Blood Knight", 7, Rarity.SPECIAL, mage.cards.b.BloodKnight.class)); cards.add(new SetCardInfo("Bramblewood Paragon", 11, Rarity.SPECIAL, mage.cards.b.BramblewoodParagon.class)); cards.add(new SetCardInfo("Doran, the Siege Tower", 10, Rarity.SPECIAL, mage.cards.d.DoranTheSiegeTower.class)); diff --git a/Mage.Sets/src/mage/sets/Chronicles.java b/Mage.Sets/src/mage/sets/Chronicles.java index 0ba0d34b1ae..03cde6e56d1 100644 --- a/Mage.Sets/src/mage/sets/Chronicles.java +++ b/Mage.Sets/src/mage/sets/Chronicles.java @@ -1,4 +1,3 @@ - package mage.sets; import mage.cards.ExpansionSet; @@ -30,7 +29,7 @@ public final class Chronicles extends ExpansionSet { cards.add(new SetCardInfo("Abu Ja'far", 57, Rarity.UNCOMMON, mage.cards.a.AbuJafar.class)); cards.add(new SetCardInfo("Active Volcano", 43, Rarity.COMMON, mage.cards.a.ActiveVolcano.class)); cards.add(new SetCardInfo("Akron Legionnaire", 58, Rarity.RARE, mage.cards.a.AkronLegionnaire.class)); - cards.add(new SetCardInfo("Aladdin", 44, Rarity.RARE, mage.cards.a.Aladdin.class)); + cards.add(new SetCardInfo("Aladdin", 44, Rarity.UNCOMMON, mage.cards.a.Aladdin.class)); cards.add(new SetCardInfo("Angelic Voices", 59, Rarity.RARE, mage.cards.a.AngelicVoices.class)); cards.add(new SetCardInfo("Arcades Sabboth", 106, Rarity.RARE, mage.cards.a.ArcadesSabboth.class)); cards.add(new SetCardInfo("Arena of the Ancients", 71, Rarity.RARE, mage.cards.a.ArenaOfTheAncients.class)); diff --git a/Mage.Sets/src/mage/sets/ClassicSixthEdition.java b/Mage.Sets/src/mage/sets/ClassicSixthEdition.java index bd007d7caf8..0494b40b093 100644 --- a/Mage.Sets/src/mage/sets/ClassicSixthEdition.java +++ b/Mage.Sets/src/mage/sets/ClassicSixthEdition.java @@ -2,16 +2,10 @@ package mage.sets; import mage.cards.ExpansionSet; -import mage.cards.d.DrySpell; -import mage.cards.f.FeastOfTheUnicorn; -import mage.cards.m.MesaFalcon; -import mage.cards.s.SoldeviSage; -import mage.cards.v.VodalianSoldiers; import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author North */ public final class ClassicSixthEdition extends ExpansionSet { @@ -30,6 +24,7 @@ public final class ClassicSixthEdition extends ExpansionSet { this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; + cards.add(new SetCardInfo("Abduction", 55, Rarity.UNCOMMON, mage.cards.a.Abduction.class)); cards.add(new SetCardInfo("Abyssal Hunter", 109, Rarity.RARE, mage.cards.a.AbyssalHunter.class)); cards.add(new SetCardInfo("Abyssal Specter", 110, Rarity.UNCOMMON, mage.cards.a.AbyssalSpecter.class)); @@ -106,7 +101,7 @@ public final class ClassicSixthEdition extends ExpansionSet { cards.add(new SetCardInfo("Dread of Night", 122, Rarity.UNCOMMON, mage.cards.d.DreadOfNight.class)); cards.add(new SetCardInfo("Dream Cache", 66, Rarity.COMMON, mage.cards.d.DreamCache.class)); cards.add(new SetCardInfo("Drudge Skeletons", 123, Rarity.COMMON, mage.cards.d.DrudgeSkeletons.class)); - cards.add(new SetCardInfo("Dry Spell", 124, Rarity.COMMON, DrySpell.class)); + cards.add(new SetCardInfo("Dry Spell", 124, Rarity.COMMON, mage.cards.d.DrySpell.class)); cards.add(new SetCardInfo("Dwarven Ruins", 323, Rarity.UNCOMMON, mage.cards.d.DwarvenRuins.class)); cards.add(new SetCardInfo("Early Harvest", 222, Rarity.RARE, mage.cards.e.EarlyHarvest.class)); cards.add(new SetCardInfo("Earthquake", 173, Rarity.RARE, mage.cards.e.Earthquake.class)); @@ -126,7 +121,7 @@ public final class ClassicSixthEdition extends ExpansionSet { cards.add(new SetCardInfo("Familiar Ground", 228, Rarity.UNCOMMON, mage.cards.f.FamiliarGround.class)); cards.add(new SetCardInfo("Fatal Blow", 128, Rarity.COMMON, mage.cards.f.FatalBlow.class)); cards.add(new SetCardInfo("Fear", 129, Rarity.COMMON, mage.cards.f.Fear.class)); - cards.add(new SetCardInfo("Feast of the Unicorn", 130, Rarity.COMMON, FeastOfTheUnicorn.class)); + cards.add(new SetCardInfo("Feast of the Unicorn", 130, Rarity.COMMON, mage.cards.f.FeastOfTheUnicorn.class)); cards.add(new SetCardInfo("Femeref Archers", 229, Rarity.UNCOMMON, mage.cards.f.FemerefArchers.class)); cards.add(new SetCardInfo("Feral Shadow", 131, Rarity.COMMON, mage.cards.f.FeralShadow.class)); cards.add(new SetCardInfo("Fervor", 174, Rarity.RARE, mage.cards.f.Fervor.class)); @@ -223,7 +218,7 @@ public final class ClassicSixthEdition extends ExpansionSet { cards.add(new SetCardInfo("Meekstone", 299, Rarity.RARE, mage.cards.m.Meekstone.class)); cards.add(new SetCardInfo("Memory Lapse", 81, Rarity.COMMON, mage.cards.m.MemoryLapse.class)); cards.add(new SetCardInfo("Merfolk of the Pearl Trident", 82, Rarity.COMMON, mage.cards.m.MerfolkOfThePearlTrident.class)); - cards.add(new SetCardInfo("Mesa Falcon", 31, Rarity.COMMON, MesaFalcon.class)); + cards.add(new SetCardInfo("Mesa Falcon", 31, Rarity.COMMON, mage.cards.m.MesaFalcon.class)); cards.add(new SetCardInfo("Millstone", 300, Rarity.RARE, mage.cards.m.Millstone.class)); cards.add(new SetCardInfo("Mind Warp", 143, Rarity.UNCOMMON, mage.cards.m.MindWarp.class)); cards.add(new SetCardInfo("Mischievous Poltergeist", 144, Rarity.UNCOMMON, mage.cards.m.MischievousPoltergeist.class)); @@ -250,7 +245,7 @@ public final class ClassicSixthEdition extends ExpansionSet { cards.add(new SetCardInfo("Pearl Dragon", 34, Rarity.RARE, mage.cards.p.PearlDragon.class)); cards.add(new SetCardInfo("Pentagram of the Ages", 306, Rarity.RARE, mage.cards.p.PentagramOfTheAges.class)); cards.add(new SetCardInfo("Perish", 148, Rarity.UNCOMMON, mage.cards.p.Perish.class)); - cards.add(new SetCardInfo("Pestilence", 149, Rarity.COMMON, mage.cards.p.Pestilence.class)); + cards.add(new SetCardInfo("Pestilence", 149, Rarity.UNCOMMON, mage.cards.p.Pestilence.class)); cards.add(new SetCardInfo("Phantasmal Terrain", 84, Rarity.COMMON, mage.cards.p.PhantasmalTerrain.class)); cards.add(new SetCardInfo("Phantom Warrior", 85, Rarity.UNCOMMON, mage.cards.p.PhantomWarrior.class)); cards.add(new SetCardInfo("Phyrexian Vault", 307, Rarity.UNCOMMON, mage.cards.p.PhyrexianVault.class)); @@ -309,7 +304,7 @@ public final class ClassicSixthEdition extends ExpansionSet { cards.add(new SetCardInfo("Skull Catapult", 310, Rarity.UNCOMMON, mage.cards.s.SkullCatapult.class)); cards.add(new SetCardInfo("Sky Diamond", 311, Rarity.UNCOMMON, mage.cards.s.SkyDiamond.class)); cards.add(new SetCardInfo("Snake Basket", 312, Rarity.RARE, mage.cards.s.SnakeBasket.class)); - cards.add(new SetCardInfo("Soldevi Sage", 99, Rarity.UNCOMMON, SoldeviSage.class)); + cards.add(new SetCardInfo("Soldevi Sage", 99, Rarity.UNCOMMON, mage.cards.s.SoldeviSage.class)); cards.add(new SetCardInfo("Soul Net", 313, Rarity.UNCOMMON, mage.cards.s.SoulNet.class)); cards.add(new SetCardInfo("Spell Blast", 100, Rarity.COMMON, mage.cards.s.SpellBlast.class)); cards.add(new SetCardInfo("Spirit Link", 43, Rarity.UNCOMMON, mage.cards.s.SpiritLink.class)); @@ -360,7 +355,7 @@ public final class ClassicSixthEdition extends ExpansionSet { cards.add(new SetCardInfo("Vertigo", 212, Rarity.UNCOMMON, mage.cards.v.Vertigo.class)); cards.add(new SetCardInfo("Viashino Warrior", 213, Rarity.COMMON, mage.cards.v.ViashinoWarrior.class)); cards.add(new SetCardInfo("Vitalize", 265, Rarity.COMMON, mage.cards.v.Vitalize.class)); - cards.add(new SetCardInfo("Vodalian Soldiers", 104, Rarity.COMMON, VodalianSoldiers.class)); + cards.add(new SetCardInfo("Vodalian Soldiers", 104, Rarity.COMMON, mage.cards.v.VodalianSoldiers.class)); cards.add(new SetCardInfo("Volcanic Dragon", 214, Rarity.RARE, mage.cards.v.VolcanicDragon.class)); cards.add(new SetCardInfo("Volcanic Geyser", 215, Rarity.UNCOMMON, mage.cards.v.VolcanicGeyser.class)); cards.add(new SetCardInfo("Waiting in the Weeds", 266, Rarity.RARE, mage.cards.w.WaitingInTheWeeds.class)); @@ -381,4 +376,4 @@ public final class ClassicSixthEdition extends ExpansionSet { cards.add(new SetCardInfo("Zombie Master", 162, Rarity.RARE, mage.cards.z.ZombieMaster.class)); cards.add(new SetCardInfo("Zur's Weirding", 108, Rarity.RARE, mage.cards.z.ZursWeirding.class)); } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/Coldsnap.java b/Mage.Sets/src/mage/sets/Coldsnap.java index 21790372da1..67274220f89 100644 --- a/Mage.Sets/src/mage/sets/Coldsnap.java +++ b/Mage.Sets/src/mage/sets/Coldsnap.java @@ -6,7 +6,6 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author North */ public final class Coldsnap extends ExpansionSet { @@ -21,13 +20,14 @@ public final class Coldsnap extends ExpansionSet { super("Coldsnap", "CSP", ExpansionSet.buildDate(2006, 6, 21), SetType.EXPANSION); this.blockName = "Ice Age"; this.hasBoosters = true; - this.numBoosterLands = 0; + this.numBoosterLands = 1; this.numBoosterCommon = 11; this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; this.parentSet = IceAge.getInstance(); - this.hasBasicLands = false; + this.hasBasicLands = true; + cards.add(new SetCardInfo("Adarkar Valkyrie", 1, Rarity.RARE, mage.cards.a.AdarkarValkyrie.class)); cards.add(new SetCardInfo("Adarkar Windform", 26, Rarity.UNCOMMON, mage.cards.a.AdarkarWindform.class)); cards.add(new SetCardInfo("Allosaurus Rider", 101, Rarity.RARE, mage.cards.a.AllosaurusRider.class)); diff --git a/Mage.Sets/src/mage/sets/Commander2013.java b/Mage.Sets/src/mage/sets/Commander2013Edition.java similarity index 99% rename from Mage.Sets/src/mage/sets/Commander2013.java rename to Mage.Sets/src/mage/sets/Commander2013Edition.java index 7c9484a17a2..e1011787db1 100644 --- a/Mage.Sets/src/mage/sets/Commander2013.java +++ b/Mage.Sets/src/mage/sets/Commander2013Edition.java @@ -2,25 +2,24 @@ package mage.sets; import mage.cards.ExpansionSet; -import mage.cards.n.NightSoil; import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author LevelX2 */ -public final class Commander2013 extends ExpansionSet { +public final class Commander2013Edition extends ExpansionSet { - private static final Commander2013 instance = new Commander2013(); + private static final Commander2013Edition instance = new Commander2013Edition(); - public static Commander2013 getInstance() { + public static Commander2013Edition getInstance() { return instance; } - private Commander2013() { + private Commander2013Edition() { super("Commander 2013 Edition", "C13", ExpansionSet.buildDate(2013, 11, 01), SetType.SUPPLEMENTAL); this.blockName = "Command Zone"; + cards.add(new SetCardInfo("Acidic Slime", 134, Rarity.UNCOMMON, mage.cards.a.AcidicSlime.class)); cards.add(new SetCardInfo("Act of Authority", 1, Rarity.RARE, mage.cards.a.ActOfAuthority.class)); cards.add(new SetCardInfo("Aerie Mystics", 2, Rarity.UNCOMMON, mage.cards.a.AerieMystics.class)); @@ -214,7 +213,7 @@ public final class Commander2013 extends ExpansionSet { cards.add(new SetCardInfo("Nevinyrral's Disk", 248, Rarity.RARE, mage.cards.n.NevinyrralsDisk.class)); cards.add(new SetCardInfo("New Benalia", 309, Rarity.UNCOMMON, mage.cards.n.NewBenalia.class)); cards.add(new SetCardInfo("Nightscape Familiar", 83, Rarity.COMMON, mage.cards.n.NightscapeFamiliar.class)); - cards.add(new SetCardInfo("Night Soil", 158, Rarity.COMMON, NightSoil.class)); + cards.add(new SetCardInfo("Night Soil", 158, Rarity.COMMON, mage.cards.n.NightSoil.class)); cards.add(new SetCardInfo("Nihil Spellbomb", 249, Rarity.COMMON, mage.cards.n.NihilSpellbomb.class)); cards.add(new SetCardInfo("Nivix Guildmage", 202, Rarity.UNCOMMON, mage.cards.n.NivixGuildmage.class)); cards.add(new SetCardInfo("Obelisk of Esper", 250, Rarity.COMMON, mage.cards.o.ObeliskOfEsper.class)); @@ -379,4 +378,4 @@ public final class Commander2013 extends ExpansionSet { cards.add(new SetCardInfo("Wrath of God", 27, Rarity.RARE, mage.cards.w.WrathOfGod.class)); } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/Commander2014.java b/Mage.Sets/src/mage/sets/Commander2014Edition.java similarity index 99% rename from Mage.Sets/src/mage/sets/Commander2014.java rename to Mage.Sets/src/mage/sets/Commander2014Edition.java index c46d84f5e40..e3422ee3ea1 100644 --- a/Mage.Sets/src/mage/sets/Commander2014.java +++ b/Mage.Sets/src/mage/sets/Commander2014Edition.java @@ -9,15 +9,15 @@ import mage.constants.SetType; * * @author LevelX2 */ -public final class Commander2014 extends ExpansionSet { +public final class Commander2014Edition extends ExpansionSet { - private static final Commander2014 instance = new Commander2014(); + private static final Commander2014Edition instance = new Commander2014Edition(); - public static Commander2014 getInstance() { + public static Commander2014Edition getInstance() { return instance; } - private Commander2014() { + private Commander2014Edition() { super("Commander 2014 Edition", "C14", ExpansionSet.buildDate(2014, 11, 07), SetType.SUPPLEMENTAL); this.blockName = "Command Zone"; cards.add(new SetCardInfo("Abyssal Persecutor", 132, Rarity.MYTHIC, mage.cards.a.AbyssalPersecutor.class)); diff --git a/Mage.Sets/src/mage/sets/Commander2015.java b/Mage.Sets/src/mage/sets/Commander2015Edition.java similarity index 99% rename from Mage.Sets/src/mage/sets/Commander2015.java rename to Mage.Sets/src/mage/sets/Commander2015Edition.java index 419958c4c66..912003f5df1 100644 --- a/Mage.Sets/src/mage/sets/Commander2015.java +++ b/Mage.Sets/src/mage/sets/Commander2015Edition.java @@ -9,15 +9,15 @@ import mage.constants.SetType; * * @author fireshoes */ -public final class Commander2015 extends ExpansionSet { +public final class Commander2015Edition extends ExpansionSet { - private static final Commander2015 instance = new Commander2015(); + private static final Commander2015Edition instance = new Commander2015Edition(); - public static Commander2015 getInstance() { + public static Commander2015Edition getInstance() { return instance; } - private Commander2015() { + private Commander2015Edition() { super("Commander 2015 Edition", "C15", ExpansionSet.buildDate(2015, 11, 13), SetType.SUPPLEMENTAL); this.blockName = "Command Zone"; cards.add(new SetCardInfo("Acidic Slime", 173, Rarity.UNCOMMON, mage.cards.a.AcidicSlime.class)); diff --git a/Mage.Sets/src/mage/sets/Commander2016.java b/Mage.Sets/src/mage/sets/Commander2016Edition.java similarity index 99% rename from Mage.Sets/src/mage/sets/Commander2016.java rename to Mage.Sets/src/mage/sets/Commander2016Edition.java index 33f69b2b7f3..5ea0f337792 100644 --- a/Mage.Sets/src/mage/sets/Commander2016.java +++ b/Mage.Sets/src/mage/sets/Commander2016Edition.java @@ -9,15 +9,15 @@ import mage.constants.SetType; * * @author fireshoeS */ -public final class Commander2016 extends ExpansionSet { +public final class Commander2016Edition extends ExpansionSet { - private static final Commander2016 instance = new Commander2016(); + private static final Commander2016Edition instance = new Commander2016Edition(); - public static Commander2016 getInstance() { + public static Commander2016Edition getInstance() { return instance; } - private Commander2016() { + private Commander2016Edition() { super("Commander 2016 Edition", "C16", ExpansionSet.buildDate(2016, 11, 11), SetType.SUPPLEMENTAL); this.blockName = "Command Zone"; cards.add(new SetCardInfo("Abzan Charm", 177, Rarity.UNCOMMON, mage.cards.a.AbzanCharm.class)); diff --git a/Mage.Sets/src/mage/sets/Commander2017.java b/Mage.Sets/src/mage/sets/Commander2017Edition.java similarity index 99% rename from Mage.Sets/src/mage/sets/Commander2017.java rename to Mage.Sets/src/mage/sets/Commander2017Edition.java index ec1248e3ff2..067b25ee9c1 100644 --- a/Mage.Sets/src/mage/sets/Commander2017.java +++ b/Mage.Sets/src/mage/sets/Commander2017Edition.java @@ -1,4 +1,3 @@ - package mage.sets; import mage.cards.ExpansionSet; @@ -6,18 +5,17 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author fireshoes */ -public final class Commander2017 extends ExpansionSet { +public final class Commander2017Edition extends ExpansionSet { - private static final Commander2017 instance = new Commander2017(); + private static final Commander2017Edition instance = new Commander2017Edition(); - public static Commander2017 getInstance() { + public static Commander2017Edition getInstance() { return instance; } - private Commander2017() { + private Commander2017Edition() { super("Commander 2017 Edition", "C17", ExpansionSet.buildDate(2017, 8, 25), SetType.SUPPLEMENTAL); this.blockName = "Command Zone"; @@ -291,7 +289,7 @@ public final class Commander2017 extends ExpansionSet { cards.add(new SetCardInfo("Sword of the Animist", 227, Rarity.RARE, mage.cards.s.SwordOfTheAnimist.class)); cards.add(new SetCardInfo("Swords to Plowshares", 76, Rarity.UNCOMMON, mage.cards.s.SwordsToPlowshares.class)); cards.add(new SetCardInfo("Syphon Mind", 127, Rarity.COMMON, mage.cards.s.SyphonMind.class)); - cards.add(new SetCardInfo("Taigam, Ojutai Master", 46, Rarity.MYTHIC, mage.cards.t.TaigamOjutaiMaster.class)); + cards.add(new SetCardInfo("Taigam, Ojutai Master", 46, Rarity.RARE, mage.cards.t.TaigamOjutaiMaster.class)); cards.add(new SetCardInfo("Taigam, Sidisi's Hand", 47, Rarity.RARE, mage.cards.t.TaigamSidisisHand.class)); cards.add(new SetCardInfo("Taj-Nar Swordsmith", 77, Rarity.UNCOMMON, mage.cards.t.TajNarSwordsmith.class)); cards.add(new SetCardInfo("Teferi's Protection", 8, Rarity.RARE, mage.cards.t.TeferisProtection.class)); @@ -320,7 +318,7 @@ public final class Commander2017 extends ExpansionSet { cards.add(new SetCardInfo("Vivid Grove", 291, Rarity.UNCOMMON, mage.cards.v.VividGrove.class)); cards.add(new SetCardInfo("Vivid Marsh", 292, Rarity.UNCOMMON, mage.cards.v.VividMarsh.class)); cards.add(new SetCardInfo("Vivid Meadow", 293, Rarity.UNCOMMON, mage.cards.v.VividMeadow.class)); - cards.add(new SetCardInfo("Wasitora, Nekoru Queen", 49, Rarity.MYTHIC, mage.cards.w.WasitoraNekoruQueen.class)); + cards.add(new SetCardInfo("Wasitora, Nekoru Queen", 49, Rarity.RARE, mage.cards.w.WasitoraNekoruQueen.class)); cards.add(new SetCardInfo("Wayfarer's Bauble", 230, Rarity.COMMON, mage.cards.w.WayfarersBauble.class)); cards.add(new SetCardInfo("Well of Lost Dreams", 231, Rarity.RARE, mage.cards.w.WellOfLostDreams.class)); cards.add(new SetCardInfo("White Sun's Zenith", 78, Rarity.RARE, mage.cards.w.WhiteSunsZenith.class)); diff --git a/Mage.Sets/src/mage/sets/Commander2018.java b/Mage.Sets/src/mage/sets/Commander2018Edition.java similarity index 99% rename from Mage.Sets/src/mage/sets/Commander2018.java rename to Mage.Sets/src/mage/sets/Commander2018Edition.java index 486c71ea689..ac3896c8017 100644 --- a/Mage.Sets/src/mage/sets/Commander2018.java +++ b/Mage.Sets/src/mage/sets/Commander2018Edition.java @@ -5,18 +5,17 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author TheElk801 */ -public final class Commander2018 extends ExpansionSet { +public final class Commander2018Edition extends ExpansionSet { - private static final Commander2018 instance = new Commander2018(); + private static final Commander2018Edition instance = new Commander2018Edition(); - public static Commander2018 getInstance() { + public static Commander2018Edition getInstance() { return instance; } - private Commander2018() { + private Commander2018Edition() { super("Commander 2018 Edition", "C18", ExpansionSet.buildDate(2018, 8, 10), SetType.SUPPLEMENTAL); this.blockName = "Command Zone"; @@ -159,7 +158,7 @@ public final class Commander2018 extends ExpansionSet { cards.add(new SetCardInfo("Isolated Watchtower", 59, Rarity.RARE, mage.cards.i.IsolatedWatchtower.class)); cards.add(new SetCardInfo("Izzet Boilerworks", 256, Rarity.UNCOMMON, mage.cards.i.IzzetBoilerworks.class)); cards.add(new SetCardInfo("Izzet Guildgate", 257, Rarity.COMMON, mage.cards.i.IzzetGuildgate.class)); - cards.add(new SetCardInfo("Izzet Signet", 207, Rarity.UNCOMMON, mage.cards.i.IzzetSignet.class)); + cards.add(new SetCardInfo("Izzet Signet", 207, Rarity.COMMON, mage.cards.i.IzzetSignet.class)); cards.add(new SetCardInfo("Jeskai Infiltrator", 93, Rarity.RARE, mage.cards.j.JeskaiInfiltrator.class)); cards.add(new SetCardInfo("Jund Panorama", 258, Rarity.COMMON, mage.cards.j.JundPanorama.class)); cards.add(new SetCardInfo("Jungle Hollow", 259, Rarity.COMMON, mage.cards.j.JungleHollow.class)); diff --git a/Mage.Sets/src/mage/sets/CommanderAnthology.java b/Mage.Sets/src/mage/sets/CommanderAnthology.java index 8a48de81874..fdc452bb041 100644 --- a/Mage.Sets/src/mage/sets/CommanderAnthology.java +++ b/Mage.Sets/src/mage/sets/CommanderAnthology.java @@ -1,4 +1,3 @@ - package mage.sets; import mage.cards.ExpansionSet; @@ -6,7 +5,6 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author fireshoes */ public final class CommanderAnthology extends ExpansionSet { @@ -19,8 +17,9 @@ public final class CommanderAnthology extends ExpansionSet { private CommanderAnthology() { super("Commander Anthology", "CMA", ExpansionSet.buildDate(2017, 6, 9), SetType.SUPPLEMENTAL); - this.blockName = "Commander Anthology"; - this.hasBasicLands = false; + this.blockName = "Command Zone"; + this.hasBasicLands = true; + cards.add(new SetCardInfo("Acidic Slime", 90, Rarity.UNCOMMON, mage.cards.a.AcidicSlime.class)); cards.add(new SetCardInfo("Aerie Mystics", 1, Rarity.UNCOMMON, mage.cards.a.AerieMystics.class)); cards.add(new SetCardInfo("Aethermage's Touch", 172, Rarity.RARE, mage.cards.a.AethermagesTouch.class)); @@ -151,7 +150,7 @@ public final class CommanderAnthology extends ExpansionSet { cards.add(new SetCardInfo("High Market", 257, Rarity.RARE, mage.cards.h.HighMarket.class)); cards.add(new SetCardInfo("Hunting Triad", 116, Rarity.UNCOMMON, mage.cards.h.HuntingTriad.class)); cards.add(new SetCardInfo("Immaculate Magistrate", 117, Rarity.RARE, mage.cards.i.ImmaculateMagistrate.class)); - cards.add(new SetCardInfo("Imperious Perfect", 118, Rarity.RARE, mage.cards.i.ImperiousPerfect.class)); + cards.add(new SetCardInfo("Imperious Perfect", 118, Rarity.UNCOMMON, mage.cards.i.ImperiousPerfect.class)); cards.add(new SetCardInfo("Indrik Stomphowler", 119, Rarity.UNCOMMON, mage.cards.i.IndrikStomphowler.class)); cards.add(new SetCardInfo("Island", 293, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Island", 294, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); @@ -180,7 +179,7 @@ public final class CommanderAnthology extends ExpansionSet { cards.add(new SetCardInfo("Lys Alana Huntmaster", 126, Rarity.COMMON, mage.cards.l.LysAlanaHuntmaster.class)); cards.add(new SetCardInfo("Malfegor", 184, Rarity.MYTHIC, mage.cards.m.Malfegor.class)); cards.add(new SetCardInfo("Mana-Charged Dragon", 84, Rarity.RARE, mage.cards.m.ManaChargedDragon.class)); - cards.add(new SetCardInfo("Masked Admirers", 127, Rarity.UNCOMMON, mage.cards.m.MaskedAdmirers.class)); + cards.add(new SetCardInfo("Masked Admirers", 127, Rarity.RARE, mage.cards.m.MaskedAdmirers.class)); cards.add(new SetCardInfo("Master Warcraft", 202, Rarity.RARE, mage.cards.m.MasterWarcraft.class)); cards.add(new SetCardInfo("Mazirek, Kraul Death Priest", 185, Rarity.MYTHIC, mage.cards.m.MazirekKraulDeathPriest.class)); cards.add(new SetCardInfo("Meren of Clan Nel Toth", 186, Rarity.MYTHIC, mage.cards.m.MerenOfClanNelToth.class)); diff --git a/Mage.Sets/src/mage/sets/CommanderAnthologyVolumeII.java b/Mage.Sets/src/mage/sets/CommanderAnthologyVolumeII.java index eff5498d467..ba3b6ac1234 100644 --- a/Mage.Sets/src/mage/sets/CommanderAnthologyVolumeII.java +++ b/Mage.Sets/src/mage/sets/CommanderAnthologyVolumeII.java @@ -5,7 +5,6 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author rystan */ public class CommanderAnthologyVolumeII extends ExpansionSet { @@ -17,9 +16,9 @@ public class CommanderAnthologyVolumeII extends ExpansionSet { } private CommanderAnthologyVolumeII() { - super("Commander Anthology 2018", "CM2", ExpansionSet.buildDate(2018, 6, 8), SetType.SUPPLEMENTAL); - this.blockName = "Commander Anthology 2018"; - this.hasBasicLands = false; + super("Commander Anthology Volume II", "CM2", ExpansionSet.buildDate(2018, 6, 8), SetType.SUPPLEMENTAL); + this.blockName = "Command Zone"; + this.hasBasicLands = true; cards.add(new SetCardInfo("Abzan Falconer", 15, Rarity.UNCOMMON, mage.cards.a.AbzanFalconer.class)); cards.add(new SetCardInfo("Acidic Slime", 132, Rarity.UNCOMMON, mage.cards.a.AcidicSlime.class)); @@ -48,7 +47,7 @@ public class CommanderAnthologyVolumeII extends ExpansionSet { cards.add(new SetCardInfo("Bogardan Hellkite", 86, Rarity.MYTHIC, mage.cards.b.BogardanHellkite.class)); cards.add(new SetCardInfo("Borderland Behemoth", 87, Rarity.RARE, mage.cards.b.BorderlandBehemoth.class)); cards.add(new SetCardInfo("Boros Cluestone", 175, Rarity.COMMON, mage.cards.b.BorosCluestone.class)); - cards.add(new SetCardInfo("Boros Garrison", 239, Rarity.UNCOMMON, mage.cards.b.BorosGarrison.class)); + cards.add(new SetCardInfo("Boros Garrison", 239, Rarity.COMMON, mage.cards.b.BorosGarrison.class)); cards.add(new SetCardInfo("Boros Guildgate", 240, Rarity.COMMON, mage.cards.b.BorosGuildgate.class)); cards.add(new SetCardInfo("Boros Signet", 176, Rarity.COMMON, mage.cards.b.BorosSignet.class)); cards.add(new SetCardInfo("Bosh, Iron Golem", 5, Rarity.RARE, mage.cards.b.BoshIronGolem.class)); @@ -87,7 +86,7 @@ public class CommanderAnthologyVolumeII extends ExpansionSet { cards.add(new SetCardInfo("Deepglow Skate", 39, Rarity.RARE, mage.cards.d.DeepglowSkate.class)); cards.add(new SetCardInfo("Desecrator Hag", 153, Rarity.COMMON, mage.cards.d.DesecratorHag.class)); cards.add(new SetCardInfo("Desolation Giant", 91, Rarity.RARE, mage.cards.d.DesolationGiant.class)); - cards.add(new SetCardInfo("Dimir Aqueduct", 245, Rarity.UNCOMMON, mage.cards.d.DimirAqueduct.class)); + cards.add(new SetCardInfo("Dimir Aqueduct", 245, Rarity.COMMON, mage.cards.d.DimirAqueduct.class)); cards.add(new SetCardInfo("Dimir Signet", 185, Rarity.COMMON, mage.cards.d.DimirSignet.class)); cards.add(new SetCardInfo("Disaster Radius", 92, Rarity.RARE, mage.cards.d.DisasterRadius.class)); cards.add(new SetCardInfo("Disdainful Stroke", 40, Rarity.COMMON, mage.cards.d.DisdainfulStroke.class)); @@ -137,8 +136,8 @@ public class CommanderAnthologyVolumeII extends ExpansionSet { cards.add(new SetCardInfo("Gisela, Blade of Goldnight", 9, Rarity.MYTHIC, mage.cards.g.GiselaBladeOfGoldnight.class)); cards.add(new SetCardInfo("Goblin Welder", 101, Rarity.RARE, mage.cards.g.GoblinWelder.class)); cards.add(new SetCardInfo("Golgari Rot Farm", 254, Rarity.UNCOMMON, mage.cards.g.GolgariRotFarm.class)); - cards.add(new SetCardInfo("Golgari Signet", 191, Rarity.COMMON, mage.cards.g.GolgariSignet.class)); - cards.add(new SetCardInfo("Golgari Signet", 192, Rarity.COMMON, mage.cards.g.GolgariSignet.class)); + cards.add(new SetCardInfo("Golgari Signet", 191, Rarity.COMMON, mage.cards.g.GolgariSignet.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Golgari Signet", 192, Rarity.COMMON, mage.cards.g.GolgariSignet.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Grave Pact", 65, Rarity.RARE, mage.cards.g.GravePact.class)); cards.add(new SetCardInfo("Gravedigger", 66, Rarity.COMMON, mage.cards.g.Gravedigger.class)); cards.add(new SetCardInfo("Great Furnace", 255, Rarity.COMMON, mage.cards.g.GreatFurnace.class)); @@ -166,12 +165,12 @@ public class CommanderAnthologyVolumeII extends ExpansionSet { cards.add(new SetCardInfo("Island", 291, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Island", 292, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Jalum Tome", 194, Rarity.RARE, mage.cards.j.JalumTome.class)); - cards.add(new SetCardInfo("Jareth, Leonine Titan", 30, Rarity.COMMON, mage.cards.j.JarethLeonineTitan.class)); + cards.add(new SetCardInfo("Jareth, Leonine Titan", 30, Rarity.RARE, mage.cards.j.JarethLeonineTitan.class)); cards.add(new SetCardInfo("Juniper Order Ranger", 158, Rarity.UNCOMMON, mage.cards.j.JuniperOrderRanger.class)); cards.add(new SetCardInfo("Junk Diver", 195, Rarity.RARE, mage.cards.j.JunkDiver.class)); cards.add(new SetCardInfo("Jwar Isle Refuge", 256, Rarity.UNCOMMON, mage.cards.j.JwarIsleRefuge.class)); - cards.add(new SetCardInfo("Kalemne, Disciple of Iroas", 7, Rarity.MYTHIC, mage.cards.k.KalemneDiscipleOfIroas.class)); cards.add(new SetCardInfo("Kalemne's Captain", 31, Rarity.RARE, mage.cards.k.KalemnesCaptain.class)); + cards.add(new SetCardInfo("Kalemne, Disciple of Iroas", 7, Rarity.MYTHIC, mage.cards.k.KalemneDiscipleOfIroas.class)); cards.add(new SetCardInfo("Kalonian Hydra", 140, Rarity.MYTHIC, mage.cards.k.KalonianHydra.class)); cards.add(new SetCardInfo("Languish", 67, Rarity.RARE, mage.cards.l.Languish.class)); cards.add(new SetCardInfo("Lhurgoyf", 141, Rarity.RARE, mage.cards.l.Lhurgoyf.class)); @@ -180,7 +179,7 @@ public class CommanderAnthologyVolumeII extends ExpansionSet { cards.add(new SetCardInfo("Living Death", 68, Rarity.RARE, mage.cards.l.LivingDeath.class)); cards.add(new SetCardInfo("Lonely Sandbar", 257, Rarity.COMMON, mage.cards.l.LonelySandbar.class)); cards.add(new SetCardInfo("Loreseeker's Stone", 198, Rarity.UNCOMMON, mage.cards.l.LoreseekersStone.class)); - cards.add(new SetCardInfo("Loxodon Warhammer", 199, Rarity.UNCOMMON, mage.cards.l.LoxodonWarhammer.class)); + cards.add(new SetCardInfo("Loxodon Warhammer", 199, Rarity.RARE, mage.cards.l.LoxodonWarhammer.class)); cards.add(new SetCardInfo("Magma Giant", 111, Rarity.RARE, mage.cards.m.MagmaGiant.class)); cards.add(new SetCardInfo("Magmaquake", 112, Rarity.RARE, mage.cards.m.Magmaquake.class)); cards.add(new SetCardInfo("Magus of the Wheel", 113, Rarity.RARE, mage.cards.m.MagusOfTheWheel.class)); @@ -201,7 +200,7 @@ public class CommanderAnthologyVolumeII extends ExpansionSet { cards.add(new SetCardInfo("Mountain", 303, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Mountain", 304, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Mountain", 305, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mulldrifter", 47, Rarity.UNCOMMON, mage.cards.m.Mulldrifter.class)); + cards.add(new SetCardInfo("Mulldrifter", 47, Rarity.COMMON, mage.cards.m.Mulldrifter.class)); cards.add(new SetCardInfo("Murmuring Bosk", 258, Rarity.RARE, mage.cards.m.MurmuringBosk.class)); cards.add(new SetCardInfo("Mycosynth Wellspring", 201, Rarity.COMMON, mage.cards.m.MycosynthWellspring.class)); cards.add(new SetCardInfo("Myr Battlesphere", 202, Rarity.RARE, mage.cards.m.MyrBattlesphere.class)); @@ -251,15 +250,15 @@ public class CommanderAnthologyVolumeII extends ExpansionSet { cards.add(new SetCardInfo("Sewer Nemesis", 75, Rarity.RARE, mage.cards.s.SewerNemesis.class)); cards.add(new SetCardInfo("Shared Trauma", 76, Rarity.RARE, mage.cards.s.SharedTrauma.class)); cards.add(new SetCardInfo("Sign in Blood", 77, Rarity.COMMON, mage.cards.s.SignInBlood.class)); - cards.add(new SetCardInfo("Simic Growth Chamber", 267, Rarity.UNCOMMON, mage.cards.s.SimicGrowthChamber.class)); - cards.add(new SetCardInfo("Simic Signet", 215, Rarity.COMMON, mage.cards.s.SimicSignet.class)); - cards.add(new SetCardInfo("Simic Signet", 216, Rarity.COMMON, mage.cards.s.SimicSignet.class)); + cards.add(new SetCardInfo("Simic Growth Chamber", 267, Rarity.COMMON, mage.cards.s.SimicGrowthChamber.class)); + cards.add(new SetCardInfo("Simic Signet", 215, Rarity.COMMON, mage.cards.s.SimicSignet.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Simic Signet", 216, Rarity.COMMON, mage.cards.s.SimicSignet.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Skullbriar, the Walking Grave", 165, Rarity.RARE, mage.cards.s.SkullbriarTheWalkingGrave.class)); cards.add(new SetCardInfo("Slipstream Eel", 49, Rarity.COMMON, mage.cards.s.SlipstreamEel.class)); cards.add(new SetCardInfo("Smoldering Crater", 268, Rarity.COMMON, mage.cards.s.SmolderingCrater.class)); cards.add(new SetCardInfo("Sol Ring", 217, Rarity.UNCOMMON, mage.cards.s.SolRing.class)); - cards.add(new SetCardInfo("Solemn Simulacrum", 218, Rarity.RARE, mage.cards.s.SolemnSimulacrum.class)); - cards.add(new SetCardInfo("Solemn Simulacrum", 219, Rarity.RARE, mage.cards.s.SolemnSimulacrum.class)); + cards.add(new SetCardInfo("Solemn Simulacrum", 218, Rarity.RARE, mage.cards.s.SolemnSimulacrum.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Solemn Simulacrum", 219, Rarity.RARE, mage.cards.s.SolemnSimulacrum.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Solidarity of Heroes", 144, Rarity.UNCOMMON, mage.cards.s.SolidarityOfHeroes.class)); cards.add(new SetCardInfo("Spell Crumple", 50, Rarity.UNCOMMON, mage.cards.s.SpellCrumple.class)); cards.add(new SetCardInfo("Spine of Ish Sah", 220, Rarity.RARE, mage.cards.s.SpineOfIshSah.class)); @@ -289,8 +288,8 @@ public class CommanderAnthologyVolumeII extends ExpansionSet { cards.add(new SetCardInfo("Syphon Mind", 80, Rarity.COMMON, mage.cards.s.SyphonMind.class)); cards.add(new SetCardInfo("Szadek, Lord of Secrets", 168, Rarity.RARE, mage.cards.s.SzadekLordOfSecrets.class)); cards.add(new SetCardInfo("Taurean Mauler", 122, Rarity.RARE, mage.cards.t.TaureanMauler.class)); - cards.add(new SetCardInfo("Temple of the False God", 271, Rarity.UNCOMMON, mage.cards.t.TempleOfTheFalseGod.class)); - cards.add(new SetCardInfo("Temple of the False God", 272, Rarity.UNCOMMON, mage.cards.t.TempleOfTheFalseGod.class)); + cards.add(new SetCardInfo("Temple of the False God", 271, Rarity.UNCOMMON, mage.cards.t.TempleOfTheFalseGod.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Temple of the False God", 272, Rarity.UNCOMMON, mage.cards.t.TempleOfTheFalseGod.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Terramorphic Expanse", 273, Rarity.COMMON, mage.cards.t.TerramorphicExpanse.class)); cards.add(new SetCardInfo("Tezzeret's Gambit", 51, Rarity.UNCOMMON, mage.cards.t.TezzeretsGambit.class)); cards.add(new SetCardInfo("The Mimeoplasm", 1, Rarity.MYTHIC, mage.cards.t.TheMimeoplasm.class)); diff --git a/Mage.Sets/src/mage/sets/CommandersArsenal.java b/Mage.Sets/src/mage/sets/CommandersArsenal.java index f83095a8d30..aa1943bce2b 100644 --- a/Mage.Sets/src/mage/sets/CommandersArsenal.java +++ b/Mage.Sets/src/mage/sets/CommandersArsenal.java @@ -6,7 +6,6 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author fireshoes */ public final class CommandersArsenal extends ExpansionSet { @@ -20,6 +19,8 @@ public final class CommandersArsenal extends ExpansionSet { private CommandersArsenal() { super("Commander's Arsenal", "CM1", ExpansionSet.buildDate(2012, 11, 2), SetType.SUPPLEMENTAL); this.blockName = "Command Zone"; + this.hasBasicLands = false; + cards.add(new SetCardInfo("Chaos Warp", 1, Rarity.RARE, mage.cards.c.ChaosWarp.class)); cards.add(new SetCardInfo("Command Tower", 2, Rarity.COMMON, mage.cards.c.CommandTower.class)); cards.add(new SetCardInfo("Decree of Pain", 3, Rarity.RARE, mage.cards.d.DecreeOfPain.class)); diff --git a/Mage.Sets/src/mage/sets/ConspiracyTakeTheCrown.java b/Mage.Sets/src/mage/sets/ConspiracyTakeTheCrown.java index 70ebcf6468b..10c116f56a6 100644 --- a/Mage.Sets/src/mage/sets/ConspiracyTakeTheCrown.java +++ b/Mage.Sets/src/mage/sets/ConspiracyTakeTheCrown.java @@ -1,4 +1,3 @@ - package mage.sets; import mage.cards.ExpansionSet; @@ -150,7 +149,7 @@ public final class ConspiracyTakeTheCrown extends ExpansionSet { cards.add(new SetCardInfo("Mnemonic Wall", 116, Rarity.COMMON, mage.cards.m.MnemonicWall.class)); cards.add(new SetCardInfo("Murder", 143, Rarity.COMMON, mage.cards.m.Murder.class)); cards.add(new SetCardInfo("Negate", 117, Rarity.COMMON, mage.cards.n.Negate.class)); - cards.add(new SetCardInfo("Nessian Asp", 187, Rarity.COMMON, mage.cards.n.NessianAsp.class)); + cards.add(new SetCardInfo("Nessian Asp", 187, Rarity.UNCOMMON, mage.cards.n.NessianAsp.class)); cards.add(new SetCardInfo("Netcaster Spider", 188, Rarity.COMMON, mage.cards.n.NetcasterSpider.class)); cards.add(new SetCardInfo("Ogre Sentry", 168, Rarity.COMMON, mage.cards.o.OgreSentry.class)); cards.add(new SetCardInfo("Omenspeaker", 118, Rarity.COMMON, mage.cards.o.Omenspeaker.class)); @@ -184,7 +183,7 @@ public final class ConspiracyTakeTheCrown extends ExpansionSet { cards.add(new SetCardInfo("Selvala, Heart of the Wilds", 70, Rarity.MYTHIC, mage.cards.s.SelvalaHeartOfTheWilds.class)); cards.add(new SetCardInfo("Serum Visions", 120, Rarity.UNCOMMON, mage.cards.s.SerumVisions.class)); cards.add(new SetCardInfo("Shambling Goblin", 148, Rarity.COMMON, mage.cards.s.ShamblingGoblin.class)); - cards.add(new SetCardInfo("Shimmering Grotto", 221, Rarity.COMMON, mage.cards.s.ShimmeringGrotto.class)); + cards.add(new SetCardInfo("Shimmering Grotto", 221, Rarity.UNCOMMON, mage.cards.s.ShimmeringGrotto.class)); cards.add(new SetCardInfo("Shipwreck Singer", 206, Rarity.UNCOMMON, mage.cards.s.ShipwreckSinger.class)); cards.add(new SetCardInfo("Show and Tell", 121, Rarity.MYTHIC, mage.cards.s.ShowAndTell.class)); cards.add(new SetCardInfo("Sinuous Vermin", 46, Rarity.COMMON, mage.cards.s.SinuousVermin.class)); diff --git a/Mage.Sets/src/mage/sets/AjaniVsNicolBolas.java b/Mage.Sets/src/mage/sets/DuelDecksAjaniVsNicolBolas.java similarity index 96% rename from Mage.Sets/src/mage/sets/AjaniVsNicolBolas.java rename to Mage.Sets/src/mage/sets/DuelDecksAjaniVsNicolBolas.java index bfb02daf0c4..d0cd95b426b 100644 --- a/Mage.Sets/src/mage/sets/AjaniVsNicolBolas.java +++ b/Mage.Sets/src/mage/sets/DuelDecksAjaniVsNicolBolas.java @@ -6,21 +6,21 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author LevelX2 */ -public final class AjaniVsNicolBolas extends ExpansionSet { +public final class DuelDecksAjaniVsNicolBolas extends ExpansionSet { - private static final AjaniVsNicolBolas instance = new AjaniVsNicolBolas(); + private static final DuelDecksAjaniVsNicolBolas instance = new DuelDecksAjaniVsNicolBolas(); - public static AjaniVsNicolBolas getInstance() { + public static DuelDecksAjaniVsNicolBolas getInstance() { return instance; } - private AjaniVsNicolBolas() { + private DuelDecksAjaniVsNicolBolas() { super("Duel Decks: Ajani vs. Nicol Bolas", "DDH", ExpansionSet.buildDate(2011, 9, 2), SetType.SUPPLEMENTAL); this.blockName = "Duel Decks"; - this.hasBasicLands = false; + this.hasBasicLands = true; + cards.add(new SetCardInfo("Ageless Entity", 18, Rarity.RARE, mage.cards.a.AgelessEntity.class)); cards.add(new SetCardInfo("Agonizing Demise", 66, Rarity.COMMON, mage.cards.a.AgonizingDemise.class)); cards.add(new SetCardInfo("Ajani's Mantra", 22, Rarity.COMMON, mage.cards.a.AjanisMantra.class)); diff --git a/Mage.Sets/src/mage/sets/AnthologyDivineVsDemonic.java b/Mage.Sets/src/mage/sets/DuelDecksAnthologyDivineVsDemonic.java similarity index 95% rename from Mage.Sets/src/mage/sets/AnthologyDivineVsDemonic.java rename to Mage.Sets/src/mage/sets/DuelDecksAnthologyDivineVsDemonic.java index 37817858834..c7ac43ed642 100644 --- a/Mage.Sets/src/mage/sets/AnthologyDivineVsDemonic.java +++ b/Mage.Sets/src/mage/sets/DuelDecksAnthologyDivineVsDemonic.java @@ -1,4 +1,3 @@ - package mage.sets; import mage.cards.ExpansionSet; @@ -6,22 +5,22 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author fireshoes */ -public final class AnthologyDivineVsDemonic extends ExpansionSet { +public final class DuelDecksAnthologyDivineVsDemonic extends ExpansionSet { - private static final AnthologyDivineVsDemonic instance = new AnthologyDivineVsDemonic(); + private static final DuelDecksAnthologyDivineVsDemonic instance = new DuelDecksAnthologyDivineVsDemonic(); - public static AnthologyDivineVsDemonic getInstance() { + public static DuelDecksAnthologyDivineVsDemonic getInstance() { return instance; } - private AnthologyDivineVsDemonic() { + private DuelDecksAnthologyDivineVsDemonic() { super("Duel Decks: Anthology, Divine vs. Demonic", "DD3DVD", ExpansionSet.buildDate(2014, 12, 5), SetType.SUPPLEMENTAL); this.blockName = "Duel Decks: Anthology"; - this.hasBasicLands = false; + this.hasBasicLands = true; + cards.add(new SetCardInfo("Abyssal Gatekeeper", 31, Rarity.COMMON, mage.cards.a.AbyssalGatekeeper.class)); cards.add(new SetCardInfo("Abyssal Specter", 40, Rarity.UNCOMMON, mage.cards.a.AbyssalSpecter.class)); cards.add(new SetCardInfo("Akroma, Angel of Wrath", 1, Rarity.MYTHIC, mage.cards.a.AkromaAngelOfWrath.class)); diff --git a/Mage.Sets/src/mage/sets/AnthologyElvesVsGoblins.java b/Mage.Sets/src/mage/sets/DuelDecksAnthologyElvesVsGoblins.java similarity index 95% rename from Mage.Sets/src/mage/sets/AnthologyElvesVsGoblins.java rename to Mage.Sets/src/mage/sets/DuelDecksAnthologyElvesVsGoblins.java index cdb194a0c22..90d7b150030 100644 --- a/Mage.Sets/src/mage/sets/AnthologyElvesVsGoblins.java +++ b/Mage.Sets/src/mage/sets/DuelDecksAnthologyElvesVsGoblins.java @@ -6,22 +6,22 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author fireshoes */ -public final class AnthologyElvesVsGoblins extends ExpansionSet { +public final class DuelDecksAnthologyElvesVsGoblins extends ExpansionSet { - private static final AnthologyElvesVsGoblins instance = new AnthologyElvesVsGoblins(); + private static final DuelDecksAnthologyElvesVsGoblins instance = new DuelDecksAnthologyElvesVsGoblins(); - public static AnthologyElvesVsGoblins getInstance() { + public static DuelDecksAnthologyElvesVsGoblins getInstance() { return instance; } - private AnthologyElvesVsGoblins() { + private DuelDecksAnthologyElvesVsGoblins() { super("Duel Decks: Anthology, Elves vs. Goblins", "DD3EVG", ExpansionSet.buildDate(2014, 12, 5), SetType.SUPPLEMENTAL); this.blockName = "Duel Decks: Anthology"; - this.hasBasicLands = false; + this.hasBasicLands = true; + cards.add(new SetCardInfo("Akki Coalflinger", 33, Rarity.UNCOMMON, mage.cards.a.AkkiCoalflinger.class)); cards.add(new SetCardInfo("Allosaurus Rider", 2, Rarity.RARE, mage.cards.a.AllosaurusRider.class)); cards.add(new SetCardInfo("Ambush Commander", 1, Rarity.RARE, mage.cards.a.AmbushCommander.class)); diff --git a/Mage.Sets/src/mage/sets/AnthologyGarrukVsLiliana.java b/Mage.Sets/src/mage/sets/DuelDecksAnthologyGarrukVsLiliana.java similarity index 95% rename from Mage.Sets/src/mage/sets/AnthologyGarrukVsLiliana.java rename to Mage.Sets/src/mage/sets/DuelDecksAnthologyGarrukVsLiliana.java index 754a0008d65..82154d1beb0 100644 --- a/Mage.Sets/src/mage/sets/AnthologyGarrukVsLiliana.java +++ b/Mage.Sets/src/mage/sets/DuelDecksAnthologyGarrukVsLiliana.java @@ -6,22 +6,22 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author fireshoes */ -public final class AnthologyGarrukVsLiliana extends ExpansionSet { +public final class DuelDecksAnthologyGarrukVsLiliana extends ExpansionSet { - private static final AnthologyGarrukVsLiliana instance = new AnthologyGarrukVsLiliana(); + private static final DuelDecksAnthologyGarrukVsLiliana instance = new DuelDecksAnthologyGarrukVsLiliana(); - public static AnthologyGarrukVsLiliana getInstance() { + public static DuelDecksAnthologyGarrukVsLiliana getInstance() { return instance; } - private AnthologyGarrukVsLiliana() { + private DuelDecksAnthologyGarrukVsLiliana() { super("Duel Decks: Anthology, Garruk vs. Liliana", "DD3GVL", ExpansionSet.buildDate(2014, 12, 5), SetType.SUPPLEMENTAL); this.blockName = "Duel Decks: Anthology"; - this.hasBasicLands = false; + this.hasBasicLands = true; + cards.add(new SetCardInfo("Albino Troll", 3, Rarity.UNCOMMON, mage.cards.a.AlbinoTroll.class)); cards.add(new SetCardInfo("Bad Moon", 48, Rarity.RARE, mage.cards.b.BadMoon.class)); cards.add(new SetCardInfo("Basking Rootwalla", 2, Rarity.COMMON, mage.cards.b.BaskingRootwalla.class)); diff --git a/Mage.Sets/src/mage/sets/AnthologyJaceVsChandra.java b/Mage.Sets/src/mage/sets/DuelDecksAnthologyJaceVsChandra.java similarity index 95% rename from Mage.Sets/src/mage/sets/AnthologyJaceVsChandra.java rename to Mage.Sets/src/mage/sets/DuelDecksAnthologyJaceVsChandra.java index 92222d6eb94..d75ab380eef 100644 --- a/Mage.Sets/src/mage/sets/AnthologyJaceVsChandra.java +++ b/Mage.Sets/src/mage/sets/DuelDecksAnthologyJaceVsChandra.java @@ -6,22 +6,22 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author fireshoes */ -public final class AnthologyJaceVsChandra extends ExpansionSet { +public final class DuelDecksAnthologyJaceVsChandra extends ExpansionSet { - private static final AnthologyJaceVsChandra instance = new AnthologyJaceVsChandra(); + private static final DuelDecksAnthologyJaceVsChandra instance = new DuelDecksAnthologyJaceVsChandra(); - public static AnthologyJaceVsChandra getInstance() { + public static DuelDecksAnthologyJaceVsChandra getInstance() { return instance; } - private AnthologyJaceVsChandra() { + private DuelDecksAnthologyJaceVsChandra() { super("Duel Decks: Anthology, Jace vs. Chandra", "DD3JVC", ExpansionSet.buildDate(2014, 12, 5), SetType.SUPPLEMENTAL); this.blockName = "Duel Decks: Anthology"; - this.hasBasicLands = false; + this.hasBasicLands = true; + cards.add(new SetCardInfo("Aethersnipe", 17, Rarity.COMMON, mage.cards.a.Aethersnipe.class)); cards.add(new SetCardInfo("Air Elemental", 13, Rarity.UNCOMMON, mage.cards.a.AirElemental.class)); cards.add(new SetCardInfo("Ancestral Vision", 21, Rarity.RARE, mage.cards.a.AncestralVision.class)); diff --git a/Mage.Sets/src/mage/sets/BlessedVsCursed.java b/Mage.Sets/src/mage/sets/DuelDecksBlessedVsCursed.java similarity index 96% rename from Mage.Sets/src/mage/sets/BlessedVsCursed.java rename to Mage.Sets/src/mage/sets/DuelDecksBlessedVsCursed.java index 82d2cfd6972..2d318dce41d 100644 --- a/Mage.Sets/src/mage/sets/BlessedVsCursed.java +++ b/Mage.Sets/src/mage/sets/DuelDecksBlessedVsCursed.java @@ -6,21 +6,21 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author fireshoes */ -public final class BlessedVsCursed extends ExpansionSet { +public final class DuelDecksBlessedVsCursed extends ExpansionSet { - private static final BlessedVsCursed instance = new BlessedVsCursed(); + private static final DuelDecksBlessedVsCursed instance = new DuelDecksBlessedVsCursed(); - public static BlessedVsCursed getInstance() { + public static DuelDecksBlessedVsCursed getInstance() { return instance; } - private BlessedVsCursed() { + private DuelDecksBlessedVsCursed() { super("Duel Decks: Blessed vs. Cursed", "DDQ", ExpansionSet.buildDate(2016, 2, 26), SetType.SUPPLEMENTAL); this.blockName = "Duel Decks"; - this.hasBasicLands = false; + this.hasBasicLands = true; + cards.add(new SetCardInfo("Abattoir Ghoul", 50, Rarity.UNCOMMON, mage.cards.a.AbattoirGhoul.class)); cards.add(new SetCardInfo("Appetite for Brains", 51, Rarity.UNCOMMON, mage.cards.a.AppetiteForBrains.class)); cards.add(new SetCardInfo("Barter in Blood", 52, Rarity.UNCOMMON, mage.cards.b.BarterInBlood.class)); diff --git a/Mage.Sets/src/mage/sets/DivineVsDemonic.java b/Mage.Sets/src/mage/sets/DuelDecksDivineVsDemonic.java similarity index 95% rename from Mage.Sets/src/mage/sets/DivineVsDemonic.java rename to Mage.Sets/src/mage/sets/DuelDecksDivineVsDemonic.java index 6e942f99ece..9ea0082a56a 100644 --- a/Mage.Sets/src/mage/sets/DivineVsDemonic.java +++ b/Mage.Sets/src/mage/sets/DuelDecksDivineVsDemonic.java @@ -1,4 +1,3 @@ - package mage.sets; import mage.cards.ExpansionSet; @@ -6,21 +5,21 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author LevelX2 */ -public final class DivineVsDemonic extends ExpansionSet { +public final class DuelDecksDivineVsDemonic extends ExpansionSet { - private static final DivineVsDemonic instance = new DivineVsDemonic(); + private static final DuelDecksDivineVsDemonic instance = new DuelDecksDivineVsDemonic(); - public static DivineVsDemonic getInstance() { + public static DuelDecksDivineVsDemonic getInstance() { return instance; } - private DivineVsDemonic() { + private DuelDecksDivineVsDemonic() { super("Duel Decks: Divine vs. Demonic", "DDC", ExpansionSet.buildDate(2009, 04, 10), SetType.SUPPLEMENTAL); this.blockName = "Duel Decks"; - this.hasBasicLands = false; + this.hasBasicLands = true; + cards.add(new SetCardInfo("Abyssal Gatekeeper", 31, Rarity.COMMON, mage.cards.a.AbyssalGatekeeper.class)); cards.add(new SetCardInfo("Abyssal Specter", 40, Rarity.UNCOMMON, mage.cards.a.AbyssalSpecter.class)); cards.add(new SetCardInfo("Akroma, Angel of Wrath", 1, Rarity.MYTHIC, mage.cards.a.AkromaAngelOfWrath.class)); diff --git a/Mage.Sets/src/mage/sets/ElspethVsKiora.java b/Mage.Sets/src/mage/sets/DuelDecksElspethVsKiora.java similarity index 95% rename from Mage.Sets/src/mage/sets/ElspethVsKiora.java rename to Mage.Sets/src/mage/sets/DuelDecksElspethVsKiora.java index 48ea7fd9357..493602f3494 100644 --- a/Mage.Sets/src/mage/sets/ElspethVsKiora.java +++ b/Mage.Sets/src/mage/sets/DuelDecksElspethVsKiora.java @@ -2,26 +2,25 @@ package mage.sets; import mage.cards.ExpansionSet; -import mage.cards.i.IcatianJavelineers; import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author fireshoes */ -public final class ElspethVsKiora extends ExpansionSet { +public final class DuelDecksElspethVsKiora extends ExpansionSet { - private static final ElspethVsKiora instance = new ElspethVsKiora(); + private static final DuelDecksElspethVsKiora instance = new DuelDecksElspethVsKiora(); - public static ElspethVsKiora getInstance() { + public static DuelDecksElspethVsKiora getInstance() { return instance; } - private ElspethVsKiora() { + private DuelDecksElspethVsKiora() { super("Duel Decks: Elspeth vs. Kiora", "DDO", ExpansionSet.buildDate(2015, 2, 27), SetType.SUPPLEMENTAL); this.blockName = "Duel Decks"; - this.hasBasicLands = false; + this.hasBasicLands = true; + cards.add(new SetCardInfo("Accumulated Knowledge", 35, Rarity.COMMON, mage.cards.a.AccumulatedKnowledge.class)); cards.add(new SetCardInfo("Aetherize", 36, Rarity.UNCOMMON, mage.cards.a.Aetherize.class)); cards.add(new SetCardInfo("Banisher Priest", 2, Rarity.UNCOMMON, mage.cards.b.BanisherPriest.class)); @@ -45,7 +44,7 @@ public final class ElspethVsKiora extends ExpansionSet { cards.add(new SetCardInfo("Gustcloak Savior", 11, Rarity.RARE, mage.cards.g.GustcloakSavior.class)); cards.add(new SetCardInfo("Gustcloak Sentinel", 12, Rarity.UNCOMMON, mage.cards.g.GustcloakSentinel.class)); cards.add(new SetCardInfo("Gustcloak Skirmisher", 13, Rarity.UNCOMMON, mage.cards.g.GustcloakSkirmisher.class)); - cards.add(new SetCardInfo("Icatian Javelineers", 14, Rarity.COMMON, IcatianJavelineers.class)); + cards.add(new SetCardInfo("Icatian Javelineers", 14, Rarity.COMMON, mage.cards.i.IcatianJavelineers.class)); cards.add(new SetCardInfo("Inkwell Leviathan", 37, Rarity.RARE, mage.cards.i.InkwellLeviathan.class)); cards.add(new SetCardInfo("Island", 60, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Island", 61, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); diff --git a/Mage.Sets/src/mage/sets/ElspethVsTezzeret.java b/Mage.Sets/src/mage/sets/DuelDecksElspethVsTezzeret.java similarity index 96% rename from Mage.Sets/src/mage/sets/ElspethVsTezzeret.java rename to Mage.Sets/src/mage/sets/DuelDecksElspethVsTezzeret.java index 14916286f21..a5f17614a9f 100644 --- a/Mage.Sets/src/mage/sets/ElspethVsTezzeret.java +++ b/Mage.Sets/src/mage/sets/DuelDecksElspethVsTezzeret.java @@ -4,18 +4,19 @@ import mage.cards.ExpansionSet; import mage.constants.Rarity; import mage.constants.SetType; -public final class ElspethVsTezzeret extends ExpansionSet { +public final class DuelDecksElspethVsTezzeret extends ExpansionSet { - private static final ElspethVsTezzeret instance = new ElspethVsTezzeret(); + private static final DuelDecksElspethVsTezzeret instance = new DuelDecksElspethVsTezzeret(); - public static ElspethVsTezzeret getInstance() { + public static DuelDecksElspethVsTezzeret getInstance() { return instance; } - private ElspethVsTezzeret() { + private DuelDecksElspethVsTezzeret() { super("Duel Decks: Elspeth vs. Tezzeret", "DDF", ExpansionSet.buildDate(2010, 8, 3), SetType.SUPPLEMENTAL); this.blockName = "Duel Decks"; - this.hasBasicLands = false; + this.hasBasicLands = true; + cards.add(new SetCardInfo("Abolish", 29, Rarity.UNCOMMON, mage.cards.a.Abolish.class)); cards.add(new SetCardInfo("Aether Spellbomb", 61, Rarity.COMMON, mage.cards.a.AetherSpellbomb.class)); cards.add(new SetCardInfo("Angel of Salvation", 20, Rarity.RARE, mage.cards.a.AngelOfSalvation.class)); diff --git a/Mage.Sets/src/mage/sets/ElvesVsGoblins.java b/Mage.Sets/src/mage/sets/DuelDecksElvesVsGoblins.java similarity index 92% rename from Mage.Sets/src/mage/sets/ElvesVsGoblins.java rename to Mage.Sets/src/mage/sets/DuelDecksElvesVsGoblins.java index e41c7f5d3eb..b86f6038692 100644 --- a/Mage.Sets/src/mage/sets/ElvesVsGoblins.java +++ b/Mage.Sets/src/mage/sets/DuelDecksElvesVsGoblins.java @@ -1,8 +1,3 @@ -/* - * 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.sets; import mage.cards.ExpansionSet; @@ -10,21 +5,21 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author LevelX2 */ -public final class ElvesVsGoblins extends ExpansionSet { +public final class DuelDecksElvesVsGoblins extends ExpansionSet { - private static final ElvesVsGoblins instance = new ElvesVsGoblins(); + private static final DuelDecksElvesVsGoblins instance = new DuelDecksElvesVsGoblins(); - public static ElvesVsGoblins getInstance() { + public static DuelDecksElvesVsGoblins getInstance() { return instance; } - private ElvesVsGoblins() { + private DuelDecksElvesVsGoblins() { super("Duel Decks: Elves vs. Goblins", "EVG", ExpansionSet.buildDate(2007, 11, 16), SetType.SUPPLEMENTAL); this.blockName = "Duel Decks"; - this.hasBasicLands = false; + this.hasBasicLands = true; + cards.add(new SetCardInfo("Akki Coalflinger", 33, Rarity.UNCOMMON, mage.cards.a.AkkiCoalflinger.class)); cards.add(new SetCardInfo("Allosaurus Rider", 2, Rarity.RARE, mage.cards.a.AllosaurusRider.class)); cards.add(new SetCardInfo("Ambush Commander", 1, Rarity.RARE, mage.cards.a.AmbushCommander.class)); @@ -83,7 +78,7 @@ public final class ElvesVsGoblins extends ExpansionSet { cards.add(new SetCardInfo("Wellwisher", 15, Rarity.COMMON, mage.cards.w.Wellwisher.class)); cards.add(new SetCardInfo("Wildsize", 23, Rarity.COMMON, mage.cards.w.Wildsize.class)); cards.add(new SetCardInfo("Wirewood Herald", 16, Rarity.COMMON, mage.cards.w.WirewoodHerald.class)); - cards.add(new SetCardInfo("Wirewood Lodge", 26, Rarity.RARE, mage.cards.w.WirewoodLodge.class)); + cards.add(new SetCardInfo("Wirewood Lodge", 26, Rarity.UNCOMMON, mage.cards.w.WirewoodLodge.class)); cards.add(new SetCardInfo("Wirewood Symbiote", 17, Rarity.UNCOMMON, mage.cards.w.WirewoodSymbiote.class)); cards.add(new SetCardInfo("Wood Elves", 18, Rarity.COMMON, mage.cards.w.WoodElves.class)); cards.add(new SetCardInfo("Wren's Run Vanquisher", 19, Rarity.UNCOMMON, mage.cards.w.WrensRunVanquisher.class)); diff --git a/Mage.Sets/src/mage/sets/ElvesVsInventors.java b/Mage.Sets/src/mage/sets/DuelDecksElvesVsInventors.java similarity index 97% rename from Mage.Sets/src/mage/sets/ElvesVsInventors.java rename to Mage.Sets/src/mage/sets/DuelDecksElvesVsInventors.java index 7bfcee63392..1624a92d500 100644 --- a/Mage.Sets/src/mage/sets/ElvesVsInventors.java +++ b/Mage.Sets/src/mage/sets/DuelDecksElvesVsInventors.java @@ -6,20 +6,20 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author TheElk801 */ -public final class ElvesVsInventors extends ExpansionSet { +public final class DuelDecksElvesVsInventors extends ExpansionSet { - private static final ElvesVsInventors instance = new ElvesVsInventors(); + private static final DuelDecksElvesVsInventors instance = new DuelDecksElvesVsInventors(); - public static ElvesVsInventors getInstance() { + public static DuelDecksElvesVsInventors getInstance() { return instance; } - private ElvesVsInventors() { + private DuelDecksElvesVsInventors() { super("Duel Decks: Elves vs. Inventors", "DDU", ExpansionSet.buildDate(2018, 4, 6), SetType.SUPPLEMENTAL); this.blockName = "Duel Decks"; + cards.add(new SetCardInfo("Artificer's Epiphany", 36, Rarity.COMMON, mage.cards.a.ArtificersEpiphany.class)); cards.add(new SetCardInfo("Barrage Ogre", 44, Rarity.UNCOMMON, mage.cards.b.BarrageOgre.class)); cards.add(new SetCardInfo("Darksteel Citadel", 65, Rarity.UNCOMMON, mage.cards.d.DarksteelCitadel.class)); diff --git a/Mage.Sets/src/mage/sets/GarrukVsLiliana.java b/Mage.Sets/src/mage/sets/DuelDecksGarrukVsLiliana.java similarity index 96% rename from Mage.Sets/src/mage/sets/GarrukVsLiliana.java rename to Mage.Sets/src/mage/sets/DuelDecksGarrukVsLiliana.java index f1d2fe5342d..ec381e29506 100644 --- a/Mage.Sets/src/mage/sets/GarrukVsLiliana.java +++ b/Mage.Sets/src/mage/sets/DuelDecksGarrukVsLiliana.java @@ -10,21 +10,21 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author LevelX2 */ -public final class GarrukVsLiliana extends ExpansionSet { +public final class DuelDecksGarrukVsLiliana extends ExpansionSet { - private static final GarrukVsLiliana instance = new GarrukVsLiliana(); + private static final DuelDecksGarrukVsLiliana instance = new DuelDecksGarrukVsLiliana(); - public static GarrukVsLiliana getInstance() { + public static DuelDecksGarrukVsLiliana getInstance() { return instance; } - private GarrukVsLiliana() { + private DuelDecksGarrukVsLiliana() { super("Duel Decks: Garruk vs. Liliana", "DDD", ExpansionSet.buildDate(2009, 10, 30), SetType.SUPPLEMENTAL); this.blockName = "Duel Decks"; - this.hasBasicLands = false; + this.hasBasicLands = true; + cards.add(new SetCardInfo("Albino Troll", 3, Rarity.UNCOMMON, mage.cards.a.AlbinoTroll.class)); cards.add(new SetCardInfo("Bad Moon", 48, Rarity.RARE, mage.cards.b.BadMoon.class)); cards.add(new SetCardInfo("Basking Rootwalla", 2, Rarity.COMMON, mage.cards.b.BaskingRootwalla.class)); diff --git a/Mage.Sets/src/mage/sets/HeroesVsMonsters.java b/Mage.Sets/src/mage/sets/DuelDecksHeroesVsMonsters.java similarity index 96% rename from Mage.Sets/src/mage/sets/HeroesVsMonsters.java rename to Mage.Sets/src/mage/sets/DuelDecksHeroesVsMonsters.java index 57b9a99bf7f..b82b65316d5 100644 --- a/Mage.Sets/src/mage/sets/HeroesVsMonsters.java +++ b/Mage.Sets/src/mage/sets/DuelDecksHeroesVsMonsters.java @@ -6,21 +6,21 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author LevelX2 */ -public final class HeroesVsMonsters extends ExpansionSet { +public final class DuelDecksHeroesVsMonsters extends ExpansionSet { - private static final HeroesVsMonsters instance = new HeroesVsMonsters(); + private static final DuelDecksHeroesVsMonsters instance = new DuelDecksHeroesVsMonsters(); - public static HeroesVsMonsters getInstance() { + public static DuelDecksHeroesVsMonsters getInstance() { return instance; } - private HeroesVsMonsters() { + private DuelDecksHeroesVsMonsters() { super("Duel Decks: Heroes vs. Monsters", "DDL", ExpansionSet.buildDate(2013, 9, 6), SetType.SUPPLEMENTAL); this.blockName = "Duel Decks"; - this.hasBasicLands = false; + this.hasBasicLands = true; + cards.add(new SetCardInfo("Anax and Cymede", 11, Rarity.RARE, mage.cards.a.AnaxAndCymede.class)); cards.add(new SetCardInfo("Armory Guard", 12, Rarity.COMMON, mage.cards.a.ArmoryGuard.class)); cards.add(new SetCardInfo("Auramancer", 9, Rarity.COMMON, mage.cards.a.Auramancer.class)); diff --git a/Mage.Sets/src/mage/sets/IzzetVsGolgari.java b/Mage.Sets/src/mage/sets/DuelDecksIzzetVsGolgari.java similarity index 97% rename from Mage.Sets/src/mage/sets/IzzetVsGolgari.java rename to Mage.Sets/src/mage/sets/DuelDecksIzzetVsGolgari.java index 7c6b49e11cd..aaa55c35281 100644 --- a/Mage.Sets/src/mage/sets/IzzetVsGolgari.java +++ b/Mage.Sets/src/mage/sets/DuelDecksIzzetVsGolgari.java @@ -6,21 +6,21 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author LevelX2 */ -public final class IzzetVsGolgari extends ExpansionSet { +public final class DuelDecksIzzetVsGolgari extends ExpansionSet { - private static final IzzetVsGolgari instance = new IzzetVsGolgari(); + private static final DuelDecksIzzetVsGolgari instance = new DuelDecksIzzetVsGolgari(); - public static IzzetVsGolgari getInstance() { + public static DuelDecksIzzetVsGolgari getInstance() { return instance; } - private IzzetVsGolgari() { + private DuelDecksIzzetVsGolgari() { super("Duel Decks: Izzet vs. Golgari", "DDJ", ExpansionSet.buildDate(2012, 9, 7), SetType.SUPPLEMENTAL); this.blockName = "Duel Decks"; - this.hasBasicLands = false; + this.hasBasicLands = true; + cards.add(new SetCardInfo("Barren Moor", 78, Rarity.COMMON, mage.cards.b.BarrenMoor.class)); cards.add(new SetCardInfo("Boneyard Wurm", 51, Rarity.UNCOMMON, mage.cards.b.BoneyardWurm.class)); cards.add(new SetCardInfo("Brainstorm", 13, Rarity.COMMON, mage.cards.b.Brainstorm.class)); diff --git a/Mage.Sets/src/mage/sets/JaceVsChandra.java b/Mage.Sets/src/mage/sets/DuelDecksJaceVsChandra.java similarity index 96% rename from Mage.Sets/src/mage/sets/JaceVsChandra.java rename to Mage.Sets/src/mage/sets/DuelDecksJaceVsChandra.java index ad36e26b9a5..ba925a659df 100644 --- a/Mage.Sets/src/mage/sets/JaceVsChandra.java +++ b/Mage.Sets/src/mage/sets/DuelDecksJaceVsChandra.java @@ -10,21 +10,21 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author LevelX2 */ -public final class JaceVsChandra extends ExpansionSet { +public final class DuelDecksJaceVsChandra extends ExpansionSet { - private static final JaceVsChandra instance = new JaceVsChandra(); + private static final DuelDecksJaceVsChandra instance = new DuelDecksJaceVsChandra(); - public static JaceVsChandra getInstance() { + public static DuelDecksJaceVsChandra getInstance() { return instance; } - private JaceVsChandra() { + private DuelDecksJaceVsChandra() { super("Duel Decks: Jace vs. Chandra", "DD2", ExpansionSet.buildDate(2008, 11, 07), SetType.SUPPLEMENTAL); this.blockName = "Duel Decks"; - this.hasBasicLands = false; + this.hasBasicLands = true; + cards.add(new SetCardInfo("Aethersnipe", 17, Rarity.COMMON, mage.cards.a.Aethersnipe.class)); cards.add(new SetCardInfo("Air Elemental", 13, Rarity.UNCOMMON, mage.cards.a.AirElemental.class)); cards.add(new SetCardInfo("Ancestral Vision", 21, Rarity.RARE, mage.cards.a.AncestralVision.class)); diff --git a/Mage.Sets/src/mage/sets/JaceVsVraska.java b/Mage.Sets/src/mage/sets/DuelDecksJaceVsVraska.java similarity index 97% rename from Mage.Sets/src/mage/sets/JaceVsVraska.java rename to Mage.Sets/src/mage/sets/DuelDecksJaceVsVraska.java index 097572aa148..877cb615163 100644 --- a/Mage.Sets/src/mage/sets/JaceVsVraska.java +++ b/Mage.Sets/src/mage/sets/DuelDecksJaceVsVraska.java @@ -6,21 +6,21 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author LevelX2 */ -public final class JaceVsVraska extends ExpansionSet { +public final class DuelDecksJaceVsVraska extends ExpansionSet { - private static final JaceVsVraska instance = new JaceVsVraska(); + private static final DuelDecksJaceVsVraska instance = new DuelDecksJaceVsVraska(); - public static JaceVsVraska getInstance() { + public static DuelDecksJaceVsVraska getInstance() { return instance; } - private JaceVsVraska() { + private DuelDecksJaceVsVraska() { super("Duel Decks: Jace vs. Vraska", "DDM", ExpansionSet.buildDate(2014, 3, 14), SetType.SUPPLEMENTAL); this.blockName = "Duel Decks"; - this.hasBasicLands = false; + this.hasBasicLands = true; + cards.add(new SetCardInfo("Acidic Slime", 64, Rarity.UNCOMMON, mage.cards.a.AcidicSlime.class)); cards.add(new SetCardInfo("Aeon Chronicler", 17, Rarity.RARE, mage.cards.a.AeonChronicler.class)); cards.add(new SetCardInfo("Aether Adept", 12, Rarity.COMMON, mage.cards.a.AetherAdept.class)); diff --git a/Mage.Sets/src/mage/sets/KnightsVsDragons.java b/Mage.Sets/src/mage/sets/DuelDecksKnightsVsDragons.java similarity index 96% rename from Mage.Sets/src/mage/sets/KnightsVsDragons.java rename to Mage.Sets/src/mage/sets/DuelDecksKnightsVsDragons.java index 4e0eb601379..a62a30a8349 100644 --- a/Mage.Sets/src/mage/sets/KnightsVsDragons.java +++ b/Mage.Sets/src/mage/sets/DuelDecksKnightsVsDragons.java @@ -6,21 +6,21 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author LevelX2 */ -public final class KnightsVsDragons extends ExpansionSet { +public final class DuelDecksKnightsVsDragons extends ExpansionSet { - private static final KnightsVsDragons instance = new KnightsVsDragons(); + private static final DuelDecksKnightsVsDragons instance = new DuelDecksKnightsVsDragons(); - public static KnightsVsDragons getInstance() { + public static DuelDecksKnightsVsDragons getInstance() { return instance; } - private KnightsVsDragons() { + private DuelDecksKnightsVsDragons() { super("Duel Decks: Knights vs. Dragons", "DDG", ExpansionSet.buildDate(2011, 4, 1), SetType.SUPPLEMENTAL); this.blockName = "Duel Decks"; - this.hasBasicLands = false; + this.hasBasicLands = true; + cards.add(new SetCardInfo("Alaborn Cavalier", 18, Rarity.UNCOMMON, mage.cards.a.AlabornCavalier.class)); cards.add(new SetCardInfo("Armillary Sphere", 62, Rarity.COMMON, mage.cards.a.ArmillarySphere.class)); cards.add(new SetCardInfo("Benalish Lancer", 12, Rarity.COMMON, mage.cards.b.BenalishLancer.class)); diff --git a/Mage.Sets/src/mage/sets/MerfolkVsGoblins.java b/Mage.Sets/src/mage/sets/DuelDecksMerfolkVsGoblins.java similarity index 89% rename from Mage.Sets/src/mage/sets/MerfolkVsGoblins.java rename to Mage.Sets/src/mage/sets/DuelDecksMerfolkVsGoblins.java index 3fc8fd2ed83..2c0babb3ef8 100644 --- a/Mage.Sets/src/mage/sets/MerfolkVsGoblins.java +++ b/Mage.Sets/src/mage/sets/DuelDecksMerfolkVsGoblins.java @@ -6,21 +6,20 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author fireshoes */ -public final class MerfolkVsGoblins extends ExpansionSet { +public final class DuelDecksMerfolkVsGoblins extends ExpansionSet { - private static final MerfolkVsGoblins instance = new MerfolkVsGoblins(); + private static final DuelDecksMerfolkVsGoblins instance = new DuelDecksMerfolkVsGoblins(); - public static MerfolkVsGoblins getInstance() { + public static DuelDecksMerfolkVsGoblins getInstance() { return instance; } - private MerfolkVsGoblins() { + private DuelDecksMerfolkVsGoblins() { super("Duel Decks: Merfolk vs. Goblins", "DDT", ExpansionSet.buildDate(2017, 11, 10), SetType.SUPPLEMENTAL); this.blockName = "Duel Decks"; - this.hasBasicLands = false; + this.hasBasicLands = true; cards.add(new SetCardInfo("Aquitect's Will", 2, Rarity.COMMON, mage.cards.a.AquitectsWill.class)); cards.add(new SetCardInfo("Battle Squadron", 33, Rarity.UNCOMMON, mage.cards.b.BattleSquadron.class)); @@ -54,10 +53,10 @@ public final class MerfolkVsGoblins extends ExpansionSet { cards.add(new SetCardInfo("Harbinger of the Tides", 7, Rarity.RARE, mage.cards.h.HarbingerOfTheTides.class)); cards.add(new SetCardInfo("Hordeling Outburst", 51, Rarity.UNCOMMON, mage.cards.h.HordelingOutburst.class)); cards.add(new SetCardInfo("Inkfathom Divers", 8, Rarity.COMMON, mage.cards.i.InkfathomDivers.class)); - cards.add(new SetCardInfo("Island", 28, Rarity.LAND, mage.cards.basiclands.Island.class)); - cards.add(new SetCardInfo("Island", 29, Rarity.LAND, mage.cards.basiclands.Island.class)); - cards.add(new SetCardInfo("Island", 30, Rarity.LAND, mage.cards.basiclands.Island.class)); - cards.add(new SetCardInfo("Island", 31, Rarity.LAND, mage.cards.basiclands.Island.class)); + cards.add(new SetCardInfo("Island", 28, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Island", 29, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Island", 30, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Island", 31, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Krenko's Command", 53, Rarity.COMMON, mage.cards.k.KrenkosCommand.class)); cards.add(new SetCardInfo("Krenko, Mob Boss", 52, Rarity.RARE, mage.cards.k.KrenkoMobBoss.class)); cards.add(new SetCardInfo("Lonely Sandbar", 27, Rarity.COMMON, mage.cards.l.LonelySandbar.class)); @@ -69,10 +68,10 @@ public final class MerfolkVsGoblins extends ExpansionSet { cards.add(new SetCardInfo("Merrow Reejerey", 13, Rarity.UNCOMMON, mage.cards.m.MerrowReejerey.class)); cards.add(new SetCardInfo("Mind Spring", 14, Rarity.RARE, mage.cards.m.MindSpring.class)); cards.add(new SetCardInfo("Misdirection", 15, Rarity.RARE, mage.cards.m.Misdirection.class)); - cards.add(new SetCardInfo("Mountain", 60, Rarity.LAND, mage.cards.basiclands.Mountain.class)); - cards.add(new SetCardInfo("Mountain", 61, Rarity.LAND, mage.cards.basiclands.Mountain.class)); - cards.add(new SetCardInfo("Mountain", 62, Rarity.LAND, mage.cards.basiclands.Mountain.class)); - cards.add(new SetCardInfo("Mountain", 63, Rarity.LAND, mage.cards.basiclands.Mountain.class)); + cards.add(new SetCardInfo("Mountain", 60, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mountain", 61, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mountain", 62, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mountain", 63, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Relentless Assault", 54, Rarity.RARE, mage.cards.r.RelentlessAssault.class)); cards.add(new SetCardInfo("Rootwater Hunter", 16, Rarity.UNCOMMON, mage.cards.r.RootwaterHunter.class)); cards.add(new SetCardInfo("Scroll Thief", 17, Rarity.COMMON, mage.cards.s.ScrollThief.class)); diff --git a/Mage.Sets/src/mage/sets/MindVsMight.java b/Mage.Sets/src/mage/sets/DuelDecksMindVsMight.java similarity index 94% rename from Mage.Sets/src/mage/sets/MindVsMight.java rename to Mage.Sets/src/mage/sets/DuelDecksMindVsMight.java index 48d26f8b5ea..cab524d124a 100644 --- a/Mage.Sets/src/mage/sets/MindVsMight.java +++ b/Mage.Sets/src/mage/sets/DuelDecksMindVsMight.java @@ -1,8 +1,3 @@ -/* - * 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.sets; import mage.cards.ExpansionSet; @@ -10,21 +5,21 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author fireshoes */ -public final class MindVsMight extends ExpansionSet { +public final class DuelDecksMindVsMight extends ExpansionSet { - private static final MindVsMight instance = new MindVsMight(); + private static final DuelDecksMindVsMight instance = new DuelDecksMindVsMight(); - public static MindVsMight getInstance() { + public static DuelDecksMindVsMight getInstance() { return instance; } - private MindVsMight() { + private DuelDecksMindVsMight() { super("Duel Decks: Mind vs. Might", "DDS", ExpansionSet.buildDate(2017, 3, 31), SetType.SUPPLEMENTAL); this.blockName = "Duel Decks"; - this.hasBasicLands = false; + this.hasBasicLands = true; + cards.add(new SetCardInfo("Ambassador Oak", 42, Rarity.COMMON, mage.cards.a.AmbassadorOak.class)); cards.add(new SetCardInfo("Beacon of Destruction", 35, Rarity.RARE, mage.cards.b.BeaconOfDestruction.class)); cards.add(new SetCardInfo("Beacon of Tomorrows", 2, Rarity.RARE, mage.cards.b.BeaconOfTomorrows.class)); @@ -36,7 +31,7 @@ public final class MindVsMight extends ExpansionSet { cards.add(new SetCardInfo("Coat of Arms", 58, Rarity.RARE, mage.cards.c.CoatOfArms.class)); cards.add(new SetCardInfo("Deep-Sea Kraken", 3, Rarity.RARE, mage.cards.d.DeepSeaKraken.class)); cards.add(new SetCardInfo("Desperate Ritual", 14, Rarity.UNCOMMON, mage.cards.d.DesperateRitual.class)); - cards.add(new SetCardInfo("Empty the Warrens", 15, Rarity.RARE, mage.cards.e.EmptyTheWarrens.class)); + cards.add(new SetCardInfo("Empty the Warrens", 15, Rarity.COMMON, mage.cards.e.EmptyTheWarrens.class)); cards.add(new SetCardInfo("Firebolt", 37, Rarity.COMMON, mage.cards.f.Firebolt.class)); cards.add(new SetCardInfo("Firemind's Foresight", 21, Rarity.RARE, mage.cards.f.FiremindsForesight.class)); cards.add(new SetCardInfo("Forest", 63, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); diff --git a/Mage.Sets/src/mage/sets/NissaVsObNixilis.java b/Mage.Sets/src/mage/sets/DuelDecksNissaVsObNixilis.java similarity index 94% rename from Mage.Sets/src/mage/sets/NissaVsObNixilis.java rename to Mage.Sets/src/mage/sets/DuelDecksNissaVsObNixilis.java index 9a814fd36de..aee53972a3c 100644 --- a/Mage.Sets/src/mage/sets/NissaVsObNixilis.java +++ b/Mage.Sets/src/mage/sets/DuelDecksNissaVsObNixilis.java @@ -5,21 +5,20 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author fireshoes */ -public final class NissaVsObNixilis extends ExpansionSet { +public final class DuelDecksNissaVsObNixilis extends ExpansionSet { - private static final NissaVsObNixilis instance = new NissaVsObNixilis(); + private static final DuelDecksNissaVsObNixilis instance = new DuelDecksNissaVsObNixilis(); - public static NissaVsObNixilis getInstance() { + public static DuelDecksNissaVsObNixilis getInstance() { return instance; } - private NissaVsObNixilis() { + private DuelDecksNissaVsObNixilis() { super("Duel Decks: Nissa vs. Ob Nixilis", "DDR", ExpansionSet.buildDate(2016, 9, 2), SetType.SUPPLEMENTAL); this.blockName = "Duel Decks"; - this.hasBasicLands = false; + this.hasBasicLands = true; cards.add(new SetCardInfo("Abundance", 2, Rarity.RARE, mage.cards.a.Abundance.class)); cards.add(new SetCardInfo("Altar's Reap", 37, Rarity.COMMON, mage.cards.a.AltarsReap.class)); @@ -37,7 +36,7 @@ public final class NissaVsObNixilis extends ExpansionSet { cards.add(new SetCardInfo("Desecration Demon", 44, Rarity.RARE, mage.cards.d.DesecrationDemon.class)); cards.add(new SetCardInfo("Despoiler of Souls", 45, Rarity.RARE, mage.cards.d.DespoilerOfSouls.class)); cards.add(new SetCardInfo("Disfigure", 46, Rarity.COMMON, mage.cards.d.Disfigure.class)); - cards.add(new SetCardInfo("Doom Blade", 47, Rarity.COMMON, mage.cards.d.DoomBlade.class)); + cards.add(new SetCardInfo("Doom Blade", 47, Rarity.UNCOMMON, mage.cards.d.DoomBlade.class)); cards.add(new SetCardInfo("Elvish Visionary", 8, Rarity.COMMON, mage.cards.e.ElvishVisionary.class)); cards.add(new SetCardInfo("Fertile Thicket", 27, Rarity.COMMON, mage.cards.f.FertileThicket.class)); cards.add(new SetCardInfo("Fertilid", 9, Rarity.COMMON, mage.cards.f.Fertilid.class)); @@ -88,7 +87,7 @@ public final class NissaVsObNixilis extends ExpansionSet { cards.add(new SetCardInfo("Treetop Village", 30, Rarity.UNCOMMON, mage.cards.t.TreetopVillage.class)); cards.add(new SetCardInfo("Unhallowed Pact", 64, Rarity.COMMON, mage.cards.u.UnhallowedPact.class)); cards.add(new SetCardInfo("Vines of the Recluse", 23, Rarity.COMMON, mage.cards.v.VinesOfTheRecluse.class)); - cards.add(new SetCardInfo("Walker of the Grove", 24, Rarity.COMMON, mage.cards.w.WalkerOfTheGrove.class)); + cards.add(new SetCardInfo("Walker of the Grove", 24, Rarity.UNCOMMON, mage.cards.w.WalkerOfTheGrove.class)); cards.add(new SetCardInfo("Woodborn Behemoth", 26, Rarity.UNCOMMON, mage.cards.w.WoodbornBehemoth.class)); cards.add(new SetCardInfo("Wood Elves", 25, Rarity.COMMON, mage.cards.w.WoodElves.class)); } diff --git a/Mage.Sets/src/mage/sets/PhyrexiaVsTheCoalition.java b/Mage.Sets/src/mage/sets/DuelDecksPhyrexiaVsTheCoalition.java similarity index 96% rename from Mage.Sets/src/mage/sets/PhyrexiaVsTheCoalition.java rename to Mage.Sets/src/mage/sets/DuelDecksPhyrexiaVsTheCoalition.java index e32379cc811..44f120822d6 100644 --- a/Mage.Sets/src/mage/sets/PhyrexiaVsTheCoalition.java +++ b/Mage.Sets/src/mage/sets/DuelDecksPhyrexiaVsTheCoalition.java @@ -6,22 +6,22 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author LevelX2 */ -public final class PhyrexiaVsTheCoalition extends ExpansionSet { +public final class DuelDecksPhyrexiaVsTheCoalition extends ExpansionSet { - private static final PhyrexiaVsTheCoalition instance = new PhyrexiaVsTheCoalition(); + private static final DuelDecksPhyrexiaVsTheCoalition instance = new DuelDecksPhyrexiaVsTheCoalition(); - public static PhyrexiaVsTheCoalition getInstance() { + public static DuelDecksPhyrexiaVsTheCoalition getInstance() { return instance; } - private PhyrexiaVsTheCoalition() { + private DuelDecksPhyrexiaVsTheCoalition() { super("Duel Decks: Phyrexia vs. the Coalition", "DDE", ExpansionSet.buildDate(2010, 3, 19), SetType.SUPPLEMENTAL); this.blockName = "Duel Decks"; - this.hasBasicLands = false; + this.hasBasicLands = true; + cards.add(new SetCardInfo("Allied Strategies", 63, Rarity.UNCOMMON, mage.cards.a.AlliedStrategies.class)); cards.add(new SetCardInfo("Armadillo Cloak", 58, Rarity.COMMON, mage.cards.a.ArmadilloCloak.class)); cards.add(new SetCardInfo("Bone Shredder", 5, Rarity.UNCOMMON, mage.cards.b.BoneShredder.class)); diff --git a/Mage.Sets/src/mage/sets/SorinVsTibalt.java b/Mage.Sets/src/mage/sets/DuelDecksSorinVsTibalt.java similarity index 96% rename from Mage.Sets/src/mage/sets/SorinVsTibalt.java rename to Mage.Sets/src/mage/sets/DuelDecksSorinVsTibalt.java index a4167a3b4a1..4892991ab27 100644 --- a/Mage.Sets/src/mage/sets/SorinVsTibalt.java +++ b/Mage.Sets/src/mage/sets/DuelDecksSorinVsTibalt.java @@ -6,21 +6,21 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author LevelX2 */ -public final class SorinVsTibalt extends ExpansionSet { +public final class DuelDecksSorinVsTibalt extends ExpansionSet { - private static final SorinVsTibalt instance = new SorinVsTibalt(); + private static final DuelDecksSorinVsTibalt instance = new DuelDecksSorinVsTibalt(); - public static SorinVsTibalt getInstance() { + public static DuelDecksSorinVsTibalt getInstance() { return instance; } - private SorinVsTibalt() { + private DuelDecksSorinVsTibalt() { super("Duel Decks: Sorin vs. Tibalt", "DDK", ExpansionSet.buildDate(2013, 3, 15), SetType.SUPPLEMENTAL); this.blockName = "Duel Decks"; - this.hasBasicLands = false; + this.hasBasicLands = true; + cards.add(new SetCardInfo("Absorb Vis", 31, Rarity.COMMON, mage.cards.a.AbsorbVis.class)); cards.add(new SetCardInfo("Akoum Refuge", 73, Rarity.UNCOMMON, mage.cards.a.AkoumRefuge.class)); cards.add(new SetCardInfo("Ancient Craving", 28, Rarity.RARE, mage.cards.a.AncientCraving.class)); diff --git a/Mage.Sets/src/mage/sets/SpeedVsCunning.java b/Mage.Sets/src/mage/sets/DuelDecksSpeedVsCunning.java similarity index 96% rename from Mage.Sets/src/mage/sets/SpeedVsCunning.java rename to Mage.Sets/src/mage/sets/DuelDecksSpeedVsCunning.java index 792095ff06b..4391b258fa0 100644 --- a/Mage.Sets/src/mage/sets/SpeedVsCunning.java +++ b/Mage.Sets/src/mage/sets/DuelDecksSpeedVsCunning.java @@ -6,21 +6,21 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author LevelX2 */ -public final class SpeedVsCunning extends ExpansionSet { +public final class DuelDecksSpeedVsCunning extends ExpansionSet { - private static final SpeedVsCunning instance = new SpeedVsCunning(); + private static final DuelDecksSpeedVsCunning instance = new DuelDecksSpeedVsCunning(); - public static SpeedVsCunning getInstance() { + public static DuelDecksSpeedVsCunning getInstance() { return instance; } - private SpeedVsCunning() { + private DuelDecksSpeedVsCunning() { super("Duel Decks: Speed vs. Cunning", "DDN", ExpansionSet.buildDate(2014, 9, 5), SetType.SUPPLEMENTAL); this.blockName = "Duel Decks"; - this.hasBasicLands = false; + this.hasBasicLands = true; + cards.add(new SetCardInfo("Act of Treason", 26, Rarity.COMMON, mage.cards.a.ActOfTreason.class)); cards.add(new SetCardInfo("Aquamorph Entity", 54, Rarity.COMMON, mage.cards.a.AquamorphEntity.class)); cards.add(new SetCardInfo("Arcanis the Omnipotent", 42, Rarity.MYTHIC, mage.cards.a.ArcanisTheOmnipotent.class)); diff --git a/Mage.Sets/src/mage/sets/VenserVsKoth.java b/Mage.Sets/src/mage/sets/DuelDecksVenserVsKoth.java similarity index 95% rename from Mage.Sets/src/mage/sets/VenserVsKoth.java rename to Mage.Sets/src/mage/sets/DuelDecksVenserVsKoth.java index 66ddf824c45..0057b5c79e1 100644 --- a/Mage.Sets/src/mage/sets/VenserVsKoth.java +++ b/Mage.Sets/src/mage/sets/DuelDecksVenserVsKoth.java @@ -1,4 +1,3 @@ - package mage.sets; import mage.cards.ExpansionSet; @@ -6,21 +5,21 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author LevelX2 */ -public final class VenserVsKoth extends ExpansionSet { +public final class DuelDecksVenserVsKoth extends ExpansionSet { - private static final VenserVsKoth instance = new VenserVsKoth(); + private static final DuelDecksVenserVsKoth instance = new DuelDecksVenserVsKoth(); - public static VenserVsKoth getInstance() { + public static DuelDecksVenserVsKoth getInstance() { return instance; } - private VenserVsKoth() { + private DuelDecksVenserVsKoth() { super("Duel Decks: Venser vs. Koth", "DDI", ExpansionSet.buildDate(2012, 3, 30), SetType.SUPPLEMENTAL); this.blockName = "Duel Decks"; - this.hasBasicLands = false; + this.hasBasicLands = true; + cards.add(new SetCardInfo("Aether Membrane", 48, Rarity.UNCOMMON, mage.cards.a.AetherMembrane.class)); cards.add(new SetCardInfo("Angelic Shield", 27, Rarity.UNCOMMON, mage.cards.a.AngelicShield.class)); cards.add(new SetCardInfo("Anger", 51, Rarity.UNCOMMON, mage.cards.a.Anger.class)); @@ -36,7 +35,7 @@ public final class VenserVsKoth extends ExpansionSet { cards.add(new SetCardInfo("Cosi's Ravager", 52, Rarity.COMMON, mage.cards.c.CosisRavager.class)); cards.add(new SetCardInfo("Cryptic Annelid", 15, Rarity.UNCOMMON, mage.cards.c.CrypticAnnelid.class)); cards.add(new SetCardInfo("Downhill Charge", 69, Rarity.COMMON, mage.cards.d.DownhillCharge.class)); - cards.add(new SetCardInfo("Earth Servant", 60, Rarity.COMMON, mage.cards.e.EarthServant.class)); + cards.add(new SetCardInfo("Earth Servant", 60, Rarity.UNCOMMON, mage.cards.e.EarthServant.class)); cards.add(new SetCardInfo("Fiery Hellhound", 49, Rarity.COMMON, mage.cards.f.FieryHellhound.class)); cards.add(new SetCardInfo("Flood Plain", 34, Rarity.UNCOMMON, mage.cards.f.FloodPlain.class)); cards.add(new SetCardInfo("Galepowder Mage", 12, Rarity.RARE, mage.cards.g.GalepowderMage.class)); diff --git a/Mage.Sets/src/mage/sets/ZendikarVsEldrazi.java b/Mage.Sets/src/mage/sets/DuelDecksZendikarVsEldrazi.java similarity index 96% rename from Mage.Sets/src/mage/sets/ZendikarVsEldrazi.java rename to Mage.Sets/src/mage/sets/DuelDecksZendikarVsEldrazi.java index 372ba21583c..2ae4c83a9fc 100644 --- a/Mage.Sets/src/mage/sets/ZendikarVsEldrazi.java +++ b/Mage.Sets/src/mage/sets/DuelDecksZendikarVsEldrazi.java @@ -1,4 +1,3 @@ - package mage.sets; import mage.cards.ExpansionSet; @@ -6,21 +5,21 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author fireshoes */ -public final class ZendikarVsEldrazi extends ExpansionSet { +public final class DuelDecksZendikarVsEldrazi extends ExpansionSet { - private static final ZendikarVsEldrazi instance = new ZendikarVsEldrazi(); + private static final DuelDecksZendikarVsEldrazi instance = new DuelDecksZendikarVsEldrazi(); - public static ZendikarVsEldrazi getInstance() { + public static DuelDecksZendikarVsEldrazi getInstance() { return instance; } - private ZendikarVsEldrazi() { + private DuelDecksZendikarVsEldrazi() { super("Duel Decks: Zendikar vs. Eldrazi", "DDP", ExpansionSet.buildDate(2015, 8, 28), SetType.SUPPLEMENTAL); this.blockName = "Duel Decks"; - this.hasBasicLands = false; + this.hasBasicLands = true; + cards.add(new SetCardInfo("Affa Guard Hound", 2, Rarity.UNCOMMON, mage.cards.a.AffaGuardHound.class)); cards.add(new SetCardInfo("Akoum Refuge", 67, Rarity.UNCOMMON, mage.cards.a.AkoumRefuge.class)); cards.add(new SetCardInfo("Artisan of Kozilek", 42, Rarity.UNCOMMON, mage.cards.a.ArtisanOfKozilek.class)); @@ -38,7 +37,7 @@ public final class ZendikarVsEldrazi extends ExpansionSet { cards.add(new SetCardInfo("Eldrazi Temple", 68, Rarity.UNCOMMON, mage.cards.e.EldraziTemple.class)); cards.add(new SetCardInfo("Emrakul's Hatcher", 59, Rarity.COMMON, mage.cards.e.EmrakulsHatcher.class)); cards.add(new SetCardInfo("Evolving Wilds", 31, Rarity.COMMON, mage.cards.e.EvolvingWilds.class)); - cards.add(new SetCardInfo("Explorer's Scope", 28, Rarity.UNCOMMON, mage.cards.e.ExplorersScope.class)); + cards.add(new SetCardInfo("Explorer's Scope", 28, Rarity.COMMON, mage.cards.e.ExplorersScope.class)); cards.add(new SetCardInfo("Forerunner of Slaughter", 64, Rarity.UNCOMMON, mage.cards.f.ForerunnerOfSlaughter.class)); cards.add(new SetCardInfo("Forest", 38, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Forest", 39, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); diff --git a/Mage.Sets/src/mage/sets/DuelsOfThePlaneswalkers.java b/Mage.Sets/src/mage/sets/DuelsOfThePlaneswalkers.java index 9ea33a12243..0c6d15850fa 100644 --- a/Mage.Sets/src/mage/sets/DuelsOfThePlaneswalkers.java +++ b/Mage.Sets/src/mage/sets/DuelsOfThePlaneswalkers.java @@ -5,10 +5,6 @@ import mage.cards.ExpansionSet; import mage.constants.Rarity; import mage.constants.SetType; -/** - * - * @author Shootbot - */ public final class DuelsOfThePlaneswalkers extends ExpansionSet { private static final DuelsOfThePlaneswalkers instance = new DuelsOfThePlaneswalkers(); @@ -19,6 +15,119 @@ public final class DuelsOfThePlaneswalkers extends ExpansionSet { private DuelsOfThePlaneswalkers() { super("Duels of the Planeswalkers", "DPA", ExpansionSet.buildDate(2010, 6, 4), SetType.SUPPLEMENTAL); + + cards.add(new SetCardInfo("Abyssal Specter", 18, Rarity.UNCOMMON, mage.cards.a.AbyssalSpecter.class)); + cards.add(new SetCardInfo("Act of Treason", 37, Rarity.UNCOMMON, mage.cards.a.ActOfTreason.class)); + cards.add(new SetCardInfo("Air Elemental", 1, Rarity.UNCOMMON, mage.cards.a.AirElemental.class)); + cards.add(new SetCardInfo("Ascendant Evincar", 19, Rarity.RARE, mage.cards.a.AscendantEvincar.class)); + cards.add(new SetCardInfo("Banefire", 38, Rarity.RARE, mage.cards.b.Banefire.class)); + cards.add(new SetCardInfo("Blanchwood Armor", 55, Rarity.UNCOMMON, mage.cards.b.BlanchwoodArmor.class)); + cards.add(new SetCardInfo("Blaze", 39, Rarity.UNCOMMON, mage.cards.b.Blaze.class)); + cards.add(new SetCardInfo("Bloodmark Mentor", 40, Rarity.UNCOMMON, mage.cards.b.BloodmarkMentor.class)); + cards.add(new SetCardInfo("Boomerang", 2, Rarity.COMMON, mage.cards.b.Boomerang.class)); + cards.add(new SetCardInfo("Cancel", 3, Rarity.COMMON, mage.cards.c.Cancel.class)); + cards.add(new SetCardInfo("Cinder Pyromancer", 41, Rarity.COMMON, mage.cards.c.CinderPyromancer.class)); + cards.add(new SetCardInfo("Civic Wayfinder", 56, Rarity.COMMON, mage.cards.c.CivicWayfinder.class)); + cards.add(new SetCardInfo("Cloud Sprite", 4, Rarity.COMMON, mage.cards.c.CloudSprite.class)); + cards.add(new SetCardInfo("Coat of Arms", 90, Rarity.RARE, mage.cards.c.CoatOfArms.class)); + cards.add(new SetCardInfo("Consume Spirit", 20, Rarity.UNCOMMON, mage.cards.c.ConsumeSpirit.class)); + cards.add(new SetCardInfo("Counterbore", 5, Rarity.RARE, mage.cards.c.Counterbore.class)); + cards.add(new SetCardInfo("Crowd of Cinders", 21, Rarity.UNCOMMON, mage.cards.c.CrowdOfCinders.class)); + cards.add(new SetCardInfo("Deluge", 6, Rarity.UNCOMMON, mage.cards.d.Deluge.class)); + cards.add(new SetCardInfo("Demon's Horn", 91, Rarity.UNCOMMON, mage.cards.d.DemonsHorn.class)); + cards.add(new SetCardInfo("Denizen of the Deep", 7, Rarity.RARE, mage.cards.d.DenizenOfTheDeep.class)); + cards.add(new SetCardInfo("Dragon's Claw", 92, Rarity.UNCOMMON, mage.cards.d.DragonsClaw.class)); + cards.add(new SetCardInfo("Drove of Elves", 57, Rarity.UNCOMMON, mage.cards.d.DroveOfElves.class)); + cards.add(new SetCardInfo("Drudge Skeletons", 22, Rarity.COMMON, mage.cards.d.DrudgeSkeletons.class)); + cards.add(new SetCardInfo("Dusk Imp", 23, Rarity.COMMON, mage.cards.d.DuskImp.class)); + cards.add(new SetCardInfo("Duskdale Wurm", 58, Rarity.UNCOMMON, mage.cards.d.DuskdaleWurm.class)); + cards.add(new SetCardInfo("Earth Elemental", 42, Rarity.UNCOMMON, mage.cards.e.EarthElemental.class)); + cards.add(new SetCardInfo("Elven Riders", 59, Rarity.UNCOMMON, mage.cards.e.ElvenRiders.class)); + cards.add(new SetCardInfo("Elvish Champion", 60, Rarity.RARE, mage.cards.e.ElvishChampion.class)); + cards.add(new SetCardInfo("Elvish Eulogist", 61, Rarity.COMMON, mage.cards.e.ElvishEulogist.class)); + cards.add(new SetCardInfo("Elvish Promenade", 62, Rarity.UNCOMMON, mage.cards.e.ElvishPromenade.class)); + cards.add(new SetCardInfo("Elvish Visionary", 63, Rarity.COMMON, mage.cards.e.ElvishVisionary.class)); + cards.add(new SetCardInfo("Elvish Warrior", 64, Rarity.COMMON, mage.cards.e.ElvishWarrior.class)); + cards.add(new SetCardInfo("Enrage", 43, Rarity.UNCOMMON, mage.cards.e.Enrage.class)); + cards.add(new SetCardInfo("Essence Drain", 24, Rarity.COMMON, mage.cards.e.EssenceDrain.class)); + cards.add(new SetCardInfo("Essence Scatter", 8, Rarity.COMMON, mage.cards.e.EssenceScatter.class)); + cards.add(new SetCardInfo("Evacuation", 9, Rarity.RARE, mage.cards.e.Evacuation.class)); + cards.add(new SetCardInfo("Eyeblight's Ending", 25, Rarity.COMMON, mage.cards.e.EyeblightsEnding.class)); + cards.add(new SetCardInfo("Forest", 110, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Forest", 111, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Forest", 112, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Forest", 113, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Furnace of Rath", 44, Rarity.RARE, mage.cards.f.FurnaceOfRath.class)); + cards.add(new SetCardInfo("Gaea's Herald", 65, Rarity.RARE, mage.cards.g.GaeasHerald.class)); + cards.add(new SetCardInfo("Giant Growth", 66, Rarity.COMMON, mage.cards.g.GiantGrowth.class)); + cards.add(new SetCardInfo("Giant Spider", 67, Rarity.COMMON, mage.cards.g.GiantSpider.class)); + cards.add(new SetCardInfo("Goblin Piker", 45, Rarity.COMMON, mage.cards.g.GoblinPiker.class)); + cards.add(new SetCardInfo("Goblin Sky Raider", 46, Rarity.COMMON, mage.cards.g.GoblinSkyRaider.class)); + cards.add(new SetCardInfo("Greenweaver Druid", 68, Rarity.UNCOMMON, mage.cards.g.GreenweaverDruid.class)); + cards.add(new SetCardInfo("Hill Giant", 47, Rarity.COMMON, mage.cards.h.HillGiant.class)); + cards.add(new SetCardInfo("Howl of the Night Pack", 69, Rarity.UNCOMMON, mage.cards.h.HowlOfTheNightPack.class)); + cards.add(new SetCardInfo("Immaculate Magistrate", 70, Rarity.RARE, mage.cards.i.ImmaculateMagistrate.class)); + cards.add(new SetCardInfo("Imperious Perfect", 71, Rarity.UNCOMMON, mage.cards.i.ImperiousPerfect.class)); + cards.add(new SetCardInfo("Incinerate", 48, Rarity.COMMON, mage.cards.i.Incinerate.class)); + cards.add(new SetCardInfo("Island", 100, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Island", 101, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Island", 98, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Island", 99, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Jagged-Scar Archers", 72, Rarity.UNCOMMON, mage.cards.j.JaggedScarArchers.class)); + cards.add(new SetCardInfo("Kamahl, Pit Fighter", 49, Rarity.RARE, mage.cards.k.KamahlPitFighter.class)); + cards.add(new SetCardInfo("Kraken's Eye", 93, Rarity.UNCOMMON, mage.cards.k.KrakensEye.class)); + cards.add(new SetCardInfo("Lightning Elemental", 50, Rarity.COMMON, mage.cards.l.LightningElemental.class)); + cards.add(new SetCardInfo("Loxodon Warhammer", 94, Rarity.RARE, mage.cards.l.LoxodonWarhammer.class)); + cards.add(new SetCardInfo("Lys Alana Huntmaster", 73, Rarity.COMMON, mage.cards.l.LysAlanaHuntmaster.class)); + cards.add(new SetCardInfo("Mahamoti Djinn", 10, Rarity.RARE, mage.cards.m.MahamotiDjinn.class)); + cards.add(new SetCardInfo("Megrim", 26, Rarity.UNCOMMON, mage.cards.m.Megrim.class)); + cards.add(new SetCardInfo("Mind Control", 11, Rarity.UNCOMMON, mage.cards.m.MindControl.class)); + cards.add(new SetCardInfo("Mind Rot", 27, Rarity.COMMON, mage.cards.m.MindRot.class)); + cards.add(new SetCardInfo("Mind Shatter", 28, Rarity.RARE, mage.cards.m.MindShatter.class)); + cards.add(new SetCardInfo("Mind Spring", 12, Rarity.RARE, mage.cards.m.MindSpring.class)); + cards.add(new SetCardInfo("Molimo, Maro-Sorcerer", 74, Rarity.RARE, mage.cards.m.MolimoMaroSorcerer.class)); + cards.add(new SetCardInfo("Moonglove Winnower", 29, Rarity.COMMON, mage.cards.m.MoongloveWinnower.class)); + cards.add(new SetCardInfo("Mortivore", 30, Rarity.RARE, mage.cards.m.Mortivore.class)); + cards.add(new SetCardInfo("Mountain", 106, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mountain", 107, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mountain", 108, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mountain", 109, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Natural Spring", 75, Rarity.COMMON, mage.cards.n.NaturalSpring.class)); + cards.add(new SetCardInfo("Naturalize", 76, Rarity.COMMON, mage.cards.n.Naturalize.class)); + cards.add(new SetCardInfo("Nature's Spiral", 77, Rarity.UNCOMMON, mage.cards.n.NaturesSpiral.class)); + cards.add(new SetCardInfo("Negate", 13, Rarity.COMMON, mage.cards.n.Negate.class)); + cards.add(new SetCardInfo("Overrun", 78, Rarity.UNCOMMON, mage.cards.o.Overrun.class)); + cards.add(new SetCardInfo("Phantom Warrior", 14, Rarity.UNCOMMON, mage.cards.p.PhantomWarrior.class)); + cards.add(new SetCardInfo("Prodigal Pyromancer", 51, Rarity.UNCOMMON, mage.cards.p.ProdigalPyromancer.class)); + cards.add(new SetCardInfo("Rage Reflection", 52, Rarity.RARE, mage.cards.r.RageReflection.class)); + cards.add(new SetCardInfo("Rampant Growth", 79, Rarity.COMMON, mage.cards.r.RampantGrowth.class)); + cards.add(new SetCardInfo("Ravenous Rats", 31, Rarity.COMMON, mage.cards.r.RavenousRats.class)); + cards.add(new SetCardInfo("River Boa", 80, Rarity.UNCOMMON, mage.cards.r.RiverBoa.class)); + cards.add(new SetCardInfo("Roughshod Mentor", 81, Rarity.UNCOMMON, mage.cards.r.RoughshodMentor.class)); + cards.add(new SetCardInfo("Runeclaw Bear", 82, Rarity.COMMON, mage.cards.r.RuneclawBear.class)); + cards.add(new SetCardInfo("Sengir Vampire", 32, Rarity.RARE, mage.cards.s.SengirVampire.class)); + cards.add(new SetCardInfo("Severed Legion", 33, Rarity.COMMON, mage.cards.s.SeveredLegion.class)); + cards.add(new SetCardInfo("Shivan Dragon", 53, Rarity.RARE, mage.cards.s.ShivanDragon.class)); + cards.add(new SetCardInfo("Shock", 54, Rarity.COMMON, mage.cards.s.Shock.class)); + cards.add(new SetCardInfo("Snapping Drake", 15, Rarity.COMMON, mage.cards.s.SnappingDrake.class)); + cards.add(new SetCardInfo("Spined Wurm", 83, Rarity.COMMON, mage.cards.s.SpinedWurm.class)); + cards.add(new SetCardInfo("Swamp", 102, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Swamp", 103, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Swamp", 104, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Swamp", 105, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Talara's Battalion", 84, Rarity.RARE, mage.cards.t.TalarasBattalion.class)); + cards.add(new SetCardInfo("Terror", 34, Rarity.COMMON, mage.cards.t.Terror.class)); cards.add(new SetCardInfo("The Rack", 95, Rarity.UNCOMMON, mage.cards.t.TheRack.class)); + cards.add(new SetCardInfo("Thieving Magpie", 16, Rarity.UNCOMMON, mage.cards.t.ThievingMagpie.class)); + cards.add(new SetCardInfo("Trained Armodon", 85, Rarity.COMMON, mage.cards.t.TrainedArmodon.class)); + cards.add(new SetCardInfo("Troll Ascetic", 86, Rarity.RARE, mage.cards.t.TrollAscetic.class)); + cards.add(new SetCardInfo("Underworld Dreams", 35, Rarity.RARE, mage.cards.u.UnderworldDreams.class)); + cards.add(new SetCardInfo("Unholy Strength", 36, Rarity.COMMON, mage.cards.u.UnholyStrength.class)); + cards.add(new SetCardInfo("Unsummon", 17, Rarity.COMMON, mage.cards.u.Unsummon.class)); + cards.add(new SetCardInfo("Verdant Force", 87, Rarity.RARE, mage.cards.v.VerdantForce.class)); + cards.add(new SetCardInfo("Vigor", 88, Rarity.RARE, mage.cards.v.Vigor.class)); + cards.add(new SetCardInfo("Wall of Spears", 96, Rarity.COMMON, mage.cards.w.WallOfSpears.class)); + cards.add(new SetCardInfo("Wall of Wood", 89, Rarity.COMMON, mage.cards.w.WallOfWood.class)); + cards.add(new SetCardInfo("Wurm's Tooth", 97, Rarity.UNCOMMON, mage.cards.w.WurmsTooth.class)); } } diff --git a/Mage.Sets/src/mage/sets/DuelsOfThePlaneswalkersPromos.java b/Mage.Sets/src/mage/sets/DuelsOfThePlaneswalkersPromos.java new file mode 100644 index 00000000000..228d227f166 --- /dev/null +++ b/Mage.Sets/src/mage/sets/DuelsOfThePlaneswalkersPromos.java @@ -0,0 +1,55 @@ + +package mage.sets; + +import mage.cards.ExpansionSet; +import mage.constants.Rarity; +import mage.constants.SetType; + +/** + * + * @author JayDi85 + */ +public final class DuelsOfThePlaneswalkersPromos extends ExpansionSet { + + private static final DuelsOfThePlaneswalkersPromos instance = new DuelsOfThePlaneswalkersPromos(); + + public static DuelsOfThePlaneswalkersPromos getInstance() { + return instance; + } + + private DuelsOfThePlaneswalkersPromos() { + super("Duels of the Planeswalkers Promos", "DPAP", ExpansionSet.buildDate(2010, 6, 4), SetType.PROMOTIONAL); + this.hasBoosters = false; + this.hasBasicLands = false; + + // all promos in one inner set (2009 - 2014) + // cards numbers must be unqiue + // use replacement list for scryfall download + + // 2009 - https://scryfall.com/sets/pdtp + cards.add(new SetCardInfo("Garruk Wildspeaker", 1, Rarity.MYTHIC, mage.cards.g.GarrukWildspeaker.class)); + + // 2010 - https://scryfall.com/sets/pdp10 + cards.add(new SetCardInfo("Liliana Vess", 2, Rarity.MYTHIC, mage.cards.l.LilianaVess.class)); + cards.add(new SetCardInfo("Nissa Revane", 3, Rarity.MYTHIC, mage.cards.n.NissaRevane.class)); + + // 2011 - https://scryfall.com/sets/pdp11 + cards.add(new SetCardInfo("Frost Titan", 4, Rarity.MYTHIC, mage.cards.f.FrostTitan.class)); + cards.add(new SetCardInfo("Grave Titan", 5, Rarity.MYTHIC, mage.cards.g.GraveTitan.class)); + cards.add(new SetCardInfo("Inferno Titan", 6, Rarity.MYTHIC, mage.cards.i.InfernoTitan.class)); + + // 2012 - https://scryfall.com/sets/pdp12 + cards.add(new SetCardInfo("Primordial Hydra", 7, Rarity.MYTHIC, mage.cards.p.PrimordialHydra.class)); + cards.add(new SetCardInfo("Serra Avatar", 8, Rarity.MYTHIC, mage.cards.s.SerraAvatar.class)); + cards.add(new SetCardInfo("Vampire Nocturnus", 9, Rarity.MYTHIC, mage.cards.v.VampireNocturnus.class)); + + // 2013 - https://scryfall.com/sets/pdp13 + cards.add(new SetCardInfo("Bonescythe Sliver", 10, Rarity.RARE, mage.cards.b.BonescytheSliver.class)); + cards.add(new SetCardInfo("Ogre Battledriver", 11, Rarity.RARE, mage.cards.o.OgreBattledriver.class)); + cards.add(new SetCardInfo("Scavenging Ooze", 12, Rarity.RARE, mage.cards.s.ScavengingOoze.class)); + + // 2014 - https://scryfall.com/sets/pdp14 + cards.add(new SetCardInfo("Soul of Ravnica", 13, Rarity.MYTHIC, mage.cards.s.SoulOfRavnica.class)); + cards.add(new SetCardInfo("Soul of Zendikar", 14, Rarity.MYTHIC, mage.cards.s.SoulOfZendikar.class)); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/EighthEdition.java b/Mage.Sets/src/mage/sets/EighthEdition.java index 362fa2e0040..3d235376c5f 100644 --- a/Mage.Sets/src/mage/sets/EighthEdition.java +++ b/Mage.Sets/src/mage/sets/EighthEdition.java @@ -1,8 +1,6 @@ package mage.sets; import mage.cards.ExpansionSet; -import mage.cards.o.OrcishSpy; -import mage.cards.r.RukhEgg; import mage.constants.Rarity; import mage.constants.SetType; @@ -225,7 +223,7 @@ public final class EighthEdition extends ExpansionSet { cards.add(new SetCardInfo("Okk", 206, Rarity.RARE, mage.cards.o.Okk.class)); cards.add(new SetCardInfo("Oracle's Attendants", 32, Rarity.RARE, mage.cards.o.OraclesAttendants.class)); cards.add(new SetCardInfo("Orcish Artillery", 207, Rarity.UNCOMMON, mage.cards.o.OrcishArtillery.class)); - cards.add(new SetCardInfo("Orcish Spy", 208, Rarity.COMMON, OrcishSpy.class)); + cards.add(new SetCardInfo("Orcish Spy", 208, Rarity.COMMON, mage.cards.o.OrcishSpy.class)); cards.add(new SetCardInfo("Pacifism", 33, Rarity.COMMON, mage.cards.p.Pacifism.class)); cards.add(new SetCardInfo("Panic Attack", 209, Rarity.COMMON, mage.cards.p.PanicAttack.class)); cards.add(new SetCardInfo("Patagia Golem", 308, Rarity.UNCOMMON, mage.cards.p.PatagiaGolem.class)); @@ -267,7 +265,7 @@ public final class EighthEdition extends ExpansionSet { cards.add(new SetCardInfo("Rod of Ruin", 312, Rarity.UNCOMMON, mage.cards.r.RodOfRuin.class)); cards.add(new SetCardInfo("Rolling Stones", 38, Rarity.RARE, mage.cards.r.RollingStones.class)); cards.add(new SetCardInfo("Royal Assassin", 159, Rarity.RARE, mage.cards.r.RoyalAssassin.class)); - cards.add(new SetCardInfo("Rukh Egg", 216, Rarity.RARE, RukhEgg.class)); + cards.add(new SetCardInfo("Rukh Egg", 216, Rarity.RARE, mage.cards.r.RukhEgg.class)); cards.add(new SetCardInfo("Rushwood Dryad", 278, Rarity.COMMON, mage.cards.r.RushwoodDryad.class)); cards.add(new SetCardInfo("Sabretooth Tiger", 217, Rarity.COMMON, mage.cards.s.SabretoothTiger.class)); cards.add(new SetCardInfo("Sacred Ground", 39, Rarity.RARE, mage.cards.s.SacredGround.class)); @@ -343,9 +341,9 @@ public final class EighthEdition extends ExpansionSet { cards.add(new SetCardInfo("Unsummon", 112, Rarity.COMMON, mage.cards.u.Unsummon.class)); cards.add(new SetCardInfo("Urborg Volcano", 327, Rarity.UNCOMMON, mage.cards.u.UrborgVolcano.class)); cards.add(new SetCardInfo("Urza's Armor", 318, Rarity.RARE, mage.cards.u.UrzasArmor.class)); - cards.add(new SetCardInfo("Urza's Mine", 328, Rarity.COMMON, mage.cards.u.UrzasMine.class)); - cards.add(new SetCardInfo("Urza's Power Plant", 329, Rarity.COMMON, mage.cards.u.UrzasPowerPlant.class)); - cards.add(new SetCardInfo("Urza's Tower", 330, Rarity.COMMON, mage.cards.u.UrzasTower.class)); + cards.add(new SetCardInfo("Urza's Mine", 328, Rarity.UNCOMMON, mage.cards.u.UrzasMine.class)); + cards.add(new SetCardInfo("Urza's Power Plant", 329, Rarity.UNCOMMON, mage.cards.u.UrzasPowerPlant.class)); + cards.add(new SetCardInfo("Urza's Tower", 330, Rarity.UNCOMMON, mage.cards.u.UrzasTower.class)); cards.add(new SetCardInfo("Vampiric Spirit", 170, Rarity.RARE, mage.cards.v.VampiricSpirit.class)); cards.add(new SetCardInfo("Venerable Monk", 55, Rarity.COMMON, mage.cards.v.VenerableMonk.class)); cards.add(new SetCardInfo("Verduran Enchantress", 285, Rarity.RARE, mage.cards.v.VerduranEnchantress.class)); @@ -372,6 +370,7 @@ public final class EighthEdition extends ExpansionSet { cards.add(new SetCardInfo("Zombify", 174, Rarity.UNCOMMON, mage.cards.z.Zombify.class)); cards.add(new SetCardInfo("Zur's Weirding", 116, Rarity.RARE, mage.cards.z.ZursWeirding.class)); // 8ed Edition Box Set (we need to create own set) + // http://www.magiclibrarities.net/540-rarities-eighth-edition-box-set-cards-english-cards-index.html // cards.add(new SetCardInfo("Eager Cadet", 1, Rarity.COMMON, mage.cards.e.EagerCadet.class)); // cards.add(new SetCardInfo("Vengeance", 2, Rarity.UNCOMMON, mage.cards.v.Vengeance.class)); // cards.add(new SetCardInfo("Sea Eagle", 4, Rarity.COMMON, mage.cards.s.SeaEagle.class)); diff --git a/Mage.Sets/src/mage/sets/EighthEditionBox.java b/Mage.Sets/src/mage/sets/EighthEditionBox.java index 05b7be001cf..84cf11a524d 100644 --- a/Mage.Sets/src/mage/sets/EighthEditionBox.java +++ b/Mage.Sets/src/mage/sets/EighthEditionBox.java @@ -15,6 +15,9 @@ public final class EighthEditionBox extends ExpansionSet { private EighthEditionBox() { super("EighthEditionBox", "8EB", ExpansionSet.buildDate(2003, 7, 28), SetType.CORE); this.hasBoosters = false; + this.hasBasicLands = false; + + // // http://www.magiclibrarities.net/540-rarities-eighth-edition-box-set-cards-english-cards-index.html cards.add(new SetCardInfo("Eager Cadet", 1, Rarity.COMMON, mage.cards.e.EagerCadet.class)); cards.add(new SetCardInfo("Vengeance", 2, Rarity.UNCOMMON, mage.cards.v.Vengeance.class)); cards.add(new SetCardInfo("Giant Octopus", 3, Rarity.COMMON, mage.cards.g.GiantOctopus.class)); diff --git a/Mage.Sets/src/mage/sets/EternalMasters.java b/Mage.Sets/src/mage/sets/EternalMasters.java index 87051cc69d8..a6c0a96d5c1 100644 --- a/Mage.Sets/src/mage/sets/EternalMasters.java +++ b/Mage.Sets/src/mage/sets/EternalMasters.java @@ -2,12 +2,10 @@ package mage.sets; import mage.cards.ExpansionSet; -import mage.cards.h.HymnToTourach; import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author fireshoes */ public final class EternalMasters extends ExpansionSet { @@ -28,6 +26,7 @@ public final class EternalMasters extends ExpansionSet { this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 8; + cards.add(new SetCardInfo("Abundant Growth", 156, Rarity.COMMON, mage.cards.a.AbundantGrowth.class)); cards.add(new SetCardInfo("Ancestral Mask", 157, Rarity.UNCOMMON, mage.cards.a.AncestralMask.class)); cards.add(new SetCardInfo("Animate Dead", 78, Rarity.UNCOMMON, mage.cards.a.AnimateDead.class)); @@ -128,7 +127,7 @@ public final class EternalMasters extends ExpansionSet { cards.add(new SetCardInfo("Honden of Seeing Winds", 54, Rarity.UNCOMMON, mage.cards.h.HondenOfSeeingWinds.class)); cards.add(new SetCardInfo("Humble", 14, Rarity.COMMON, mage.cards.h.Humble.class)); cards.add(new SetCardInfo("Hydroblast", 55, Rarity.UNCOMMON, mage.cards.h.Hydroblast.class)); - cards.add(new SetCardInfo("Hymn to Tourach", 92, Rarity.UNCOMMON, HymnToTourach.class)); + cards.add(new SetCardInfo("Hymn to Tourach", 92, Rarity.UNCOMMON, mage.cards.h.HymnToTourach.class)); cards.add(new SetCardInfo("Ichorid", 93, Rarity.RARE, mage.cards.i.Ichorid.class)); cards.add(new SetCardInfo("Imperious Perfect", 173, Rarity.RARE, mage.cards.i.ImperiousPerfect.class)); cards.add(new SetCardInfo("Inkwell Leviathan", 56, Rarity.RARE, mage.cards.i.InkwellLeviathan.class)); @@ -278,5 +277,4 @@ public final class EternalMasters extends ExpansionSet { cards.add(new SetCardInfo("Young Pyromancer", 155, Rarity.UNCOMMON, mage.cards.y.YoungPyromancer.class)); cards.add(new SetCardInfo("Zealous Persecution", 213, Rarity.UNCOMMON, mage.cards.z.ZealousPersecution.class)); } - -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/ExplorersOfIxalan.java b/Mage.Sets/src/mage/sets/ExplorersOfIxalan.java index f6f81557990..220ca05dd2f 100644 --- a/Mage.Sets/src/mage/sets/ExplorersOfIxalan.java +++ b/Mage.Sets/src/mage/sets/ExplorersOfIxalan.java @@ -6,7 +6,6 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author JayDi85 */ public final class ExplorersOfIxalan extends ExpansionSet { @@ -20,6 +19,7 @@ public final class ExplorersOfIxalan extends ExpansionSet { private ExplorersOfIxalan() { super("Explorers of Ixalan", "E02", ExpansionSet.buildDate(2017, 11, 24), SetType.SUPPLEMENTAL); this.blockName = "Explorers of Ixalan"; + this.hasBasicLands = false; cards.add(new SetCardInfo("Adaptive Automaton", 42, Rarity.RARE, mage.cards.a.AdaptiveAutomaton.class)); cards.add(new SetCardInfo("Aether Gale", 7, Rarity.RARE, mage.cards.a.AetherGale.class)); diff --git a/Mage.Sets/src/mage/sets/FallenEmpires.java b/Mage.Sets/src/mage/sets/FallenEmpires.java index 7f31d69080f..d8dcd103ebf 100644 --- a/Mage.Sets/src/mage/sets/FallenEmpires.java +++ b/Mage.Sets/src/mage/sets/FallenEmpires.java @@ -2,42 +2,10 @@ package mage.sets; import mage.cards.ExpansionSet; -import mage.cards.a.ArmorThrull; -import mage.cards.b.BasalThrull; -import mage.cards.b.BrassclawOrcs; -import mage.cards.c.CombatMedic; -import mage.cards.d.DwarvenSoldier; -import mage.cards.e.ElvenFortress; -import mage.cards.e.ElvishHunter; -import mage.cards.e.ElvishScout; -import mage.cards.f.FarrelsZealot; -import mage.cards.g.GoblinChirurgeon; -import mage.cards.g.GoblinGrenade; -import mage.cards.g.GoblinWarDrums; -import mage.cards.h.HighTide; -import mage.cards.h.Homarid; -import mage.cards.h.HomaridWarrior; -import mage.cards.h.HymnToTourach; -import mage.cards.i.IcatianInfantry; -import mage.cards.i.IcatianJavelineers; -import mage.cards.i.IcatianMoneychanger; -import mage.cards.i.IcatianScout; -import mage.cards.i.InitiatesOfTheEbonHand; -import mage.cards.m.MindstabThrull; -import mage.cards.n.Necrite; -import mage.cards.n.NightSoil; -import mage.cards.o.OrcishSpy; -import mage.cards.o.OrcishVeteran; -import mage.cards.o.OrderOfLeitbur; -import mage.cards.o.OrderOfTheEbonHand; -import mage.cards.t.ThornThallid; -import mage.cards.v.VodalianMage; -import mage.cards.v.VodalianSoldiers; import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author North */ public final class FallenEmpires extends ExpansionSet { @@ -57,26 +25,27 @@ public final class FallenEmpires extends ExpansionSet { this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; + cards.add(new SetCardInfo("Aeolipile", 81, Rarity.RARE, mage.cards.a.Aeolipile.class)); - cards.add(new SetCardInfo("Armor Thrull", "33a", Rarity.COMMON, ArmorThrull.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Armor Thrull", "33b", Rarity.COMMON, ArmorThrull.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Armor Thrull", "33c", Rarity.COMMON, ArmorThrull.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Armor Thrull", "33d", Rarity.COMMON, ArmorThrull.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Armor Thrull", "33a", Rarity.COMMON, mage.cards.a.ArmorThrull.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Armor Thrull", "33b", Rarity.COMMON, mage.cards.a.ArmorThrull.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Armor Thrull", "33c", Rarity.COMMON, mage.cards.a.ArmorThrull.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Armor Thrull", "33d", Rarity.COMMON, mage.cards.a.ArmorThrull.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Balm of Restoration", 82, Rarity.RARE, mage.cards.b.BalmOfRestoration.class)); - cards.add(new SetCardInfo("Basal Thrull", "34a", Rarity.COMMON, BasalThrull.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Basal Thrull", "34b", Rarity.COMMON, BasalThrull.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Basal Thrull", "34c", Rarity.COMMON, BasalThrull.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Basal Thrull", "34d", Rarity.COMMON, BasalThrull.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Basal Thrull", "34a", Rarity.COMMON, mage.cards.b.BasalThrull.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Basal Thrull", "34b", Rarity.COMMON, mage.cards.b.BasalThrull.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Basal Thrull", "34c", Rarity.COMMON, mage.cards.b.BasalThrull.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Basal Thrull", "34d", Rarity.COMMON, mage.cards.b.BasalThrull.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Bottomless Vault", 92, Rarity.RARE, mage.cards.b.BottomlessVault.class)); - cards.add(new SetCardInfo("Brassclaw Orcs", "49a", Rarity.COMMON, BrassclawOrcs.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Brassclaw Orcs", "49b", Rarity.COMMON, BrassclawOrcs.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Brassclaw Orcs", "49c", Rarity.COMMON, BrassclawOrcs.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Brassclaw Orcs", "49d", Rarity.COMMON, BrassclawOrcs.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Brassclaw Orcs", "49a", Rarity.COMMON, mage.cards.b.BrassclawOrcs.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Brassclaw Orcs", "49b", Rarity.COMMON, mage.cards.b.BrassclawOrcs.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Brassclaw Orcs", "49c", Rarity.COMMON, mage.cards.b.BrassclawOrcs.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Brassclaw Orcs", "49d", Rarity.COMMON, mage.cards.b.BrassclawOrcs.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Breeding Pit", 35, Rarity.UNCOMMON, mage.cards.b.BreedingPit.class)); - cards.add(new SetCardInfo("Combat Medic", "1a", Rarity.COMMON, CombatMedic.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Combat Medic", "1b", Rarity.COMMON, CombatMedic.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Combat Medic", "1c", Rarity.COMMON, CombatMedic.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Combat Medic", "1d", Rarity.COMMON, CombatMedic.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Combat Medic", "1a", Rarity.COMMON, mage.cards.c.CombatMedic.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Combat Medic", "1b", Rarity.COMMON, mage.cards.c.CombatMedic.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Combat Medic", "1c", Rarity.COMMON, mage.cards.c.CombatMedic.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Combat Medic", "1d", Rarity.COMMON, mage.cards.c.CombatMedic.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Conch Horn", 83, Rarity.RARE, mage.cards.c.ConchHorn.class)); cards.add(new SetCardInfo("Deep Spawn", 17, Rarity.UNCOMMON, mage.cards.d.DeepSpawn.class)); cards.add(new SetCardInfo("Delif's Cone", 84, Rarity.COMMON, mage.cards.d.DelifsCone.class)); @@ -88,114 +57,114 @@ public final class FallenEmpires extends ExpansionSet { cards.add(new SetCardInfo("Dwarven Hold", 93, Rarity.RARE, mage.cards.d.DwarvenHold.class)); cards.add(new SetCardInfo("Dwarven Lieutenant", 52, Rarity.UNCOMMON, mage.cards.d.DwarvenLieutenant.class)); cards.add(new SetCardInfo("Dwarven Ruins", 94, Rarity.UNCOMMON, mage.cards.d.DwarvenRuins.class)); - cards.add(new SetCardInfo("Dwarven Soldier", "53a", Rarity.COMMON, DwarvenSoldier.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Dwarven Soldier", "53b", Rarity.COMMON, DwarvenSoldier.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Dwarven Soldier", "53c", Rarity.COMMON, DwarvenSoldier.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Dwarven Soldier", "53a", Rarity.COMMON, mage.cards.d.DwarvenSoldier.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Dwarven Soldier", "53b", Rarity.COMMON, mage.cards.d.DwarvenSoldier.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Dwarven Soldier", "53c", Rarity.COMMON, mage.cards.d.DwarvenSoldier.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Ebon Praetor", 37, Rarity.RARE, mage.cards.e.EbonPraetor.class)); cards.add(new SetCardInfo("Ebon Stronghold", 95, Rarity.UNCOMMON, mage.cards.e.EbonStronghold.class)); - cards.add(new SetCardInfo("Elven Fortress", "65a", Rarity.COMMON, ElvenFortress.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Elven Fortress", "65b", Rarity.COMMON, ElvenFortress.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Elven Fortress", "65c", Rarity.COMMON, ElvenFortress.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Elven Fortress", "65d", Rarity.COMMON, ElvenFortress.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Elven Fortress", "65a", Rarity.COMMON, mage.cards.e.ElvenFortress.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Elven Fortress", "65b", Rarity.COMMON, mage.cards.e.ElvenFortress.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Elven Fortress", "65c", Rarity.COMMON, mage.cards.e.ElvenFortress.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Elven Fortress", "65d", Rarity.COMMON, mage.cards.e.ElvenFortress.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Elven Lyre", 87, Rarity.RARE, mage.cards.e.ElvenLyre.class)); cards.add(new SetCardInfo("Elvish Farmer", 66, Rarity.RARE, mage.cards.e.ElvishFarmer.class)); - cards.add(new SetCardInfo("Elvish Hunter", "67a", Rarity.COMMON, ElvishHunter.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Elvish Hunter", "67b", Rarity.COMMON, ElvishHunter.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Elvish Hunter", "67c", Rarity.COMMON, ElvishHunter.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Elvish Scout", "68a", Rarity.COMMON, ElvishScout.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Elvish Scout", "68b", Rarity.COMMON, ElvishScout.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Elvish Scout", "68c", Rarity.COMMON, ElvishScout.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Elvish Hunter", "67a", Rarity.COMMON, mage.cards.e.ElvishHunter.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Elvish Hunter", "67b", Rarity.COMMON, mage.cards.e.ElvishHunter.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Elvish Hunter", "67c", Rarity.COMMON, mage.cards.e.ElvishHunter.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Elvish Scout", "68a", Rarity.COMMON, mage.cards.e.ElvishScout.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Elvish Scout", "68b", Rarity.COMMON, mage.cards.e.ElvishScout.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Elvish Scout", "68c", Rarity.COMMON, mage.cards.e.ElvishScout.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Farrel's Mantle", 2, Rarity.UNCOMMON, mage.cards.f.FarrelsMantle.class)); - cards.add(new SetCardInfo("Farrel's Zealot", "3a", Rarity.COMMON, FarrelsZealot.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Farrel's Zealot", "3b", Rarity.COMMON, FarrelsZealot.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Farrel's Zealot", "3c", Rarity.COMMON, FarrelsZealot.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Farrel's Zealot", "3a", Rarity.COMMON, mage.cards.f.FarrelsZealot.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Farrel's Zealot", "3b", Rarity.COMMON, mage.cards.f.FarrelsZealot.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Farrel's Zealot", "3c", Rarity.COMMON, mage.cards.f.FarrelsZealot.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Farrelite Priest", 4, Rarity.UNCOMMON, mage.cards.f.FarrelitePriest.class)); cards.add(new SetCardInfo("Feral Thallid", 69, Rarity.UNCOMMON, mage.cards.f.FeralThallid.class)); cards.add(new SetCardInfo("Fungal Bloom", 70, Rarity.RARE, mage.cards.f.FungalBloom.class)); - cards.add(new SetCardInfo("Goblin Chirurgeon", "54a", Rarity.COMMON, GoblinChirurgeon.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Goblin Chirurgeon", "54b", Rarity.COMMON, GoblinChirurgeon.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Goblin Chirurgeon", "54c", Rarity.COMMON, GoblinChirurgeon.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Goblin Chirurgeon", "54a", Rarity.COMMON, mage.cards.g.GoblinChirurgeon.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Goblin Chirurgeon", "54b", Rarity.COMMON, mage.cards.g.GoblinChirurgeon.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Goblin Chirurgeon", "54c", Rarity.COMMON, mage.cards.g.GoblinChirurgeon.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Goblin Flotilla", 55, Rarity.RARE, mage.cards.g.GoblinFlotilla.class)); - cards.add(new SetCardInfo("Goblin Grenade", "56a", Rarity.COMMON, GoblinGrenade.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Goblin Grenade", "56b", Rarity.COMMON, GoblinGrenade.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Goblin Grenade", "56c", Rarity.COMMON, GoblinGrenade.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Goblin Grenade", "56a", Rarity.COMMON, mage.cards.g.GoblinGrenade.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Goblin Grenade", "56b", Rarity.COMMON, mage.cards.g.GoblinGrenade.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Goblin Grenade", "56c", Rarity.COMMON, mage.cards.g.GoblinGrenade.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Goblin Kites", 57, Rarity.UNCOMMON, mage.cards.g.GoblinKites.class)); - cards.add(new SetCardInfo("Goblin War Drums", "58a", Rarity.COMMON, GoblinWarDrums.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Goblin War Drums", "58b", Rarity.COMMON, GoblinWarDrums.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Goblin War Drums", "58c", Rarity.COMMON, GoblinWarDrums.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Goblin War Drums", "58d", Rarity.COMMON, GoblinWarDrums.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Goblin War Drums", "58a", Rarity.COMMON, mage.cards.g.GoblinWarDrums.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Goblin War Drums", "58b", Rarity.COMMON, mage.cards.g.GoblinWarDrums.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Goblin War Drums", "58c", Rarity.COMMON, mage.cards.g.GoblinWarDrums.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Goblin War Drums", "58d", Rarity.COMMON, mage.cards.g.GoblinWarDrums.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Goblin Warrens", 59, Rarity.RARE, mage.cards.g.GoblinWarrens.class)); cards.add(new SetCardInfo("Hand of Justice", 5, Rarity.RARE, mage.cards.h.HandOfJustice.class)); cards.add(new SetCardInfo("Havenwood Battleground", 96, Rarity.UNCOMMON, mage.cards.h.HavenwoodBattleground.class)); cards.add(new SetCardInfo("Heroism", 6, Rarity.UNCOMMON, mage.cards.h.Heroism.class)); - cards.add(new SetCardInfo("High Tide", "18a", Rarity.COMMON, HighTide.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("High Tide", "18b", Rarity.COMMON, HighTide.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("High Tide", "18c", Rarity.COMMON, HighTide.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("High Tide", "18a", Rarity.COMMON, mage.cards.h.HighTide.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("High Tide", "18b", Rarity.COMMON, mage.cards.h.HighTide.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("High Tide", "18c", Rarity.COMMON, mage.cards.h.HighTide.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Hollow Trees", 97, Rarity.RARE, mage.cards.h.HollowTrees.class)); cards.add(new SetCardInfo("Homarid Shaman", 20, Rarity.RARE, mage.cards.h.HomaridShaman.class)); cards.add(new SetCardInfo("Homarid Spawning Bed", 21, Rarity.UNCOMMON, mage.cards.h.HomaridSpawningBed.class)); - cards.add(new SetCardInfo("Homarid Warrior", "22a", Rarity.COMMON, HomaridWarrior.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Homarid Warrior", "22b", Rarity.COMMON, HomaridWarrior.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Homarid Warrior", "22c", Rarity.COMMON, HomaridWarrior.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Homarid", "19a", Rarity.COMMON, Homarid.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Homarid", "19b", Rarity.COMMON, Homarid.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Homarid", "19c", Rarity.COMMON, Homarid.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Homarid", "19d", Rarity.COMMON, Homarid.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Hymn to Tourach", "38a", Rarity.COMMON, HymnToTourach.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Hymn to Tourach", "38b", Rarity.COMMON, HymnToTourach.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Hymn to Tourach", "38c", Rarity.COMMON, HymnToTourach.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Hymn to Tourach", "38d", Rarity.COMMON, HymnToTourach.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Icatian Infantry", "7a", Rarity.COMMON, IcatianInfantry.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Icatian Infantry", "7b", Rarity.COMMON, IcatianInfantry.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Icatian Infantry", "7c", Rarity.COMMON, IcatianInfantry.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Icatian Infantry", "7d", Rarity.COMMON, IcatianInfantry.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Icatian Javelineers", "8a", Rarity.COMMON, IcatianJavelineers.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Icatian Javelineers", "8b", Rarity.COMMON, IcatianJavelineers.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Icatian Javelineers", "8c", Rarity.COMMON, IcatianJavelineers.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Homarid Warrior", "22a", Rarity.COMMON, mage.cards.h.HomaridWarrior.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Homarid Warrior", "22b", Rarity.COMMON, mage.cards.h.HomaridWarrior.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Homarid Warrior", "22c", Rarity.COMMON, mage.cards.h.HomaridWarrior.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Homarid", "19a", Rarity.COMMON, mage.cards.h.Homarid.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Homarid", "19b", Rarity.COMMON, mage.cards.h.Homarid.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Homarid", "19c", Rarity.COMMON, mage.cards.h.Homarid.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Homarid", "19d", Rarity.COMMON, mage.cards.h.Homarid.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Hymn to Tourach", "38a", Rarity.COMMON, mage.cards.h.HymnToTourach.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Hymn to Tourach", "38b", Rarity.COMMON, mage.cards.h.HymnToTourach.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Hymn to Tourach", "38c", Rarity.COMMON, mage.cards.h.HymnToTourach.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Hymn to Tourach", "38d", Rarity.COMMON, mage.cards.h.HymnToTourach.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Icatian Infantry", "7a", Rarity.COMMON, mage.cards.i.IcatianInfantry.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Icatian Infantry", "7b", Rarity.COMMON, mage.cards.i.IcatianInfantry.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Icatian Infantry", "7c", Rarity.COMMON, mage.cards.i.IcatianInfantry.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Icatian Infantry", "7d", Rarity.COMMON, mage.cards.i.IcatianInfantry.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Icatian Javelineers", "8a", Rarity.COMMON, mage.cards.i.IcatianJavelineers.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Icatian Javelineers", "8b", Rarity.COMMON, mage.cards.i.IcatianJavelineers.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Icatian Javelineers", "8c", Rarity.COMMON, mage.cards.i.IcatianJavelineers.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Icatian Lieutenant", 9, Rarity.RARE, mage.cards.i.IcatianLieutenant.class)); - cards.add(new SetCardInfo("Icatian Moneychanger", "10a", Rarity.COMMON, IcatianMoneychanger.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Icatian Moneychanger", "10b", Rarity.COMMON, IcatianMoneychanger.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Icatian Moneychanger", "10c", Rarity.COMMON, IcatianMoneychanger.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Icatian Moneychanger", "10a", Rarity.COMMON, mage.cards.i.IcatianMoneychanger.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Icatian Moneychanger", "10b", Rarity.COMMON, mage.cards.i.IcatianMoneychanger.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Icatian Moneychanger", "10c", Rarity.COMMON, mage.cards.i.IcatianMoneychanger.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Icatian Phalanx", 11, Rarity.UNCOMMON, mage.cards.i.IcatianPhalanx.class)); cards.add(new SetCardInfo("Icatian Priest", 12, Rarity.UNCOMMON, mage.cards.i.IcatianPriest.class)); - cards.add(new SetCardInfo("Icatian Scout", "13a", Rarity.COMMON, IcatianScout.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Icatian Scout", "13b", Rarity.COMMON, IcatianScout.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Icatian Scout", "13c", Rarity.COMMON, IcatianScout.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Icatian Scout", "13d", Rarity.COMMON, IcatianScout.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Icatian Scout", "13a", Rarity.COMMON, mage.cards.i.IcatianScout.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Icatian Scout", "13b", Rarity.COMMON, mage.cards.i.IcatianScout.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Icatian Scout", "13c", Rarity.COMMON, mage.cards.i.IcatianScout.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Icatian Scout", "13d", Rarity.COMMON, mage.cards.i.IcatianScout.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Icatian Skirmishers", 14, Rarity.RARE, mage.cards.i.IcatianSkirmishers.class)); cards.add(new SetCardInfo("Icatian Store", 98, Rarity.RARE, mage.cards.i.IcatianStore.class)); cards.add(new SetCardInfo("Icatian Town", 15, Rarity.RARE, mage.cards.i.IcatianTown.class)); cards.add(new SetCardInfo("Implements of Sacrifice", 88, Rarity.RARE, mage.cards.i.ImplementsOfSacrifice.class)); - cards.add(new SetCardInfo("Initiates of the Ebon Hand", "39a", Rarity.COMMON, InitiatesOfTheEbonHand.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Initiates of the Ebon Hand", "39b", Rarity.COMMON, InitiatesOfTheEbonHand.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Initiates of the Ebon Hand", "39c", Rarity.COMMON, InitiatesOfTheEbonHand.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Initiates of the Ebon Hand", "39a", Rarity.COMMON, mage.cards.i.InitiatesOfTheEbonHand.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Initiates of the Ebon Hand", "39b", Rarity.COMMON, mage.cards.i.InitiatesOfTheEbonHand.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Initiates of the Ebon Hand", "39c", Rarity.COMMON, mage.cards.i.InitiatesOfTheEbonHand.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Merseine", "23a", Rarity.COMMON, mage.cards.m.Merseine.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Merseine", "23b", Rarity.COMMON, mage.cards.m.Merseine.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Merseine", "23c", Rarity.COMMON, mage.cards.m.Merseine.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Merseine", "23d", Rarity.COMMON, mage.cards.m.Merseine.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mindstab Thrull", "40a", Rarity.COMMON, MindstabThrull.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mindstab Thrull", "40b", Rarity.COMMON, MindstabThrull.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mindstab Thrull", "40c", Rarity.COMMON, MindstabThrull.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Necrite", "41a", Rarity.COMMON, Necrite.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Necrite", "41b", Rarity.COMMON, Necrite.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Necrite", "41c", Rarity.COMMON, Necrite.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Night Soil", "71a", Rarity.COMMON, NightSoil.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Night Soil", "71b", Rarity.COMMON, NightSoil.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Night Soil", "71c", Rarity.COMMON, NightSoil.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mindstab Thrull", "40a", Rarity.COMMON, mage.cards.m.MindstabThrull.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mindstab Thrull", "40b", Rarity.COMMON, mage.cards.m.MindstabThrull.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mindstab Thrull", "40c", Rarity.COMMON, mage.cards.m.MindstabThrull.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Necrite", "41a", Rarity.COMMON, mage.cards.n.Necrite.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Necrite", "41b", Rarity.COMMON, mage.cards.n.Necrite.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Necrite", "41c", Rarity.COMMON, mage.cards.n.Necrite.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Night Soil", "71a", Rarity.COMMON, mage.cards.n.NightSoil.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Night Soil", "71b", Rarity.COMMON, mage.cards.n.NightSoil.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Night Soil", "71c", Rarity.COMMON, mage.cards.n.NightSoil.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Orcish Captain", 60, Rarity.UNCOMMON, mage.cards.o.OrcishCaptain.class)); - cards.add(new SetCardInfo("Orcish Spy", "61a", Rarity.COMMON, OrcishSpy.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Orcish Spy", "61b", Rarity.COMMON, OrcishSpy.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Orcish Spy", "61c", Rarity.COMMON, OrcishSpy.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Orcish Veteran", "62a", Rarity.COMMON, OrcishVeteran.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Orcish Veteran", "62b", Rarity.COMMON, OrcishVeteran.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Orcish Veteran", "62c", Rarity.COMMON, OrcishVeteran.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Orcish Veteran", "62d", Rarity.COMMON, OrcishVeteran.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Order of Leitbur", "16a", Rarity.COMMON, OrderOfLeitbur.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Order of Leitbur", "16b", Rarity.COMMON, OrderOfLeitbur.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Order of Leitbur", "16c", Rarity.COMMON, OrderOfLeitbur.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Order of the Ebon Hand", "42a", Rarity.COMMON, OrderOfTheEbonHand.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Order of the Ebon Hand", "42b", Rarity.COMMON, OrderOfTheEbonHand.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Order of the Ebon Hand", "42c", Rarity.COMMON, OrderOfTheEbonHand.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Orcish Spy", "61a", Rarity.COMMON, mage.cards.o.OrcishSpy.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Orcish Spy", "61b", Rarity.COMMON, mage.cards.o.OrcishSpy.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Orcish Spy", "61c", Rarity.COMMON, mage.cards.o.OrcishSpy.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Orcish Veteran", "62a", Rarity.COMMON, mage.cards.o.OrcishVeteran.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Orcish Veteran", "62b", Rarity.COMMON, mage.cards.o.OrcishVeteran.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Orcish Veteran", "62c", Rarity.COMMON, mage.cards.o.OrcishVeteran.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Orcish Veteran", "62d", Rarity.COMMON, mage.cards.o.OrcishVeteran.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Order of Leitbur", "16a", Rarity.COMMON, mage.cards.o.OrderOfLeitbur.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Order of Leitbur", "16b", Rarity.COMMON, mage.cards.o.OrderOfLeitbur.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Order of Leitbur", "16c", Rarity.COMMON, mage.cards.o.OrderOfLeitbur.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Order of the Ebon Hand", "42a", Rarity.COMMON, mage.cards.o.OrderOfTheEbonHand.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Order of the Ebon Hand", "42b", Rarity.COMMON, mage.cards.o.OrderOfTheEbonHand.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Order of the Ebon Hand", "42c", Rarity.COMMON, mage.cards.o.OrderOfTheEbonHand.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Orgg", 63, Rarity.RARE, mage.cards.o.Orgg.class)); cards.add(new SetCardInfo("Raiding Party", 64, Rarity.UNCOMMON, mage.cards.r.RaidingParty.class)); cards.add(new SetCardInfo("Rainbow Vale", 99, Rarity.RARE, mage.cards.r.RainbowVale.class)); @@ -221,10 +190,10 @@ public final class FallenEmpires extends ExpansionSet { cards.add(new SetCardInfo("Thelon's Curse", 77, Rarity.RARE, mage.cards.t.ThelonsCurse.class)); cards.add(new SetCardInfo("Thelonite Druid", 78, Rarity.UNCOMMON, mage.cards.t.TheloniteDruid.class)); cards.add(new SetCardInfo("Thelonite Monk", 79, Rarity.RARE, mage.cards.t.TheloniteMonk.class)); - cards.add(new SetCardInfo("Thorn Thallid", "80a", Rarity.COMMON, ThornThallid.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Thorn Thallid", "80b", Rarity.COMMON, ThornThallid.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Thorn Thallid", "80c", Rarity.COMMON, ThornThallid.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Thorn Thallid", "80d", Rarity.COMMON, ThornThallid.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Thorn Thallid", "80a", Rarity.COMMON, mage.cards.t.ThornThallid.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Thorn Thallid", "80b", Rarity.COMMON, mage.cards.t.ThornThallid.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Thorn Thallid", "80c", Rarity.COMMON, mage.cards.t.ThornThallid.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Thorn Thallid", "80d", Rarity.COMMON, mage.cards.t.ThornThallid.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Thrull Champion", 44, Rarity.RARE, mage.cards.t.ThrullChampion.class)); cards.add(new SetCardInfo("Thrull Retainer", 45, Rarity.UNCOMMON, mage.cards.t.ThrullRetainer.class)); cards.add(new SetCardInfo("Thrull Wizard", 46, Rarity.UNCOMMON, mage.cards.t.ThrullWizard.class)); @@ -235,13 +204,13 @@ public final class FallenEmpires extends ExpansionSet { cards.add(new SetCardInfo("Tourach's Chant", 47, Rarity.UNCOMMON, mage.cards.t.TourachsChant.class)); cards.add(new SetCardInfo("Tourach's Gate", 48, Rarity.RARE, mage.cards.t.TourachsGate.class)); cards.add(new SetCardInfo("Vodalian Knights", 29, Rarity.RARE, mage.cards.v.VodalianKnights.class)); - cards.add(new SetCardInfo("Vodalian Mage", "30a", Rarity.COMMON, VodalianMage.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Vodalian Mage", "30b", Rarity.COMMON, VodalianMage.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Vodalian Mage", "30c", Rarity.COMMON, VodalianMage.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Vodalian Soldiers", "31a", Rarity.COMMON, VodalianSoldiers.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Vodalian Soldiers", "31b", Rarity.COMMON, VodalianSoldiers.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Vodalian Soldiers", "31c", Rarity.COMMON, VodalianSoldiers.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Vodalian Soldiers", "31d", Rarity.COMMON, VodalianSoldiers.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Vodalian Mage", "30a", Rarity.COMMON, mage.cards.v.VodalianMage.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Vodalian Mage", "30b", Rarity.COMMON, mage.cards.v.VodalianMage.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Vodalian Mage", "30c", Rarity.COMMON, mage.cards.v.VodalianMage.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Vodalian Soldiers", "31a", Rarity.COMMON, mage.cards.v.VodalianSoldiers.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Vodalian Soldiers", "31b", Rarity.COMMON, mage.cards.v.VodalianSoldiers.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Vodalian Soldiers", "31c", Rarity.COMMON, mage.cards.v.VodalianSoldiers.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Vodalian Soldiers", "31d", Rarity.COMMON, mage.cards.v.VodalianSoldiers.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Vodalian War Machine", 32, Rarity.RARE, mage.cards.v.VodalianWarMachine.class)); cards.add(new SetCardInfo("Zelyon Sword", 91, Rarity.RARE, mage.cards.z.ZelyonSword.class)); } diff --git a/Mage.Sets/src/mage/sets/FateReforged.java b/Mage.Sets/src/mage/sets/FateReforged.java index 0cc077d3ed3..f29b7d81b36 100644 --- a/Mage.Sets/src/mage/sets/FateReforged.java +++ b/Mage.Sets/src/mage/sets/FateReforged.java @@ -13,7 +13,6 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author fireshoes */ public final class FateReforged extends ExpansionSet { @@ -31,7 +30,7 @@ public final class FateReforged extends ExpansionSet { super("Fate Reforged", "FRF", ExpansionSet.buildDate(2015, 1, 23), SetType.EXPANSION); this.blockName = "Khans of Tarkir"; this.parentSet = KhansOfTarkir.getInstance(); - this.hasBasicLands = false; + this.hasBasicLands = true; this.hasBoosters = true; this.numBoosterSpecial = 1; this.numBoosterLands = 0; @@ -40,6 +39,7 @@ public final class FateReforged extends ExpansionSet { this.numBoosterRare = 1; this.numBoosterDoubleFaced = -1; this.ratioBoosterMythic = 8; + cards.add(new SetCardInfo("Abzan Advantage", 2, Rarity.COMMON, mage.cards.a.AbzanAdvantage.class)); cards.add(new SetCardInfo("Abzan Beastmaster", 119, Rarity.UNCOMMON, mage.cards.a.AbzanBeastmaster.class)); cards.add(new SetCardInfo("Abzan Kin-Guard", 120, Rarity.UNCOMMON, mage.cards.a.AbzanKinGuard.class)); diff --git a/Mage.Sets/src/mage/sets/FifthEdition.java b/Mage.Sets/src/mage/sets/FifthEdition.java index ed2e2c43d9b..fcef5f51232 100644 --- a/Mage.Sets/src/mage/sets/FifthEdition.java +++ b/Mage.Sets/src/mage/sets/FifthEdition.java @@ -1,18 +1,6 @@ package mage.sets; import mage.cards.ExpansionSet; -import mage.cards.b.BrassclawOrcs; -import mage.cards.d.DwarvenSoldier; -import mage.cards.g.GoblinWarDrums; -import mage.cards.h.HomaridWarrior; -import mage.cards.i.IcatianScout; -import mage.cards.i.InitiatesOfTheEbonHand; -import mage.cards.m.MesaFalcon; -import mage.cards.m.MindstabThrull; -import mage.cards.n.Necrite; -import mage.cards.r.ReefPirates; -import mage.cards.t.Torture; -import mage.cards.v.VodalianSoldiers; import mage.constants.Rarity; import mage.constants.SetType; @@ -81,7 +69,7 @@ public final class FifthEdition extends ExpansionSet { cards.add(new SetCardInfo("Bottomless Vault", 411, Rarity.RARE, mage.cards.b.BottomlessVault.class)); cards.add(new SetCardInfo("Brainstorm", 76, Rarity.COMMON, mage.cards.b.Brainstorm.class)); cards.add(new SetCardInfo("Brainwash", 13, Rarity.COMMON, mage.cards.b.Brainwash.class)); - cards.add(new SetCardInfo("Brassclaw Orcs", 213, Rarity.COMMON, BrassclawOrcs.class)); + cards.add(new SetCardInfo("Brassclaw Orcs", 213, Rarity.COMMON, mage.cards.b.BrassclawOrcs.class)); cards.add(new SetCardInfo("Breeding Pit", 148, Rarity.UNCOMMON, mage.cards.b.BreedingPit.class)); cards.add(new SetCardInfo("Broken Visage", 149, Rarity.RARE, mage.cards.b.BrokenVisage.class)); cards.add(new SetCardInfo("Brothers of Fire", 214, Rarity.COMMON, mage.cards.b.BrothersOfFire.class)); @@ -93,7 +81,7 @@ public final class FifthEdition extends ExpansionSet { cards.add(new SetCardInfo("Cat Warriors", 282, Rarity.COMMON, mage.cards.c.CatWarriors.class)); cards.add(new SetCardInfo("Cave People", 215, Rarity.UNCOMMON, mage.cards.c.CavePeople.class)); cards.add(new SetCardInfo("Chub Toad", 283, Rarity.COMMON, mage.cards.c.ChubToad.class)); - cards.add(new SetCardInfo("Circle of Protection: Artifacts", 16, Rarity.COMMON, mage.cards.c.CircleOfProtectionArtifacts.class)); + cards.add(new SetCardInfo("Circle of Protection: Artifacts", 16, Rarity.UNCOMMON, mage.cards.c.CircleOfProtectionArtifacts.class)); cards.add(new SetCardInfo("Circle of Protection: Black", 17, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlack.class)); cards.add(new SetCardInfo("Circle of Protection: Blue", 18, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlue.class)); cards.add(new SetCardInfo("Circle of Protection: Green", 19, Rarity.COMMON, mage.cards.c.CircleOfProtectionGreen.class)); @@ -145,7 +133,7 @@ public final class FifthEdition extends ExpansionSet { cards.add(new SetCardInfo("Dwarven Catapult", 220, Rarity.UNCOMMON, mage.cards.d.DwarvenCatapult.class)); cards.add(new SetCardInfo("Dwarven Hold", 414, Rarity.RARE, mage.cards.d.DwarvenHold.class)); cards.add(new SetCardInfo("Dwarven Ruins", 415, Rarity.UNCOMMON, mage.cards.d.DwarvenRuins.class)); - cards.add(new SetCardInfo("Dwarven Soldier", 221, Rarity.COMMON, DwarvenSoldier.class)); + cards.add(new SetCardInfo("Dwarven Soldier", 221, Rarity.COMMON, mage.cards.d.DwarvenSoldier.class)); cards.add(new SetCardInfo("Dwarven Warriors", 222, Rarity.COMMON, mage.cards.d.DwarvenWarriors.class)); cards.add(new SetCardInfo("Earthquake", 223, Rarity.RARE, mage.cards.e.Earthquake.class)); cards.add(new SetCardInfo("Ebon Stronghold", 416, Rarity.UNCOMMON, mage.cards.e.EbonStronghold.class)); @@ -177,8 +165,8 @@ public final class FifthEdition extends ExpansionSet { cards.add(new SetCardInfo("Flood", 87, Rarity.COMMON, mage.cards.f.Flood.class)); cards.add(new SetCardInfo("Flying Carpet", 371, Rarity.RARE, mage.cards.f.FlyingCarpet.class)); cards.add(new SetCardInfo("Fog", 293, Rarity.COMMON, mage.cards.f.Fog.class)); - cards.add(new SetCardInfo("Force of Nature", 294, Rarity.RARE, mage.cards.f.ForceOfNature.class)); cards.add(new SetCardInfo("Force Spike", 88, Rarity.COMMON, mage.cards.f.ForceSpike.class)); + cards.add(new SetCardInfo("Force of Nature", 294, Rarity.RARE, mage.cards.f.ForceOfNature.class)); cards.add(new SetCardInfo("Forest", 446, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Forest", 447, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Forest", 448, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); @@ -203,7 +191,7 @@ public final class FifthEdition extends ExpansionSet { cards.add(new SetCardInfo("Goblin Digging Team", 234, Rarity.COMMON, mage.cards.g.GoblinDiggingTeam.class)); cards.add(new SetCardInfo("Goblin Hero", 235, Rarity.COMMON, mage.cards.g.GoblinHero.class)); cards.add(new SetCardInfo("Goblin King", 236, Rarity.RARE, mage.cards.g.GoblinKing.class)); - cards.add(new SetCardInfo("Goblin War Drums", 237, Rarity.COMMON, GoblinWarDrums.class)); + cards.add(new SetCardInfo("Goblin War Drums", 237, Rarity.COMMON, mage.cards.g.GoblinWarDrums.class)); cards.add(new SetCardInfo("Goblin Warrens", 238, Rarity.RARE, mage.cards.g.GoblinWarrens.class)); cards.add(new SetCardInfo("Grapeshot Catapult", 375, Rarity.COMMON, mage.cards.g.GrapeshotCatapult.class)); cards.add(new SetCardInfo("Greater Realm of Preservation", 31, Rarity.UNCOMMON, mage.cards.g.GreaterRealmOfPreservation.class)); @@ -217,7 +205,7 @@ public final class FifthEdition extends ExpansionSet { cards.add(new SetCardInfo("Hill Giant", 239, Rarity.COMMON, mage.cards.h.HillGiant.class)); cards.add(new SetCardInfo("Hollow Trees", 418, Rarity.RARE, mage.cards.h.HollowTrees.class)); cards.add(new SetCardInfo("Holy Strength", 35, Rarity.COMMON, mage.cards.h.HolyStrength.class)); - cards.add(new SetCardInfo("Homarid Warrior", 92, Rarity.COMMON, HomaridWarrior.class)); + cards.add(new SetCardInfo("Homarid Warrior", 92, Rarity.COMMON, mage.cards.h.HomaridWarrior.class)); cards.add(new SetCardInfo("Howl from Beyond", 168, Rarity.COMMON, mage.cards.h.HowlFromBeyond.class)); cards.add(new SetCardInfo("Howling Mine", 377, Rarity.RARE, mage.cards.h.HowlingMine.class)); cards.add(new SetCardInfo("Hungry Mist", 302, Rarity.COMMON, mage.cards.h.HungryMist.class)); @@ -226,7 +214,7 @@ public final class FifthEdition extends ExpansionSet { cards.add(new SetCardInfo("Hurricane", 303, Rarity.UNCOMMON, mage.cards.h.Hurricane.class)); cards.add(new SetCardInfo("Hydroblast", 94, Rarity.UNCOMMON, mage.cards.h.Hydroblast.class)); cards.add(new SetCardInfo("Icatian Phalanx", 36, Rarity.UNCOMMON, mage.cards.i.IcatianPhalanx.class)); - cards.add(new SetCardInfo("Icatian Scout", 37, Rarity.COMMON, IcatianScout.class)); + cards.add(new SetCardInfo("Icatian Scout", 37, Rarity.COMMON, mage.cards.i.IcatianScout.class)); cards.add(new SetCardInfo("Icatian Store", 419, Rarity.RARE, mage.cards.i.IcatianStore.class)); cards.add(new SetCardInfo("Icatian Town", 38, Rarity.RARE, mage.cards.i.IcatianTown.class)); cards.add(new SetCardInfo("Ice Floe", 420, Rarity.UNCOMMON, mage.cards.i.IceFloe.class)); @@ -234,7 +222,7 @@ public final class FifthEdition extends ExpansionSet { cards.add(new SetCardInfo("Incinerate", 242, Rarity.COMMON, mage.cards.i.Incinerate.class)); cards.add(new SetCardInfo("Inferno", 243, Rarity.RARE, mage.cards.i.Inferno.class)); cards.add(new SetCardInfo("Infinite Hourglass", 378, Rarity.RARE, mage.cards.i.InfiniteHourglass.class)); - cards.add(new SetCardInfo("Initiates of the Ebon Hand", 169, Rarity.COMMON, InitiatesOfTheEbonHand.class)); + cards.add(new SetCardInfo("Initiates of the Ebon Hand", 169, Rarity.COMMON, mage.cards.i.InitiatesOfTheEbonHand.class)); cards.add(new SetCardInfo("Instill Energy", 304, Rarity.UNCOMMON, mage.cards.i.InstillEnergy.class)); cards.add(new SetCardInfo("Iron Star", 379, Rarity.UNCOMMON, mage.cards.i.IronStar.class)); cards.add(new SetCardInfo("Ironclaw Curse", 244, Rarity.RARE, mage.cards.i.IronclawCurse.class)); @@ -292,13 +280,13 @@ public final class FifthEdition extends ExpansionSet { cards.add(new SetCardInfo("Meekstone", 389, Rarity.RARE, mage.cards.m.Meekstone.class)); cards.add(new SetCardInfo("Memory Lapse", 103, Rarity.COMMON, mage.cards.m.MemoryLapse.class)); cards.add(new SetCardInfo("Merfolk of the Pearl Trident", 104, Rarity.COMMON, mage.cards.m.MerfolkOfThePearlTrident.class)); - cards.add(new SetCardInfo("Mesa Falcon", 46, Rarity.COMMON, MesaFalcon.class)); + cards.add(new SetCardInfo("Mesa Falcon", 46, Rarity.COMMON, mage.cards.m.MesaFalcon.class)); cards.add(new SetCardInfo("Mesa Pegasus", 47, Rarity.COMMON, mage.cards.m.MesaPegasus.class)); cards.add(new SetCardInfo("Millstone", 390, Rarity.RARE, mage.cards.m.Millstone.class)); cards.add(new SetCardInfo("Mind Bomb", 105, Rarity.UNCOMMON, mage.cards.m.MindBomb.class)); cards.add(new SetCardInfo("Mind Ravel", 176, Rarity.COMMON, mage.cards.m.MindRavel.class)); cards.add(new SetCardInfo("Mind Warp", 177, Rarity.UNCOMMON, mage.cards.m.MindWarp.class)); - cards.add(new SetCardInfo("Mindstab Thrull", 178, Rarity.COMMON, MindstabThrull.class)); + cards.add(new SetCardInfo("Mindstab Thrull", 178, Rarity.COMMON, mage.cards.m.MindstabThrull.class)); cards.add(new SetCardInfo("Mole Worms", 179, Rarity.UNCOMMON, mage.cards.m.MoleWorms.class)); cards.add(new SetCardInfo("Mons's Goblin Raiders", 251, Rarity.COMMON, mage.cards.m.MonssGoblinRaiders.class)); cards.add(new SetCardInfo("Mountain Goat", 252, Rarity.COMMON, mage.cards.m.MountainGoat.class)); @@ -308,7 +296,7 @@ public final class FifthEdition extends ExpansionSet { cards.add(new SetCardInfo("Mountain", 445, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Murk Dwellers", 180, Rarity.COMMON, mage.cards.m.MurkDwellers.class)); cards.add(new SetCardInfo("Nature's Lore", 316, Rarity.COMMON, mage.cards.n.NaturesLore.class)); - cards.add(new SetCardInfo("Necrite", 181, Rarity.COMMON, Necrite.class)); + cards.add(new SetCardInfo("Necrite", 181, Rarity.COMMON, mage.cards.n.Necrite.class)); cards.add(new SetCardInfo("Necropotence", 182, Rarity.RARE, mage.cards.n.Necropotence.class)); cards.add(new SetCardInfo("Nether Shadow", 183, Rarity.RARE, mage.cards.n.NetherShadow.class)); cards.add(new SetCardInfo("Nevinyrral's Disk", 391, Rarity.RARE, mage.cards.n.NevinyrralsDisk.class)); @@ -357,7 +345,7 @@ public final class FifthEdition extends ExpansionSet { cards.add(new SetCardInfo("Raise Dead", 191, Rarity.COMMON, mage.cards.r.RaiseDead.class)); cards.add(new SetCardInfo("Ray of Command", 114, Rarity.COMMON, mage.cards.r.RayOfCommand.class)); cards.add(new SetCardInfo("Recall", 115, Rarity.RARE, mage.cards.r.Recall.class)); - cards.add(new SetCardInfo("Reef Pirates", 116, Rarity.COMMON, ReefPirates.class)); + cards.add(new SetCardInfo("Reef Pirates", 116, Rarity.COMMON, mage.cards.r.ReefPirates.class)); cards.add(new SetCardInfo("Regeneration", 321, Rarity.COMMON, mage.cards.r.Regeneration.class)); cards.add(new SetCardInfo("Remove Soul", 117, Rarity.COMMON, mage.cards.r.RemoveSoul.class)); cards.add(new SetCardInfo("Repentant Blacksmith", 54, Rarity.COMMON, mage.cards.r.RepentantBlacksmith.class)); @@ -424,7 +412,7 @@ public final class FifthEdition extends ExpansionSet { cards.add(new SetCardInfo("Time Bomb", 404, Rarity.RARE, mage.cards.t.TimeBomb.class)); cards.add(new SetCardInfo("Time Elemental", 129, Rarity.RARE, mage.cards.t.TimeElemental.class)); cards.add(new SetCardInfo("Titania's Song", 332, Rarity.RARE, mage.cards.t.TitaniasSong.class)); - cards.add(new SetCardInfo("Torture", 199, Rarity.COMMON, Torture.class)); + cards.add(new SetCardInfo("Torture", 199, Rarity.COMMON, mage.cards.t.Torture.class)); cards.add(new SetCardInfo("Touch of Death", 200, Rarity.COMMON, mage.cards.t.TouchOfDeath.class)); cards.add(new SetCardInfo("Tranquility", 333, Rarity.COMMON, mage.cards.t.Tranquility.class)); cards.add(new SetCardInfo("Truce", 65, Rarity.RARE, mage.cards.t.Truce.class)); @@ -445,7 +433,7 @@ public final class FifthEdition extends ExpansionSet { cards.add(new SetCardInfo("Vampire Bats", 202, Rarity.COMMON, mage.cards.v.VampireBats.class)); cards.add(new SetCardInfo("Venom", 336, Rarity.COMMON, mage.cards.v.Venom.class)); cards.add(new SetCardInfo("Verduran Enchantress", 337, Rarity.RARE, mage.cards.v.VerduranEnchantress.class)); - cards.add(new SetCardInfo("Vodalian Soldiers", 134, Rarity.COMMON, VodalianSoldiers.class)); + cards.add(new SetCardInfo("Vodalian Soldiers", 134, Rarity.COMMON, mage.cards.v.VodalianSoldiers.class)); cards.add(new SetCardInfo("Wall of Air", 135, Rarity.UNCOMMON, mage.cards.w.WallOfAir.class)); cards.add(new SetCardInfo("Wall of Bone", 203, Rarity.UNCOMMON, mage.cards.w.WallOfBone.class)); cards.add(new SetCardInfo("Wall of Brambles", 338, Rarity.UNCOMMON, mage.cards.w.WallOfBrambles.class)); diff --git a/Mage.Sets/src/mage/sets/FourthEdition.java b/Mage.Sets/src/mage/sets/FourthEdition.java index 45b19500756..4239ecae262 100644 --- a/Mage.Sets/src/mage/sets/FourthEdition.java +++ b/Mage.Sets/src/mage/sets/FourthEdition.java @@ -1,9 +1,6 @@ - package mage.sets; import mage.cards.ExpansionSet; -import mage.cards.n.NafsAsp; -import mage.cards.p.Piety; import mage.constants.Rarity; import mage.constants.SetType; @@ -79,7 +76,7 @@ public final class FourthEdition extends ExpansionSet { cards.add(new SetCardInfo("Celestial Prism", 304, Rarity.UNCOMMON, mage.cards.c.CelestialPrism.class)); cards.add(new SetCardInfo("Channel", 236, Rarity.UNCOMMON, mage.cards.c.Channel.class)); cards.add(new SetCardInfo("Chaoslace", 182, Rarity.RARE, mage.cards.c.Chaoslace.class)); - cards.add(new SetCardInfo("Circle of Protection: Artifacts", 13, Rarity.COMMON, mage.cards.c.CircleOfProtectionArtifacts.class)); + cards.add(new SetCardInfo("Circle of Protection: Artifacts", 13, Rarity.UNCOMMON, mage.cards.c.CircleOfProtectionArtifacts.class)); cards.add(new SetCardInfo("Circle of Protection: Black", 14, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlack.class)); cards.add(new SetCardInfo("Circle of Protection: Blue", 15, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlue.class)); cards.add(new SetCardInfo("Circle of Protection: Green", 16, Rarity.COMMON, mage.cards.c.CircleOfProtectionGreen.class)); @@ -250,7 +247,7 @@ public final class FourthEdition extends ExpansionSet { cards.add(new SetCardInfo("Mountain", 374, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Mountain", 375, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Murk Dwellers", 148, Rarity.COMMON, mage.cards.m.MurkDwellers.class)); - cards.add(new SetCardInfo("Nafs Asp", 264, Rarity.COMMON, NafsAsp.class)); + cards.add(new SetCardInfo("Nafs Asp", 264, Rarity.COMMON, mage.cards.n.NafsAsp.class)); cards.add(new SetCardInfo("Nether Shadow", 149, Rarity.RARE, mage.cards.n.NetherShadow.class)); cards.add(new SetCardInfo("Nevinyrral's Disk", 338, Rarity.RARE, mage.cards.n.NevinyrralsDisk.class)); cards.add(new SetCardInfo("Nightmare", 150, Rarity.RARE, mage.cards.n.Nightmare.class)); @@ -269,7 +266,7 @@ public final class FourthEdition extends ExpansionSet { cards.add(new SetCardInfo("Phantasmal Forces", 88, Rarity.UNCOMMON, mage.cards.p.PhantasmalForces.class)); cards.add(new SetCardInfo("Phantasmal Terrain", 89, Rarity.COMMON, mage.cards.p.PhantasmalTerrain.class)); cards.add(new SetCardInfo("Phantom Monster", 90, Rarity.UNCOMMON, mage.cards.p.PhantomMonster.class)); - cards.add(new SetCardInfo("Piety", 41, Rarity.COMMON, Piety.class)); + cards.add(new SetCardInfo("Piety", 41, Rarity.COMMON, mage.cards.p.Piety.class)); cards.add(new SetCardInfo("Pikemen", 42, Rarity.COMMON, mage.cards.p.Pikemen.class)); cards.add(new SetCardInfo("Pirate Ship", 91, Rarity.RARE, mage.cards.p.PirateShip.class)); cards.add(new SetCardInfo("Pit Scorpion", 153, Rarity.COMMON, mage.cards.p.PitScorpion.class)); diff --git a/Mage.Sets/src/mage/sets/FTVAngels.java b/Mage.Sets/src/mage/sets/FromTheVaultAngels.java similarity index 89% rename from Mage.Sets/src/mage/sets/FTVAngels.java rename to Mage.Sets/src/mage/sets/FromTheVaultAngels.java index cffedcb0387..ae89485479f 100644 --- a/Mage.Sets/src/mage/sets/FTVAngels.java +++ b/Mage.Sets/src/mage/sets/FromTheVaultAngels.java @@ -6,20 +6,20 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author fireshoes */ -public final class FTVAngels extends ExpansionSet { +public final class FromTheVaultAngels extends ExpansionSet { - private static final FTVAngels instance = new FTVAngels(); + private static final FromTheVaultAngels instance = new FromTheVaultAngels(); - public static FTVAngels getInstance() { + public static FromTheVaultAngels getInstance() { return instance; } - private FTVAngels() { + private FromTheVaultAngels() { super("From the Vault: Angels", "V15", ExpansionSet.buildDate(2015, 8, 21), SetType.SUPPLEMENTAL); this.hasBasicLands = false; + cards.add(new SetCardInfo("Akroma, Angel of Fury", 1, Rarity.MYTHIC, mage.cards.a.AkromaAngelOfFury.class)); cards.add(new SetCardInfo("Akroma, Angel of Wrath", 2, Rarity.MYTHIC, mage.cards.a.AkromaAngelOfWrath.class)); cards.add(new SetCardInfo("Archangel of Strife", 3, Rarity.MYTHIC, mage.cards.a.ArchangelOfStrife.class)); diff --git a/Mage.Sets/src/mage/sets/FTVAnnihilation.java b/Mage.Sets/src/mage/sets/FromTheVaultAnnihilation.java similarity index 87% rename from Mage.Sets/src/mage/sets/FTVAnnihilation.java rename to Mage.Sets/src/mage/sets/FromTheVaultAnnihilation.java index 590ecd4d04b..62289513849 100644 --- a/Mage.Sets/src/mage/sets/FTVAnnihilation.java +++ b/Mage.Sets/src/mage/sets/FromTheVaultAnnihilation.java @@ -6,20 +6,20 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author fireshoes */ -public final class FTVAnnihilation extends ExpansionSet { +public final class FromTheVaultAnnihilation extends ExpansionSet { - private static final FTVAnnihilation instance = new FTVAnnihilation(); + private static final FromTheVaultAnnihilation instance = new FromTheVaultAnnihilation(); - public static FTVAnnihilation getInstance() { + public static FromTheVaultAnnihilation getInstance() { return instance; } - private FTVAnnihilation() { + private FromTheVaultAnnihilation() { super("From the Vault: Annihilation", "V14", ExpansionSet.buildDate(2014, 8, 22), SetType.SUPPLEMENTAL); this.hasBasicLands = false; + cards.add(new SetCardInfo("Armageddon", 1, Rarity.MYTHIC, mage.cards.a.Armageddon.class)); cards.add(new SetCardInfo("Burning of Xinye", 2, Rarity.MYTHIC, mage.cards.b.BurningOfXinye.class)); cards.add(new SetCardInfo("Cataclysm", 3, Rarity.MYTHIC, mage.cards.c.Cataclysm.class)); diff --git a/Mage.Sets/src/mage/sets/FTVDragons.java b/Mage.Sets/src/mage/sets/FromTheVaultDragons.java similarity index 89% rename from Mage.Sets/src/mage/sets/FTVDragons.java rename to Mage.Sets/src/mage/sets/FromTheVaultDragons.java index 7352718537c..30f2dbec178 100644 --- a/Mage.Sets/src/mage/sets/FTVDragons.java +++ b/Mage.Sets/src/mage/sets/FromTheVaultDragons.java @@ -9,15 +9,15 @@ import mage.constants.SetType; * * @author fireshoes */ -public final class FTVDragons extends ExpansionSet { +public final class FromTheVaultDragons extends ExpansionSet { - private static final FTVDragons instance = new FTVDragons(); + private static final FromTheVaultDragons instance = new FromTheVaultDragons(); - public static FTVDragons getInstance() { + public static FromTheVaultDragons getInstance() { return instance; } - private FTVDragons() { + private FromTheVaultDragons() { super("From the Vault: Dragons", "DRB", ExpansionSet.buildDate(2008, 8, 29), SetType.SUPPLEMENTAL); this.hasBasicLands = false; cards.add(new SetCardInfo("Bladewing the Risen", 1, Rarity.RARE, mage.cards.b.BladewingTheRisen.class)); diff --git a/Mage.Sets/src/mage/sets/FTVExiled.java b/Mage.Sets/src/mage/sets/FromTheVaultExiled.java similarity index 88% rename from Mage.Sets/src/mage/sets/FTVExiled.java rename to Mage.Sets/src/mage/sets/FromTheVaultExiled.java index ff5db9f89d1..e6ec0fefb8f 100644 --- a/Mage.Sets/src/mage/sets/FTVExiled.java +++ b/Mage.Sets/src/mage/sets/FromTheVaultExiled.java @@ -6,20 +6,20 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author fireshoes */ -public final class FTVExiled extends ExpansionSet { +public final class FromTheVaultExiled extends ExpansionSet { - private static final FTVExiled instance = new FTVExiled(); + private static final FromTheVaultExiled instance = new FromTheVaultExiled(); - public static FTVExiled getInstance() { + public static FromTheVaultExiled getInstance() { return instance; } - private FTVExiled() { + private FromTheVaultExiled() { super("From the Vault: Exiled", "V09", ExpansionSet.buildDate(2009, 8, 28), SetType.SUPPLEMENTAL); this.hasBasicLands = false; + cards.add(new SetCardInfo("Balance", 1, Rarity.MYTHIC, mage.cards.b.Balance.class)); cards.add(new SetCardInfo("Berserk", 2, Rarity.MYTHIC, mage.cards.b.Berserk.class)); cards.add(new SetCardInfo("Channel", 3, Rarity.MYTHIC, mage.cards.c.Channel.class)); diff --git a/Mage.Sets/src/mage/sets/FTVLegends.java b/Mage.Sets/src/mage/sets/FromTheVaultLegends.java similarity index 89% rename from Mage.Sets/src/mage/sets/FTVLegends.java rename to Mage.Sets/src/mage/sets/FromTheVaultLegends.java index 11dae6d3588..364affb4310 100644 --- a/Mage.Sets/src/mage/sets/FTVLegends.java +++ b/Mage.Sets/src/mage/sets/FromTheVaultLegends.java @@ -6,20 +6,20 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author fireshoes */ -public final class FTVLegends extends ExpansionSet { +public final class FromTheVaultLegends extends ExpansionSet { - private static final FTVLegends instance = new FTVLegends(); + private static final FromTheVaultLegends instance = new FromTheVaultLegends(); - public static FTVLegends getInstance() { + public static FromTheVaultLegends getInstance() { return instance; } - private FTVLegends() { + private FromTheVaultLegends() { super("From the Vault: Legends", "V11", ExpansionSet.buildDate(2011, 8, 26), SetType.SUPPLEMENTAL); this.hasBasicLands = false; + cards.add(new SetCardInfo("Cao Cao, Lord of Wei", 1, Rarity.MYTHIC, mage.cards.c.CaoCaoLordOfWei.class)); cards.add(new SetCardInfo("Captain Sisay", 2, Rarity.MYTHIC, mage.cards.c.CaptainSisay.class)); cards.add(new SetCardInfo("Doran, the Siege Tower", 3, Rarity.MYTHIC, mage.cards.d.DoranTheSiegeTower.class)); diff --git a/Mage.Sets/src/mage/sets/FTVLore.java b/Mage.Sets/src/mage/sets/FromTheVaultLore.java similarity index 89% rename from Mage.Sets/src/mage/sets/FTVLore.java rename to Mage.Sets/src/mage/sets/FromTheVaultLore.java index 3fbfb9ba820..29f37a596a2 100644 --- a/Mage.Sets/src/mage/sets/FTVLore.java +++ b/Mage.Sets/src/mage/sets/FromTheVaultLore.java @@ -6,20 +6,20 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author fireshoes */ -public final class FTVLore extends ExpansionSet { +public final class FromTheVaultLore extends ExpansionSet { - private static final FTVLore instance = new FTVLore(); + private static final FromTheVaultLore instance = new FromTheVaultLore(); - public static FTVLore getInstance() { + public static FromTheVaultLore getInstance() { return instance; } - private FTVLore() { + private FromTheVaultLore() { super("From the Vault: Lore", "V16", ExpansionSet.buildDate(2016, 8, 19), SetType.SUPPLEMENTAL); this.hasBasicLands = false; + cards.add(new SetCardInfo("Beseech the Queen", 1, Rarity.MYTHIC, mage.cards.b.BeseechTheQueen.class)); cards.add(new SetCardInfo("Cabal Ritual", 2, Rarity.MYTHIC, mage.cards.c.CabalRitual.class)); cards.add(new SetCardInfo("Conflux", 3, Rarity.MYTHIC, mage.cards.c.Conflux.class)); diff --git a/Mage.Sets/src/mage/sets/FTVRealms.java b/Mage.Sets/src/mage/sets/FromTheVaultRealms.java similarity index 89% rename from Mage.Sets/src/mage/sets/FTVRealms.java rename to Mage.Sets/src/mage/sets/FromTheVaultRealms.java index 3b41922476f..da6693e6b95 100644 --- a/Mage.Sets/src/mage/sets/FTVRealms.java +++ b/Mage.Sets/src/mage/sets/FromTheVaultRealms.java @@ -6,20 +6,20 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author fireshoes */ -public final class FTVRealms extends ExpansionSet { +public final class FromTheVaultRealms extends ExpansionSet { - private static final FTVRealms instance = new FTVRealms(); + private static final FromTheVaultRealms instance = new FromTheVaultRealms(); - public static FTVRealms getInstance() { + public static FromTheVaultRealms getInstance() { return instance; } - private FTVRealms() { + private FromTheVaultRealms() { super("From the Vault: Realms", "V12", ExpansionSet.buildDate(2012, 8, 31), SetType.SUPPLEMENTAL); this.hasBasicLands = false; + cards.add(new SetCardInfo("Ancient Tomb", 1, Rarity.MYTHIC, mage.cards.a.AncientTomb.class)); cards.add(new SetCardInfo("Boseiju, Who Shelters All", 2, Rarity.MYTHIC, mage.cards.b.BoseijuWhoSheltersAll.class)); cards.add(new SetCardInfo("Cephalid Coliseum", 3, Rarity.MYTHIC, mage.cards.c.CephalidColiseum.class)); diff --git a/Mage.Sets/src/mage/sets/FTVRelics.java b/Mage.Sets/src/mage/sets/FromTheVaultRelics.java similarity index 89% rename from Mage.Sets/src/mage/sets/FTVRelics.java rename to Mage.Sets/src/mage/sets/FromTheVaultRelics.java index 8781c002c8a..ba2a81ed2af 100644 --- a/Mage.Sets/src/mage/sets/FTVRelics.java +++ b/Mage.Sets/src/mage/sets/FromTheVaultRelics.java @@ -6,20 +6,20 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author fireshoes */ -public final class FTVRelics extends ExpansionSet { +public final class FromTheVaultRelics extends ExpansionSet { - private static final FTVRelics instance = new FTVRelics(); + private static final FromTheVaultRelics instance = new FromTheVaultRelics(); - public static FTVRelics getInstance() { + public static FromTheVaultRelics getInstance() { return instance; } - private FTVRelics() { + private FromTheVaultRelics() { super("From the Vault: Relics", "V10", ExpansionSet.buildDate(2010, 8, 27), SetType.SUPPLEMENTAL); this.hasBasicLands = false; + cards.add(new SetCardInfo("Aether Vial", 1, Rarity.MYTHIC, mage.cards.a.AetherVial.class)); cards.add(new SetCardInfo("Black Vise", 2, Rarity.MYTHIC, mage.cards.b.BlackVise.class)); cards.add(new SetCardInfo("Isochron Scepter", 3, Rarity.MYTHIC, mage.cards.i.IsochronScepter.class)); diff --git a/Mage.Sets/src/mage/sets/FTVTransform.java b/Mage.Sets/src/mage/sets/FromTheVaultTransform.java similarity index 92% rename from Mage.Sets/src/mage/sets/FTVTransform.java rename to Mage.Sets/src/mage/sets/FromTheVaultTransform.java index bf4dcd75b1a..5319234d4ae 100644 --- a/Mage.Sets/src/mage/sets/FTVTransform.java +++ b/Mage.Sets/src/mage/sets/FromTheVaultTransform.java @@ -6,20 +6,20 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author fireshoes */ -public final class FTVTransform extends ExpansionSet { +public final class FromTheVaultTransform extends ExpansionSet { - private static final FTVTransform instance = new FTVTransform(); + private static final FromTheVaultTransform instance = new FromTheVaultTransform(); - public static FTVTransform getInstance() { + public static FromTheVaultTransform getInstance() { return instance; } - private FTVTransform() { + private FromTheVaultTransform() { super("From the Vault: Transform", "V17", ExpansionSet.buildDate(2017, 11, 24), SetType.SUPPLEMENTAL); this.hasBasicLands = false; + cards.add(new SetCardInfo("Archangel Avacyn", 1, Rarity.MYTHIC, mage.cards.a.ArchangelAvacyn.class)); cards.add(new SetCardInfo("Avacyn, the Purifier", 1001, Rarity.MYTHIC, mage.cards.a.AvacynThePurifier.class)); cards.add(new SetCardInfo("Arguel's Blood Fast", 2, Rarity.MYTHIC, mage.cards.a.ArguelsBloodFast.class)); @@ -29,8 +29,8 @@ public final class FTVTransform extends ExpansionSet { cards.add(new SetCardInfo("Bloodline Keeper", 4, Rarity.MYTHIC, mage.cards.b.BloodlineKeeper.class)); cards.add(new SetCardInfo("Lord of Lineage", 1004, Rarity.MYTHIC, mage.cards.l.LordOfLineage.class)); cards.add(new SetCardInfo("Bruna, the Fading Light", 5, Rarity.MYTHIC, mage.cards.b.BrunaTheFadingLight.class)); - cards.add(new SetCardInfo("Brisela, Voice of Nightmares", 1005, Rarity.MYTHIC, mage.cards.b.BriselaVoiceOfNightmares.class)); - cards.add(new SetCardInfo("Brisela, Voice of Nightmares", 1005, Rarity.MYTHIC, mage.cards.b.BriselaVoiceOfNightmares.class)); + cards.add(new SetCardInfo("Brisela, Voice of Nightmares", 1005, Rarity.MYTHIC, mage.cards.b.BriselaVoiceOfNightmares.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Brisela, Voice of Nightmares", 1005, Rarity.MYTHIC, mage.cards.b.BriselaVoiceOfNightmares.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Chandra, Fire of Kaladesh", 6, Rarity.MYTHIC, mage.cards.c.ChandraFireOfKaladesh.class)); cards.add(new SetCardInfo("Chandra, Roaring Flame", 1006, Rarity.MYTHIC, mage.cards.c.ChandraRoaringFlame.class)); cards.add(new SetCardInfo("Delver of Secrets", 7, Rarity.MYTHIC, mage.cards.d.DelverOfSecrets.class)); diff --git a/Mage.Sets/src/mage/sets/FTVTwenty.java b/Mage.Sets/src/mage/sets/FromTheVaultTwenty.java similarity index 87% rename from Mage.Sets/src/mage/sets/FTVTwenty.java rename to Mage.Sets/src/mage/sets/FromTheVaultTwenty.java index 2b735c7e020..0e4878217b7 100644 --- a/Mage.Sets/src/mage/sets/FTVTwenty.java +++ b/Mage.Sets/src/mage/sets/FromTheVaultTwenty.java @@ -1,26 +1,24 @@ - package mage.sets; import mage.cards.ExpansionSet; -import mage.cards.h.HymnToTourach; import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author fireshoes */ -public final class FTVTwenty extends ExpansionSet { +public final class FromTheVaultTwenty extends ExpansionSet { - private static final FTVTwenty instance = new FTVTwenty(); + private static final FromTheVaultTwenty instance = new FromTheVaultTwenty(); - public static FTVTwenty getInstance() { + public static FromTheVaultTwenty getInstance() { return instance; } - private FTVTwenty() { + private FromTheVaultTwenty() { super("From the Vault: Twenty", "V13", ExpansionSet.buildDate(2013, 8, 23), SetType.SUPPLEMENTAL); this.hasBasicLands = false; + cards.add(new SetCardInfo("Akroma's Vengeance", 11, Rarity.MYTHIC, mage.cards.a.AkromasVengeance.class)); cards.add(new SetCardInfo("Chainer's Edict", 10, Rarity.MYTHIC, mage.cards.c.ChainersEdict.class)); cards.add(new SetCardInfo("Chameleon Colossus", 16, Rarity.MYTHIC, mage.cards.c.ChameleonColossus.class)); @@ -31,7 +29,7 @@ public final class FTVTwenty extends ExpansionSet { cards.add(new SetCardInfo("Fyndhorn Elves", 4, Rarity.MYTHIC, mage.cards.f.FyndhornElves.class)); cards.add(new SetCardInfo("Gilded Lotus", 12, Rarity.MYTHIC, mage.cards.g.GildedLotus.class)); cards.add(new SetCardInfo("Green Sun's Zenith", 19, Rarity.MYTHIC, mage.cards.g.GreenSunsZenith.class)); - cards.add(new SetCardInfo("Hymn to Tourach", 3, Rarity.SPECIAL, HymnToTourach.class)); + cards.add(new SetCardInfo("Hymn to Tourach", 3, Rarity.MYTHIC, mage.cards.h.HymnToTourach.class)); cards.add(new SetCardInfo("Impulse", 5, Rarity.MYTHIC, mage.cards.i.Impulse.class)); cards.add(new SetCardInfo("Ink-Eyes, Servant of Oni", 13, Rarity.MYTHIC, mage.cards.i.InkEyesServantOfOni.class)); cards.add(new SetCardInfo("Jace, the Mind Sculptor", 18, Rarity.MYTHIC, mage.cards.j.JaceTheMindSculptor.class)); diff --git a/Mage.Sets/src/mage/sets/JiangYangguMuYanling.java b/Mage.Sets/src/mage/sets/GlobalSeriesJiangYangguAndMuYanling.java similarity index 93% rename from Mage.Sets/src/mage/sets/JiangYangguMuYanling.java rename to Mage.Sets/src/mage/sets/GlobalSeriesJiangYangguAndMuYanling.java index 1121e75f8c1..c63ec1e93f0 100644 --- a/Mage.Sets/src/mage/sets/JiangYangguMuYanling.java +++ b/Mage.Sets/src/mage/sets/GlobalSeriesJiangYangguAndMuYanling.java @@ -5,21 +5,21 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author TheElk801 */ -public final class JiangYangguMuYanling extends ExpansionSet { +public final class GlobalSeriesJiangYangguAndMuYanling extends ExpansionSet { - private static final JiangYangguMuYanling instance = new JiangYangguMuYanling(); + private static final GlobalSeriesJiangYangguAndMuYanling instance = new GlobalSeriesJiangYangguAndMuYanling(); - public static JiangYangguMuYanling getInstance() { + public static GlobalSeriesJiangYangguAndMuYanling getInstance() { return instance; } - private JiangYangguMuYanling() { + private GlobalSeriesJiangYangguAndMuYanling() { super("Global Series: Jiang Yanggu & Mu Yanling", "GS1", ExpansionSet.buildDate(2018, 6, 22), SetType.SUPPLEMENTAL_STANDARD_LEGAL); this.blockName = "Global Series"; this.hasBasicLands = true; + cards.add(new SetCardInfo("Aggressive Instinct", 34, Rarity.COMMON, mage.cards.a.AggressiveInstinct.class)); cards.add(new SetCardInfo("Ancestor Dragon", 12, Rarity.RARE, mage.cards.a.AncestorDragon.class)); cards.add(new SetCardInfo("Armored Whirl Turtle", 7, Rarity.COMMON, mage.cards.a.ArmoredWhirlTurtle.class)); diff --git a/Mage.Sets/src/mage/sets/GrandPrix.java b/Mage.Sets/src/mage/sets/GrandPrix.java deleted file mode 100644 index 85c5b61dcf9..00000000000 --- a/Mage.Sets/src/mage/sets/GrandPrix.java +++ /dev/null @@ -1,39 +0,0 @@ - -package mage.sets; - -import mage.cards.ExpansionSet; -import mage.constants.Rarity; -import mage.constants.SetType; - -/** - * - * @author fireshoes - */ -public final class GrandPrix extends ExpansionSet { - - private static final GrandPrix instance = new GrandPrix(); - - public static GrandPrix getInstance() { - return instance; - } - - private GrandPrix() { - super("Grand Prix", "GPX", ExpansionSet.buildDate(2011, 6, 17), SetType.PROMOTIONAL); - this.hasBoosters = false; - this.hasBasicLands = false; - cards.add(new SetCardInfo("All Is Dust", 9, Rarity.MYTHIC, mage.cards.a.AllIsDust.class)); - cards.add(new SetCardInfo("Batterskull", 10, Rarity.MYTHIC, mage.cards.b.Batterskull.class)); - cards.add(new SetCardInfo("Call of the Herd", 2, Rarity.RARE, mage.cards.c.CallOfTheHerd.class)); - cards.add(new SetCardInfo("Chrome Mox", 3, Rarity.RARE, mage.cards.c.ChromeMox.class)); - cards.add(new SetCardInfo("Progenitus", 13, Rarity.MYTHIC, mage.cards.p.Progenitus.class)); - cards.add(new SetCardInfo("Goblin Guide", 6, Rarity.RARE, mage.cards.g.GoblinGuide.class)); - cards.add(new SetCardInfo("Griselbrand", 11, Rarity.MYTHIC, mage.cards.g.Griselbrand.class)); - cards.add(new SetCardInfo("Lotus Cobra", 7, Rarity.MYTHIC, mage.cards.l.LotusCobra.class)); - cards.add(new SetCardInfo("Maelstrom Pulse", 5, Rarity.RARE, mage.cards.m.MaelstromPulse.class)); - cards.add(new SetCardInfo("Primeval Titan", 8, Rarity.MYTHIC, mage.cards.p.PrimevalTitan.class)); - cards.add(new SetCardInfo("Spiritmonger", 1, Rarity.RARE, mage.cards.s.Spiritmonger.class)); - cards.add(new SetCardInfo("Stoneforge Mystic", 12, Rarity.RARE, mage.cards.s.StoneforgeMystic.class)); - cards.add(new SetCardInfo("Umezawa's Jitte", 4, Rarity.RARE, mage.cards.u.UmezawasJitte.class)); - } - -} diff --git a/Mage.Sets/src/mage/sets/GrandPrixPromos.java b/Mage.Sets/src/mage/sets/GrandPrixPromos.java new file mode 100644 index 00000000000..b3362b716fa --- /dev/null +++ b/Mage.Sets/src/mage/sets/GrandPrixPromos.java @@ -0,0 +1,46 @@ + +package mage.sets; + +import mage.cards.ExpansionSet; +import mage.constants.Rarity; +import mage.constants.SetType; + +/** + * @author fireshoes + */ +public final class GrandPrixPromos extends ExpansionSet { + + private static final GrandPrixPromos instance = new GrandPrixPromos(); + + public static GrandPrixPromos getInstance() { + return instance; + } + + private GrandPrixPromos() { + super("Grand Prix Promos", "GPX", ExpansionSet.buildDate(2011, 6, 17), SetType.PROMOTIONAL); + this.hasBoosters = false; + this.hasBasicLands = true; + + cards.add(new SetCardInfo("All Is Dust", "2013b", Rarity.RARE, mage.cards.a.AllIsDust.class)); + cards.add(new SetCardInfo("Batterskull", 2014, Rarity.MYTHIC, mage.cards.b.Batterskull.class)); + cards.add(new SetCardInfo("Call of the Herd", 2008, Rarity.RARE, mage.cards.c.CallOfTheHerd.class)); + cards.add(new SetCardInfo("Chrome Mox", 2009, Rarity.RARE, mage.cards.c.ChromeMox.class)); + cards.add(new SetCardInfo("Forest", "2018f", Rarity.LAND, mage.cards.basiclands.Forest.class)); + cards.add(new SetCardInfo("Goblin Guide", "2012a", Rarity.RARE, mage.cards.g.GoblinGuide.class)); + cards.add(new SetCardInfo("Griselbrand", 2015, Rarity.MYTHIC, mage.cards.g.Griselbrand.class)); + cards.add(new SetCardInfo("Island", "2018b", Rarity.LAND, mage.cards.basiclands.Island.class)); + cards.add(new SetCardInfo("Lotus Cobra", "2012b", Rarity.RARE, mage.cards.l.LotusCobra.class)); + cards.add(new SetCardInfo("Maelstrom Pulse", 2011, Rarity.RARE, mage.cards.m.MaelstromPulse.class)); + cards.add(new SetCardInfo("Mountain", "2018d", Rarity.LAND, mage.cards.basiclands.Mountain.class)); + cards.add(new SetCardInfo("Mutavault", 2018, Rarity.RARE, mage.cards.m.Mutavault.class)); + cards.add(new SetCardInfo("Plains", "2018a", Rarity.LAND, mage.cards.basiclands.Plains.class)); + cards.add(new SetCardInfo("Primeval Titan", "2013a", Rarity.MYTHIC, mage.cards.p.PrimevalTitan.class)); + cards.add(new SetCardInfo("Progenitus", 2017, Rarity.MYTHIC, mage.cards.p.Progenitus.class)); + cards.add(new SetCardInfo("Spiritmonger", 2007, Rarity.RARE, mage.cards.s.Spiritmonger.class)); + cards.add(new SetCardInfo("Stoneforge Mystic", 2016, Rarity.RARE, mage.cards.s.StoneforgeMystic.class)); + cards.add(new SetCardInfo("Swamp", "2018c", Rarity.LAND, mage.cards.basiclands.Swamp.class)); + cards.add(new SetCardInfo("Sword of Feast and Famine", "2016b", Rarity.RARE, mage.cards.s.SwordOfFeastAndFamine.class)); + cards.add(new SetCardInfo("Umezawa's Jitte", 2010, Rarity.RARE, mage.cards.u.UmezawasJitte.class)); + } + +} diff --git a/Mage.Sets/src/mage/sets/Guildpact.java b/Mage.Sets/src/mage/sets/Guildpact.java index 1e3a1611318..58b19900e28 100644 --- a/Mage.Sets/src/mage/sets/Guildpact.java +++ b/Mage.Sets/src/mage/sets/Guildpact.java @@ -50,7 +50,7 @@ public final class Guildpact extends ExpansionSet { cards.add(new SetCardInfo("Cremate", 45, Rarity.COMMON, mage.cards.c.Cremate.class)); cards.add(new SetCardInfo("Cry of Contrition", 46, Rarity.COMMON, mage.cards.c.CryOfContrition.class)); cards.add(new SetCardInfo("Cryptwailing", 47, Rarity.UNCOMMON, mage.cards.c.Cryptwailing.class)); - cards.add(new SetCardInfo("Crystal Seer", 23, Rarity.UNCOMMON, mage.cards.c.CrystalSeer.class)); + cards.add(new SetCardInfo("Crystal Seer", 23, Rarity.COMMON, mage.cards.c.CrystalSeer.class)); cards.add(new SetCardInfo("Culling Sun", 109, Rarity.RARE, mage.cards.c.CullingSun.class)); cards.add(new SetCardInfo("Daggerclaw Imp", 48, Rarity.UNCOMMON, mage.cards.d.DaggerclawImp.class)); cards.add(new SetCardInfo("Debtors' Knell", 141, Rarity.RARE, mage.cards.d.DebtorsKnell.class)); diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index bc706b86ca0..0c9ee0fd14f 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -1,6 +1,13 @@ package mage.sets; +import java.util.ArrayList; +import java.util.List; + import mage.cards.ExpansionSet; +import mage.cards.repository.CardCriteria; +import mage.cards.repository.CardInfo; +import mage.cards.repository.CardRepository; +import mage.constants.CardType; import mage.constants.Rarity; import mage.constants.SetType; @@ -16,11 +23,13 @@ public final class GuildsOfRavnica extends ExpansionSet { super("Guilds of Ravnica", "GRN", ExpansionSet.buildDate(2018, 10, 5), SetType.EXPANSION); this.blockName = "Guilds of Ravnica"; this.hasBoosters = true; - this.numBoosterLands = 1; + this.numBoosterSpecial = 1; + this.numBoosterLands = 0; this.numBoosterCommon = 10; this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 8; + this.maxCardNumberInBooster = 259; cards.add(new SetCardInfo("Affectionate Indrik", 121, Rarity.UNCOMMON, mage.cards.a.AffectionateIndrik.class)); cards.add(new SetCardInfo("Arboretum Elemental", 122, Rarity.UNCOMMON, mage.cards.a.ArboretumElemental.class)); @@ -34,17 +43,21 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Barrier of Bones", 61, Rarity.COMMON, mage.cards.b.BarrierOfBones.class)); cards.add(new SetCardInfo("Bartizan Bats", 62, Rarity.COMMON, mage.cards.b.BartizanBats.class)); cards.add(new SetCardInfo("Beacon Bolt", 154, Rarity.UNCOMMON, mage.cards.b.BeaconBolt.class)); + cards.add(new SetCardInfo("Beamsplitter Mage", 155, Rarity.UNCOMMON, mage.cards.b.BeamsplitterMage.class)); cards.add(new SetCardInfo("Beast Whisperer", 123, Rarity.RARE, mage.cards.b.BeastWhisperer.class)); cards.add(new SetCardInfo("Blade Instructor", 1, Rarity.COMMON, mage.cards.b.BladeInstructor.class)); cards.add(new SetCardInfo("Blood Operative", 63, Rarity.RARE, mage.cards.b.BloodOperative.class)); cards.add(new SetCardInfo("Book Devourer", 93, Rarity.UNCOMMON, mage.cards.b.BookDevourer.class)); cards.add(new SetCardInfo("Boros Challenger", 156, Rarity.UNCOMMON, mage.cards.b.BorosChallenger.class)); - cards.add(new SetCardInfo("Boros Guildgate", 243, Rarity.COMMON, mage.cards.b.BorosGuildgate.class)); - cards.add(new SetCardInfo("Boros Guildgate", 244, Rarity.COMMON, mage.cards.b.BorosGuildgate.class)); + cards.add(new SetCardInfo("Boros Guildgate", 243, Rarity.COMMON, mage.cards.b.BorosGuildgate.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Boros Guildgate", 244, Rarity.COMMON, mage.cards.b.BorosGuildgate.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Boros Locket", 231, Rarity.COMMON, mage.cards.b.BorosLocket.class)); cards.add(new SetCardInfo("Bounty Agent", 2, Rarity.RARE, mage.cards.b.BountyAgent.class)); + cards.add(new SetCardInfo("Bounty of Might", 124, Rarity.RARE, mage.cards.b.BountyOfMight.class)); cards.add(new SetCardInfo("Burglar Rat", 64, Rarity.COMMON, mage.cards.b.BurglarRat.class)); cards.add(new SetCardInfo("Camaraderie", 157, Rarity.RARE, mage.cards.c.Camaraderie.class)); + cards.add(new SetCardInfo("Candlelight Vigil", 3, Rarity.COMMON, mage.cards.c.CandlelightVigil.class)); + cards.add(new SetCardInfo("Capture Sphere", 31, Rarity.COMMON, mage.cards.c.CaptureSphere.class)); cards.add(new SetCardInfo("Centaur Peacemaker", 158, Rarity.COMMON, mage.cards.c.CentaurPeacemaker.class)); cards.add(new SetCardInfo("Chamber Sentry", 232, Rarity.RARE, mage.cards.c.ChamberSentry.class)); cards.add(new SetCardInfo("Chance for Glory", 159, Rarity.MYTHIC, mage.cards.c.ChanceForGlory.class)); @@ -55,13 +68,16 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Circuitous Route", 125, Rarity.UNCOMMON, mage.cards.c.CircuitousRoute.class)); cards.add(new SetCardInfo("Citywatch Sphinx", 33, Rarity.UNCOMMON, mage.cards.c.CitywatchSphinx.class)); cards.add(new SetCardInfo("Citywide Bust", 4, Rarity.RARE, mage.cards.c.CitywideBust.class)); + cards.add(new SetCardInfo("Collar the Culprit", 5, Rarity.COMMON, mage.cards.c.CollarTheCulprit.class)); cards.add(new SetCardInfo("Command the Storm", 94, Rarity.COMMON, mage.cards.c.CommandTheStorm.class)); cards.add(new SetCardInfo("Conclave Cavalier", 161, Rarity.UNCOMMON, mage.cards.c.ConclaveCavalier.class)); cards.add(new SetCardInfo("Conclave Guildmage", 162, Rarity.UNCOMMON, mage.cards.c.ConclaveGuildmage.class)); cards.add(new SetCardInfo("Conclave Tribunal", 6, Rarity.UNCOMMON, mage.cards.c.ConclaveTribunal.class)); cards.add(new SetCardInfo("Connive // Concoct", 222, Rarity.RARE, mage.cards.c.ConniveConcoct.class)); + cards.add(new SetCardInfo("Cosmotronic Wave", 95, Rarity.COMMON, mage.cards.c.CosmotronicWave.class)); cards.add(new SetCardInfo("Crackling Drake", 163, Rarity.UNCOMMON, mage.cards.c.CracklingDrake.class)); cards.add(new SetCardInfo("Creeping Chill", 66, Rarity.UNCOMMON, mage.cards.c.CreepingChill.class)); + cards.add(new SetCardInfo("Crush Contraband", 7, Rarity.UNCOMMON, mage.cards.c.CrushContraband.class)); cards.add(new SetCardInfo("Crushing Canopy", 126, Rarity.COMMON, mage.cards.c.CrushingCanopy.class)); cards.add(new SetCardInfo("Darkblade Agent", 164, Rarity.COMMON, mage.cards.d.DarkbladeAgent.class)); cards.add(new SetCardInfo("Dawn of Hope", 8, Rarity.RARE, mage.cards.d.DawnOfHope.class)); @@ -69,9 +85,11 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Dead Weight", 67, Rarity.COMMON, mage.cards.d.DeadWeight.class)); cards.add(new SetCardInfo("Deadly Visit", 68, Rarity.COMMON, mage.cards.d.DeadlyVisit.class)); cards.add(new SetCardInfo("Deafening Clarion", 165, Rarity.RARE, mage.cards.d.DeafeningClarion.class)); + cards.add(new SetCardInfo("Demotion", 9, Rarity.UNCOMMON, mage.cards.d.Demotion.class)); + cards.add(new SetCardInfo("Devious Cover-up", 35, Rarity.COMMON, mage.cards.d.DeviousCoverUp.class)); cards.add(new SetCardInfo("Devkarin Dissident", 127, Rarity.COMMON, mage.cards.d.DevkarinDissident.class)); - cards.add(new SetCardInfo("Dimir Guildgate", 245, Rarity.COMMON, mage.cards.d.DimirGuildgate.class)); - cards.add(new SetCardInfo("Dimir Guildgate", 246, Rarity.COMMON, mage.cards.d.DimirGuildgate.class)); + cards.add(new SetCardInfo("Dimir Guildgate", 245, Rarity.COMMON, mage.cards.d.DimirGuildgate.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Dimir Guildgate", 246, Rarity.COMMON, mage.cards.d.DimirGuildgate.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Dimir Informant", 36, Rarity.COMMON, mage.cards.d.DimirInformant.class)); cards.add(new SetCardInfo("Dimir Locket", 234, Rarity.COMMON, mage.cards.d.DimirLocket.class)); cards.add(new SetCardInfo("Dimir Spybug", 166, Rarity.UNCOMMON, mage.cards.d.DimirSpybug.class)); @@ -92,6 +110,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Erstwhile Trooper", 169, Rarity.COMMON, mage.cards.e.ErstwhileTrooper.class)); cards.add(new SetCardInfo("Etrata, the Silencer", 170, Rarity.RARE, mage.cards.e.EtrataTheSilencer.class)); cards.add(new SetCardInfo("Expansion // Explosion", 224, Rarity.RARE, mage.cards.e.ExpansionExplosion.class)); + cards.add(new SetCardInfo("Experimental Frenzy", 99, Rarity.RARE, mage.cards.e.ExperimentalFrenzy.class)); cards.add(new SetCardInfo("Fearless Halberdier", 100, Rarity.COMMON, mage.cards.f.FearlessHalberdier.class)); cards.add(new SetCardInfo("Find // Finality", 225, Rarity.RARE, mage.cards.f.FindFinality.class)); cards.add(new SetCardInfo("Fire Urchin", 101, Rarity.COMMON, mage.cards.f.FireUrchin.class)); @@ -112,13 +131,15 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Goblin Electromancer", 174, Rarity.COMMON, mage.cards.g.GoblinElectromancer.class)); cards.add(new SetCardInfo("Goblin Locksmith", 104, Rarity.COMMON, mage.cards.g.GoblinLocksmith.class)); cards.add(new SetCardInfo("Golgari Findbroker", 175, Rarity.UNCOMMON, mage.cards.g.GolgariFindbroker.class)); - cards.add(new SetCardInfo("Golgari Guildgate", 248, Rarity.COMMON, mage.cards.g.GolgariGuildgate.class)); - cards.add(new SetCardInfo("Golgari Guildgate", 249, Rarity.COMMON, mage.cards.g.GolgariGuildgate.class)); + cards.add(new SetCardInfo("Golgari Guildgate", 248, Rarity.COMMON, mage.cards.g.GolgariGuildgate.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Golgari Guildgate", 249, Rarity.COMMON, mage.cards.g.GolgariGuildgate.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Golgari Locket", 237, Rarity.COMMON, mage.cards.g.GolgariLocket.class)); cards.add(new SetCardInfo("Golgari Raiders", 130, Rarity.UNCOMMON, mage.cards.g.GolgariRaiders.class)); cards.add(new SetCardInfo("Grappling Sundew", 131, Rarity.UNCOMMON, mage.cards.g.GrapplingSundew.class)); + cards.add(new SetCardInfo("Gravitic Punch", 105, Rarity.COMMON, mage.cards.g.GraviticPunch.class)); cards.add(new SetCardInfo("Gruesome Menagerie", 71, Rarity.RARE, mage.cards.g.GruesomeMenagerie.class)); cards.add(new SetCardInfo("Guild Summit", 41, Rarity.UNCOMMON, mage.cards.g.GuildSummit.class)); + cards.add(new SetCardInfo("Guildmages' Forum", 250, Rarity.RARE, mage.cards.g.GuildmagesForum.class)); cards.add(new SetCardInfo("Haazda Marshal", 13, Rarity.UNCOMMON, mage.cards.h.HaazdaMarshal.class)); cards.add(new SetCardInfo("Hammer Dropper", 176, Rarity.COMMON, mage.cards.h.HammerDropper.class)); cards.add(new SetCardInfo("Hatchery Spider", 132, Rarity.RARE, mage.cards.h.HatcherySpider.class)); @@ -131,24 +152,28 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Hypothesizzle", 178, Rarity.COMMON, mage.cards.h.Hypothesizzle.class)); cards.add(new SetCardInfo("Impervious Greatwurm", 273, Rarity.MYTHIC, mage.cards.i.ImperviousGreatwurm.class)); cards.add(new SetCardInfo("Inescapable Blaze", 107, Rarity.UNCOMMON, mage.cards.i.InescapableBlaze.class)); - cards.add(new SetCardInfo("Integrity // Intervention", 227, Rarity.UNCOMMON, mage.cards.i.IntegrityIntervention.class)); cards.add(new SetCardInfo("Invert // Invent", 228, Rarity.UNCOMMON, mage.cards.i.InvertInvent.class)); cards.add(new SetCardInfo("Inspiring Unicorn", 16, Rarity.UNCOMMON, mage.cards.i.InspiringUnicorn.class)); + cards.add(new SetCardInfo("Integrity // Intervention", 227, Rarity.UNCOMMON, mage.cards.i.IntegrityIntervention.class)); + cards.add(new SetCardInfo("Intrusive Packbeast", 17, Rarity.COMMON, mage.cards.i.IntrusivePackbeast.class)); cards.add(new SetCardInfo("Ionize", 179, Rarity.RARE, mage.cards.i.Ionize.class)); cards.add(new SetCardInfo("Ironshell Beetle", 134, Rarity.COMMON, mage.cards.i.IronshellBeetle.class)); cards.add(new SetCardInfo("Island", 261, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Izoni, Thousand-Eyed", 180, Rarity.RARE, mage.cards.i.IzoniThousandEyed.class)); - cards.add(new SetCardInfo("Izzet Guildgate", 251, Rarity.COMMON, mage.cards.i.IzzetGuildgate.class)); - cards.add(new SetCardInfo("Izzet Guildgate", 252, Rarity.COMMON, mage.cards.i.IzzetGuildgate.class)); + cards.add(new SetCardInfo("Izzet Guildgate", 251, Rarity.COMMON, mage.cards.i.IzzetGuildgate.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Izzet Guildgate", 252, Rarity.COMMON, mage.cards.i.IzzetGuildgate.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Izzet Locket", 238, Rarity.COMMON, mage.cards.i.IzzetLocket.class)); cards.add(new SetCardInfo("Join Shields", 181, Rarity.UNCOMMON, mage.cards.j.JoinShields.class)); cards.add(new SetCardInfo("Justice Strike", 182, Rarity.UNCOMMON, mage.cards.j.JusticeStrike.class)); cards.add(new SetCardInfo("Knight of Autumn", 183, Rarity.RARE, mage.cards.k.KnightOfAutumn.class)); cards.add(new SetCardInfo("Kraul Foragers", 135, Rarity.COMMON, mage.cards.k.KraulForagers.class)); cards.add(new SetCardInfo("Kraul Harpooner", 136, Rarity.UNCOMMON, mage.cards.k.KraulHarpooner.class)); + cards.add(new SetCardInfo("Kraul Raider", 270, Rarity.COMMON, mage.cards.k.KraulRaider.class)); + cards.add(new SetCardInfo("Kraul Swarm", 73, Rarity.UNCOMMON, mage.cards.k.KraulSwarm.class)); cards.add(new SetCardInfo("Lava Coil", 108, Rarity.UNCOMMON, mage.cards.l.LavaCoil.class)); cards.add(new SetCardInfo("Lazav, the Multifarious", 184, Rarity.MYTHIC, mage.cards.l.LazavTheMultifarious.class)); cards.add(new SetCardInfo("League Guildmage", 185, Rarity.UNCOMMON, mage.cards.l.LeagueGuildmage.class)); + cards.add(new SetCardInfo("Leapfrog", 42, Rarity.COMMON, mage.cards.l.Leapfrog.class)); cards.add(new SetCardInfo("Ledev Champion", 186, Rarity.UNCOMMON, mage.cards.l.LedevChampion.class)); cards.add(new SetCardInfo("Ledev Guardian", 18, Rarity.COMMON, mage.cards.l.LedevGuardian.class)); cards.add(new SetCardInfo("Legion Guildmage", 187, Rarity.UNCOMMON, mage.cards.l.LegionGuildmage.class)); @@ -162,9 +187,11 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Mausoleum Secrets", 75, Rarity.RARE, mage.cards.m.MausoleumSecrets.class)); cards.add(new SetCardInfo("Maximize Altitude", 43, Rarity.COMMON, mage.cards.m.MaximizeAltitude.class)); cards.add(new SetCardInfo("Maximize Velocity", 111, Rarity.COMMON, mage.cards.m.MaximizeVelocity.class)); + cards.add(new SetCardInfo("Mephitic Vapors", 76, Rarity.COMMON, mage.cards.m.MephiticVapors.class)); cards.add(new SetCardInfo("Midnight Reaper", 77, Rarity.RARE, mage.cards.m.MidnightReaper.class)); cards.add(new SetCardInfo("Might of the Masses", 137, Rarity.UNCOMMON, mage.cards.m.MightOfTheMasses.class)); cards.add(new SetCardInfo("Mission Briefing", 44, Rarity.RARE, mage.cards.m.MissionBriefing.class)); + cards.add(new SetCardInfo("Mnemonic Betrayal", 189, Rarity.MYTHIC, mage.cards.m.MnemonicBetrayal.class)); cards.add(new SetCardInfo("Molderhulk", 190, Rarity.UNCOMMON, mage.cards.m.Molderhulk.class)); cards.add(new SetCardInfo("Moodmark Painter", 78, Rarity.COMMON, mage.cards.m.MoodmarkPainter.class)); cards.add(new SetCardInfo("Mountain", 263, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); @@ -180,14 +207,20 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Nullhide Ferox", 138, Rarity.MYTHIC, mage.cards.n.NullhideFerox.class)); cards.add(new SetCardInfo("Ochran Assassin", 194, Rarity.UNCOMMON, mage.cards.o.OchranAssassin.class)); cards.add(new SetCardInfo("Omnispell Adept", 49, Rarity.RARE, mage.cards.o.OmnispellAdept.class)); + cards.add(new SetCardInfo("Ornery Goblin", 112, Rarity.COMMON, mage.cards.o.OrneryGoblin.class)); cards.add(new SetCardInfo("Overgrown Tomb", 253, Rarity.RARE, mage.cards.o.OvergrownTomb.class)); cards.add(new SetCardInfo("Pack's Favor", 139, Rarity.COMMON, mage.cards.p.PacksFavor.class)); cards.add(new SetCardInfo("Parhelion Patrol", 22, Rarity.COMMON, mage.cards.p.ParhelionPatrol.class)); cards.add(new SetCardInfo("Passwall Adept", 50, Rarity.COMMON, mage.cards.p.PasswallAdept.class)); cards.add(new SetCardInfo("Pause for Reflection", 140, Rarity.COMMON, mage.cards.p.PauseForReflection.class)); + cards.add(new SetCardInfo("Pelt Collector", 141, Rarity.RARE, mage.cards.p.PeltCollector.class)); + cards.add(new SetCardInfo("Pilfering Imp", 81, Rarity.UNCOMMON, mage.cards.p.PilferingImp.class)); cards.add(new SetCardInfo("Piston-Fist Cyclops", 217, Rarity.COMMON, mage.cards.p.PistonFistCyclops.class)); cards.add(new SetCardInfo("Pitiless Gorgon", 218, Rarity.COMMON, mage.cards.p.PitilessGorgon.class)); + cards.add(new SetCardInfo("Plaguecrafter", 82, Rarity.UNCOMMON, mage.cards.p.Plaguecrafter.class)); cards.add(new SetCardInfo("Plains", 260, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Portcullis Vine", 142, Rarity.COMMON, mage.cards.p.PortcullisVine.class)); + cards.add(new SetCardInfo("Precision Bolt", 267, Rarity.COMMON, mage.cards.p.PrecisionBolt.class)); cards.add(new SetCardInfo("Prey Upon", 143, Rarity.COMMON, mage.cards.p.PreyUpon.class)); cards.add(new SetCardInfo("Price of Fame", 83, Rarity.UNCOMMON, mage.cards.p.PriceOfFame.class)); cards.add(new SetCardInfo("Quasiduplicate", 51, Rarity.RARE, mage.cards.q.Quasiduplicate.class)); @@ -196,6 +229,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Ral's Staticaster", 268, Rarity.UNCOMMON, mage.cards.r.RalsStaticaster.class)); cards.add(new SetCardInfo("Ral, Caller of Storms", 265, Rarity.MYTHIC, mage.cards.r.RalCallerOfStorms.class)); cards.add(new SetCardInfo("Ral, Izzet Viceroy", 195, Rarity.MYTHIC, mage.cards.r.RalIzzetViceroy.class)); + cards.add(new SetCardInfo("Rampaging Monument", 239, Rarity.UNCOMMON, mage.cards.r.RampagingMonument.class)); cards.add(new SetCardInfo("Response // Resurgence", 229, Rarity.RARE, mage.cards.r.ResponseResurgence.class)); cards.add(new SetCardInfo("Rhizome Lurcher", 196, Rarity.COMMON, mage.cards.r.RhizomeLurcher.class)); cards.add(new SetCardInfo("Righteous Blow", 23, Rarity.COMMON, mage.cards.r.RighteousBlow.class)); @@ -206,18 +240,23 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Rubblebelt Boar", 114, Rarity.COMMON, mage.cards.r.RubblebeltBoar.class)); cards.add(new SetCardInfo("Runaway Steam-Kin", 115, Rarity.RARE, mage.cards.r.RunawaySteamKin.class)); cards.add(new SetCardInfo("Sacred Foundry", 254, Rarity.RARE, mage.cards.s.SacredFoundry.class)); - cards.add(new SetCardInfo("Selesnya Guildgate", 255, Rarity.COMMON, mage.cards.s.SelesnyaGuildgate.class)); - cards.add(new SetCardInfo("Selesnya Guildgate", 256, Rarity.COMMON, mage.cards.s.SelesnyaGuildgate.class)); + cards.add(new SetCardInfo("Selective Snare", 53, Rarity.UNCOMMON, mage.cards.s.SelectiveSnare.class)); + cards.add(new SetCardInfo("Selesnya Guildgate", 255, Rarity.COMMON, mage.cards.s.SelesnyaGuildgate.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Selesnya Guildgate", 256, Rarity.COMMON, mage.cards.s.SelesnyaGuildgate.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Selesnya Locket", 240, Rarity.COMMON, mage.cards.s.SelesnyaLocket.class)); + cards.add(new SetCardInfo("Severed Strands", 85, Rarity.COMMON, mage.cards.s.SeveredStrands.class)); cards.add(new SetCardInfo("Siege Wurm", 144, Rarity.COMMON, mage.cards.s.SiegeWurm.class)); cards.add(new SetCardInfo("Silent Dart", 241, Rarity.UNCOMMON, mage.cards.s.SilentDart.class)); cards.add(new SetCardInfo("Sinister Sabotage", 54, Rarity.UNCOMMON, mage.cards.s.SinisterSabotage.class)); cards.add(new SetCardInfo("Skyknight Legionnaire", 198, Rarity.COMMON, mage.cards.s.SkyknightLegionnaire.class)); + cards.add(new SetCardInfo("Skyline Scout", 25, Rarity.COMMON, mage.cards.s.SkylineScout.class)); + cards.add(new SetCardInfo("Smelt-Ward Minotaur", 116, Rarity.UNCOMMON, mage.cards.s.SmeltWardMinotaur.class)); cards.add(new SetCardInfo("Sonic Assault", 199, Rarity.COMMON, mage.cards.s.SonicAssault.class)); cards.add(new SetCardInfo("Spinal Centipede", 86, Rarity.COMMON, mage.cards.s.SpinalCentipede.class)); cards.add(new SetCardInfo("Sprouting Renewal", 145, Rarity.UNCOMMON, mage.cards.s.SproutingRenewal.class)); cards.add(new SetCardInfo("Status // Statue", 230, Rarity.UNCOMMON, mage.cards.s.StatusStatue.class)); cards.add(new SetCardInfo("Steam Vents", 257, Rarity.RARE, mage.cards.s.SteamVents.class)); + cards.add(new SetCardInfo("Street Riot", 117, Rarity.UNCOMMON, mage.cards.s.StreetRiot.class)); cards.add(new SetCardInfo("Sumala Woodshaper", 200, Rarity.COMMON, mage.cards.s.SumalaWoodshaper.class)); cards.add(new SetCardInfo("Sunhome Stalwart", 26, Rarity.UNCOMMON, mage.cards.s.SunhomeStalwart.class)); cards.add(new SetCardInfo("Sure Strike", 118, Rarity.COMMON, mage.cards.s.SureStrike.class)); @@ -227,18 +266,28 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Swiftblade Vindicator", 203, Rarity.RARE, mage.cards.s.SwiftbladeVindicator.class)); cards.add(new SetCardInfo("Sworn Companions", 27, Rarity.COMMON, mage.cards.s.SwornCompanions.class)); cards.add(new SetCardInfo("Tajic, Legion's Edge", 204, Rarity.RARE, mage.cards.t.TajicLegionsEdge.class)); + cards.add(new SetCardInfo("Take Heart", 28, Rarity.COMMON, mage.cards.t.TakeHeart.class)); cards.add(new SetCardInfo("Temple Garden", 258, Rarity.RARE, mage.cards.t.TempleGarden.class)); + cards.add(new SetCardInfo("Tenth District Guard", 29, Rarity.COMMON, mage.cards.t.TenthDistrictGuard.class)); + cards.add(new SetCardInfo("Thief of Sanity", 205, Rarity.RARE, mage.cards.t.ThiefOfSanity.class)); cards.add(new SetCardInfo("Thought Erasure", 206, Rarity.UNCOMMON, mage.cards.t.ThoughtErasure.class)); cards.add(new SetCardInfo("Thoughtbound Phantasm", 55, Rarity.UNCOMMON, mage.cards.t.ThoughtboundPhantasm.class)); + cards.add(new SetCardInfo("Thousand-Year Storm", 207, Rarity.MYTHIC, mage.cards.t.ThousandYearStorm.class)); + cards.add(new SetCardInfo("Torch Courier", 119, Rarity.COMMON, mage.cards.t.TorchCourier.class)); cards.add(new SetCardInfo("Trostani Discordant", 208, Rarity.MYTHIC, mage.cards.t.TrostaniDiscordant.class)); cards.add(new SetCardInfo("Truefire Captain", 209, Rarity.UNCOMMON, mage.cards.t.TruefireCaptain.class)); + cards.add(new SetCardInfo("Undercity Necrolisk", 87, Rarity.UNCOMMON, mage.cards.u.UndercityNecrolisk.class)); cards.add(new SetCardInfo("Undercity Uprising", 210, Rarity.COMMON, mage.cards.u.UndercityUprising.class)); cards.add(new SetCardInfo("Underrealm Lich", 211, Rarity.MYTHIC, mage.cards.u.UnderrealmLich.class)); cards.add(new SetCardInfo("Unexplained Disappearance", 56, Rarity.COMMON, mage.cards.u.UnexplainedDisappearance.class)); + cards.add(new SetCardInfo("Unmoored Ego", 212, Rarity.RARE, mage.cards.u.UnmooredEgo.class)); cards.add(new SetCardInfo("Urban Utopia", 146, Rarity.COMMON, mage.cards.u.UrbanUtopia.class)); + cards.add(new SetCardInfo("Vedalken Mesmerist", 57, Rarity.COMMON, mage.cards.v.VedalkenMesmerist.class)); cards.add(new SetCardInfo("Veiled Shade", 88, Rarity.COMMON, mage.cards.v.VeiledShade.class)); cards.add(new SetCardInfo("Venerated Loxodon", 30, Rarity.RARE, mage.cards.v.VeneratedLoxodon.class)); cards.add(new SetCardInfo("Vernadi Shieldmate", 219, Rarity.COMMON, mage.cards.v.VernadiShieldmate.class)); + cards.add(new SetCardInfo("Vicious Rumors", 89, Rarity.COMMON, mage.cards.v.ViciousRumors.class)); + cards.add(new SetCardInfo("Vigorspore Wurm", 147, Rarity.COMMON, mage.cards.v.VigorsporeWurm.class)); cards.add(new SetCardInfo("Vivid Revival", 148, Rarity.RARE, mage.cards.v.VividRevival.class)); cards.add(new SetCardInfo("Vraska's Stoneglare", 272, Rarity.RARE, mage.cards.v.VraskasStoneglare.class)); cards.add(new SetCardInfo("Vraska, Golgari Queen", 213, Rarity.MYTHIC, mage.cards.v.VraskaGolgariQueen.class)); @@ -256,4 +305,42 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Wojek Bodyguard", 120, Rarity.COMMON, mage.cards.w.WojekBodyguard.class)); cards.add(new SetCardInfo("Worldsoul Colossus", 215, Rarity.UNCOMMON, mage.cards.w.WorldsoulColossus.class)); } -} + + @Override + public List getCardsByRarity(Rarity rarity) { + if (rarity == Rarity.COMMON) { + List savedCardsInfos = savedCards.get(rarity); + if (savedCardsInfos == null) { + CardCriteria criteria = new CardCriteria(); + criteria.setCodes(this.code).notTypes(CardType.LAND); + criteria.rarities(rarity).doubleFaced(false); + savedCardsInfos = CardRepository.instance.findCards(criteria); + if (maxCardNumberInBooster != Integer.MAX_VALUE) { + savedCardsInfos.removeIf(next -> next.getCardNumberAsInt() > maxCardNumberInBooster); + } + criteria = new CardCriteria(); + // Gateway Plaza is a normal common: https://twitter.com/EliShffrn/status/1043156989218414593s + criteria.setCodes(this.code).nameExact("Gateway Plaza"); + savedCardsInfos.addAll(CardRepository.instance.findCards(criteria)); + savedCards.put(rarity, savedCardsInfos); + } + // Return a copy of the saved cards information, as not to modify the original. + return new ArrayList<>(savedCardsInfos); + } else { + return super.getCardsByRarity(rarity); + } + } + + @Override + public List getSpecialCommon() { + List specialCards = getCardsByRarity(Rarity.SPECIAL); + if (specialCards.isEmpty()) { + CardCriteria criteria = new CardCriteria(); + criteria.rarities(Rarity.COMMON).setCodes(this.code).name("Guildgate"); + List specialCardsSave = CardRepository.instance.findCards(criteria); + savedCards.put(Rarity.SPECIAL, specialCardsSave); + specialCards.addAll(specialCardsSave); + } + return specialCards; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnicaGuildKits.java b/Mage.Sets/src/mage/sets/GuildsOfRavnicaGuildKits.java new file mode 100644 index 00000000000..b98dc623af4 --- /dev/null +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnicaGuildKits.java @@ -0,0 +1,152 @@ + +package mage.sets; + +import mage.cards.ExpansionSet; +import mage.constants.Rarity; +import mage.constants.SetType; + +/** + * @author TheElk801 + */ +public final class GuildsOfRavnicaGuildKits extends ExpansionSet { + + private static final GuildsOfRavnicaGuildKits instance = new GuildsOfRavnicaGuildKits(); + + public static GuildsOfRavnicaGuildKits getInstance() { + return instance; + } + + private GuildsOfRavnicaGuildKits() { + super("Guilds of Ravnica Guild Kits", "GK1", ExpansionSet.buildDate(2018, 11, 2), SetType.SUPPLEMENTAL); + this.blockName = "Guild Kits"; + this.hasBasicLands = true; + + cards.add(new SetCardInfo("Abrupt Decay", 57, Rarity.RARE, mage.cards.a.AbruptDecay.class)); + cards.add(new SetCardInfo("Advent of the Wurm", 107, Rarity.RARE, mage.cards.a.AdventOfTheWurm.class)); + cards.add(new SetCardInfo("Agrus Kos, Wojek Veteran", 83, Rarity.RARE, mage.cards.a.AgrusKosWojekVeteran.class)); + cards.add(new SetCardInfo("Armada Wurm", 108, Rarity.MYTHIC, mage.cards.a.ArmadaWurm.class)); + cards.add(new SetCardInfo("Aurelia, the Warleader", 77, Rarity.MYTHIC, mage.cards.a.AureliaTheWarleader.class)); + cards.add(new SetCardInfo("Bomber Corps", 80, Rarity.COMMON, mage.cards.b.BomberCorps.class)); + cards.add(new SetCardInfo("Boros Charm", 84, Rarity.UNCOMMON, mage.cards.b.BorosCharm.class)); + cards.add(new SetCardInfo("Boros Elite", 78, Rarity.UNCOMMON, mage.cards.b.BorosElite.class)); + cards.add(new SetCardInfo("Boros Garrison", 98, Rarity.COMMON, mage.cards.b.BorosGarrison.class)); + cards.add(new SetCardInfo("Boros Keyrune", 96, Rarity.UNCOMMON, mage.cards.b.BorosKeyrune.class)); + cards.add(new SetCardInfo("Boros Reckoner", 85, Rarity.RARE, mage.cards.b.BorosReckoner.class)); + cards.add(new SetCardInfo("Boros Signet", 97, Rarity.COMMON, mage.cards.b.BorosSignet.class)); + cards.add(new SetCardInfo("Boros Swiftblade", 86, Rarity.UNCOMMON, mage.cards.b.BorosSwiftblade.class)); + cards.add(new SetCardInfo("Brightflame", 87, Rarity.RARE, mage.cards.b.Brightflame.class)); + cards.add(new SetCardInfo("Call of the Conclave", 109, Rarity.UNCOMMON, mage.cards.c.CallOfTheConclave.class)); + cards.add(new SetCardInfo("Call of the Nightwing", 8, Rarity.UNCOMMON, mage.cards.c.CallOfTheNightwing.class)); + cards.add(new SetCardInfo("Centaur Healer", 110, Rarity.COMMON, mage.cards.c.CentaurHealer.class)); + cards.add(new SetCardInfo("Cerebral Vortex", 35, Rarity.RARE, mage.cards.c.CerebralVortex.class)); + cards.add(new SetCardInfo("Char", 28, Rarity.RARE, mage.cards.c.Char.class)); + cards.add(new SetCardInfo("Circu, Dimir Lobotomist", 9, Rarity.RARE, mage.cards.c.CircuDimirLobotomist.class)); + cards.add(new SetCardInfo("Consuming Aberration", 10, Rarity.RARE, mage.cards.c.ConsumingAberration.class)); + cards.add(new SetCardInfo("Daring Skyjek", 79, Rarity.COMMON, mage.cards.d.DaringSkyjek.class)); + cards.add(new SetCardInfo("Darkblast", 51, Rarity.UNCOMMON, mage.cards.d.Darkblast.class)); + cards.add(new SetCardInfo("Deadbridge Chant", 58, Rarity.MYTHIC, mage.cards.d.DeadbridgeChant.class)); + cards.add(new SetCardInfo("Deadbridge Goliath", 55, Rarity.RARE, mage.cards.d.DeadbridgeGoliath.class)); + cards.add(new SetCardInfo("Deathrite Shaman", 59, Rarity.RARE, mage.cards.d.DeathriteShaman.class)); + cards.add(new SetCardInfo("Devouring Light", 103, Rarity.UNCOMMON, mage.cards.d.DevouringLight.class)); + cards.add(new SetCardInfo("Dimir Aqueduct", 23, Rarity.COMMON, mage.cards.d.DimirAqueduct.class)); + cards.add(new SetCardInfo("Dimir Charm", 11, Rarity.UNCOMMON, mage.cards.d.DimirCharm.class)); + cards.add(new SetCardInfo("Dimir Doppelganger", 12, Rarity.RARE, mage.cards.d.DimirDoppelganger.class)); + cards.add(new SetCardInfo("Dimir Guildmage", 13, Rarity.UNCOMMON, mage.cards.d.DimirGuildmage.class)); + cards.add(new SetCardInfo("Dimir Signet", 22, Rarity.COMMON, mage.cards.d.DimirSignet.class)); + cards.add(new SetCardInfo("Dinrova Horror", 14, Rarity.UNCOMMON, mage.cards.d.DinrovaHorror.class)); + cards.add(new SetCardInfo("Djinn Illuminatus", 36, Rarity.RARE, mage.cards.d.DjinnIlluminatus.class)); + cards.add(new SetCardInfo("Drown in Filth", 60, Rarity.COMMON, mage.cards.d.DrownInFilth.class)); + cards.add(new SetCardInfo("Dryad Militant", 111, Rarity.UNCOMMON, mage.cards.d.DryadMilitant.class)); + cards.add(new SetCardInfo("Electrickery", 29, Rarity.COMMON, mage.cards.e.Electrickery.class)); + cards.add(new SetCardInfo("Electrolyze", 37, Rarity.UNCOMMON, mage.cards.e.Electrolyze.class)); + cards.add(new SetCardInfo("Elves of Deep Shadow", 56, Rarity.COMMON, mage.cards.e.ElvesOfDeepShadow.class)); + cards.add(new SetCardInfo("Etrata, the Silencer", 1, Rarity.RARE, mage.cards.e.EtrataTheSilencer.class)); + cards.add(new SetCardInfo("Firemane Angel", 88, Rarity.RARE, mage.cards.f.FiremaneAngel.class)); + cards.add(new SetCardInfo("Firemane Avenger", 89, Rarity.RARE, mage.cards.f.FiremaneAvenger.class)); + cards.add(new SetCardInfo("Forest", 76, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Forest", 127, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Frenzied Goblin", 81, Rarity.UNCOMMON, mage.cards.f.FrenziedGoblin.class)); + cards.add(new SetCardInfo("Gather Courage", 105, Rarity.COMMON, mage.cards.g.GatherCourage.class)); + cards.add(new SetCardInfo("Gaze of Granite", 61, Rarity.RARE, mage.cards.g.GazeOfGranite.class)); + cards.add(new SetCardInfo("Gelectrode", 38, Rarity.UNCOMMON, mage.cards.g.Gelectrode.class)); + cards.add(new SetCardInfo("Glare of Subdual", 112, Rarity.RARE, mage.cards.g.GlareOfSubdual.class)); + cards.add(new SetCardInfo("Glimpse the Unthinkable", 15, Rarity.RARE, mage.cards.g.GlimpseTheUnthinkable.class)); + cards.add(new SetCardInfo("Goblin Rally", 30, Rarity.UNCOMMON, mage.cards.g.GoblinRally.class)); + cards.add(new SetCardInfo("Golgari Charm", 62, Rarity.UNCOMMON, mage.cards.g.GolgariCharm.class)); + cards.add(new SetCardInfo("Golgari Rot Farm", 74, Rarity.COMMON, mage.cards.g.GolgariRotFarm.class)); + cards.add(new SetCardInfo("Golgari Signet", 73, Rarity.COMMON, mage.cards.g.GolgariSignet.class)); + cards.add(new SetCardInfo("Grave-Shell Scarab", 63, Rarity.RARE, mage.cards.g.GraveShellScarab.class)); + cards.add(new SetCardInfo("Grisly Salvage", 64, Rarity.COMMON, mage.cards.g.GrislySalvage.class)); + cards.add(new SetCardInfo("Grove of the Guardian", 124, Rarity.RARE, mage.cards.g.GroveOfTheGuardian.class)); + cards.add(new SetCardInfo("Growing Ranks", 113, Rarity.RARE, mage.cards.g.GrowingRanks.class)); + cards.add(new SetCardInfo("Guttersnipe", 31, Rarity.UNCOMMON, mage.cards.g.Guttersnipe.class)); + cards.add(new SetCardInfo("Hour of Reckoning", 104, Rarity.RARE, mage.cards.h.HourOfReckoning.class)); + cards.add(new SetCardInfo("Hypersonic Dragon", 39, Rarity.RARE, mage.cards.h.HypersonicDragon.class)); + cards.add(new SetCardInfo("Invoke the Firemind", 40, Rarity.RARE, mage.cards.i.InvokeTheFiremind.class)); + cards.add(new SetCardInfo("Island", 24, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Island", 48, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Izoni, Thousand-Eyed", 50, Rarity.RARE, mage.cards.i.IzoniThousandEyed.class)); + cards.add(new SetCardInfo("Izzet Boilerworks", 47, Rarity.COMMON, mage.cards.i.IzzetBoilerworks.class)); + cards.add(new SetCardInfo("Izzet Charm", 41, Rarity.UNCOMMON, mage.cards.i.IzzetCharm.class)); + cards.add(new SetCardInfo("Izzet Signet", 46, Rarity.COMMON, mage.cards.i.IzzetSignet.class)); + cards.add(new SetCardInfo("Jarad, Golgari Lich Lord", 65, Rarity.MYTHIC, mage.cards.j.JaradGolgariLichLord.class)); + cards.add(new SetCardInfo("Korozda Guildmage", 66, Rarity.UNCOMMON, mage.cards.k.KorozdaGuildmage.class)); + cards.add(new SetCardInfo("Last Gasp", 5, Rarity.COMMON, mage.cards.l.LastGasp.class)); + cards.add(new SetCardInfo("Lazav, Dimir Mastermind", 16, Rarity.MYTHIC, mage.cards.l.LazavDimirMastermind.class)); + cards.add(new SetCardInfo("Legion Loyalist", 82, Rarity.RARE, mage.cards.l.LegionLoyalist.class)); + cards.add(new SetCardInfo("Lightning Helix", 90, Rarity.UNCOMMON, mage.cards.l.LightningHelix.class)); + cards.add(new SetCardInfo("Lotleth Troll", 67, Rarity.RARE, mage.cards.l.LotlethTroll.class)); + cards.add(new SetCardInfo("Loxodon Hierarch", 114, Rarity.RARE, mage.cards.l.LoxodonHierarch.class)); + cards.add(new SetCardInfo("Martial Glory", 91, Rarity.COMMON, mage.cards.m.MartialGlory.class)); + cards.add(new SetCardInfo("Master Warcraft", 92, Rarity.RARE, mage.cards.m.MasterWarcraft.class)); + cards.add(new SetCardInfo("Mirko Vosk, Mind Drinker", 17, Rarity.RARE, mage.cards.m.MirkoVoskMindDrinker.class)); + cards.add(new SetCardInfo("Mizzium Mortars", 32, Rarity.RARE, mage.cards.m.MizziumMortars.class)); + cards.add(new SetCardInfo("Moroii", 18, Rarity.UNCOMMON, mage.cards.m.Moroii.class)); + cards.add(new SetCardInfo("Mountain", 49, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mountain", 101, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Netherborn Phalanx", 6, Rarity.UNCOMMON, mage.cards.n.NetherbornPhalanx.class)); + cards.add(new SetCardInfo("Nightveil Specter", 19, Rarity.RARE, mage.cards.n.NightveilSpecter.class)); + cards.add(new SetCardInfo("Niv-Mizzet, the Firemind", 26, Rarity.RARE, mage.cards.n.NivMizzetTheFiremind.class)); + cards.add(new SetCardInfo("Nivix Guildmage", 42, Rarity.UNCOMMON, mage.cards.n.NivixGuildmage.class)); + cards.add(new SetCardInfo("Plains", 100, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Plains", 126, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Pollenbright Wings", 115, Rarity.UNCOMMON, mage.cards.p.PollenbrightWings.class)); + cards.add(new SetCardInfo("Privileged Position", 116, Rarity.RARE, mage.cards.p.PrivilegedPosition.class)); + cards.add(new SetCardInfo("Putrefy", 68, Rarity.UNCOMMON, mage.cards.p.Putrefy.class)); + cards.add(new SetCardInfo("Pyromatics", 33, Rarity.COMMON, mage.cards.p.Pyromatics.class)); + cards.add(new SetCardInfo("Razia, Boros Archangel", 93, Rarity.RARE, mage.cards.r.RaziaBorosArchangel.class)); + cards.add(new SetCardInfo("Ribbons of Night", 7, Rarity.UNCOMMON, mage.cards.r.RibbonsOfNight.class)); + cards.add(new SetCardInfo("Savra, Queen of the Golgari", 69, Rarity.RARE, mage.cards.s.SavraQueenOfTheGolgari.class)); + cards.add(new SetCardInfo("Scatter the Seeds", 106, Rarity.COMMON, mage.cards.s.ScatterTheSeeds.class)); + cards.add(new SetCardInfo("Selesnya Charm", 117, Rarity.UNCOMMON, mage.cards.s.SelesnyaCharm.class)); + cards.add(new SetCardInfo("Selesnya Evangel", 118, Rarity.COMMON, mage.cards.s.SelesnyaEvangel.class)); + cards.add(new SetCardInfo("Selesnya Guildmage", 119, Rarity.UNCOMMON, mage.cards.s.SelesnyaGuildmage.class)); + cards.add(new SetCardInfo("Selesnya Sanctuary", 125, Rarity.COMMON, mage.cards.s.SelesnyaSanctuary.class)); + cards.add(new SetCardInfo("Selesnya Signet", 123, Rarity.COMMON, mage.cards.s.SelesnyaSignet.class)); + cards.add(new SetCardInfo("Shambling Shell", 70, Rarity.COMMON, mage.cards.s.ShamblingShell.class)); + cards.add(new SetCardInfo("Shattering Spree", 34, Rarity.UNCOMMON, mage.cards.s.ShatteringSpree.class)); + cards.add(new SetCardInfo("Sisters of Stone Death", 71, Rarity.RARE, mage.cards.s.SistersOfStoneDeath.class)); + cards.add(new SetCardInfo("Slum Reaper", 52, Rarity.UNCOMMON, mage.cards.s.SlumReaper.class)); + cards.add(new SetCardInfo("Spark Trooper", 94, Rarity.RARE, mage.cards.s.SparkTrooper.class)); + cards.add(new SetCardInfo("Stinkweed Imp", 53, Rarity.COMMON, mage.cards.s.StinkweedImp.class)); + cards.add(new SetCardInfo("Stitch in Time", 43, Rarity.RARE, mage.cards.s.StitchInTime.class)); + cards.add(new SetCardInfo("Stolen Identity", 2, Rarity.RARE, mage.cards.s.StolenIdentity.class)); + cards.add(new SetCardInfo("Sundering Growth", 120, Rarity.COMMON, mage.cards.s.SunderingGrowth.class)); + cards.add(new SetCardInfo("Sunhome Guildmage", 95, Rarity.UNCOMMON, mage.cards.s.SunhomeGuildmage.class)); + cards.add(new SetCardInfo("Sunhome, Fortress of the Legion", 99, Rarity.UNCOMMON, mage.cards.s.SunhomeFortressOfTheLegion.class)); + cards.add(new SetCardInfo("Swamp", 25, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Swamp", 75, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Syncopate", 3, Rarity.UNCOMMON, mage.cards.s.Syncopate.class)); + cards.add(new SetCardInfo("Szadek, Lord of Secrets", 20, Rarity.RARE, mage.cards.s.SzadekLordOfSecrets.class)); + cards.add(new SetCardInfo("Telling Time", 4, Rarity.UNCOMMON, mage.cards.t.TellingTime.class)); + cards.add(new SetCardInfo("Thunderheads", 27, Rarity.UNCOMMON, mage.cards.t.Thunderheads.class)); + cards.add(new SetCardInfo("Tibor and Lumia", 44, Rarity.RARE, mage.cards.t.TiborAndLumia.class)); + cards.add(new SetCardInfo("Tolsimir Wolfblood", 121, Rarity.RARE, mage.cards.t.TolsimirWolfblood.class)); + cards.add(new SetCardInfo("Treasured Find", 72, Rarity.UNCOMMON, mage.cards.t.TreasuredFind.class)); + cards.add(new SetCardInfo("Trostani, Selesnya's Voice", 102, Rarity.MYTHIC, mage.cards.t.TrostaniSelesnyasVoice.class)); + cards.add(new SetCardInfo("Turn // Burn", 45, Rarity.UNCOMMON, mage.cards.t.TurnBurn.class)); + cards.add(new SetCardInfo("Vigor Mortis", 54, Rarity.UNCOMMON, mage.cards.v.VigorMortis.class)); + cards.add(new SetCardInfo("Warped Physique", 21, Rarity.UNCOMMON, mage.cards.w.WarpedPhysique.class)); + cards.add(new SetCardInfo("Watchwolf", 122, Rarity.UNCOMMON, mage.cards.w.Watchwolf.class)); + } +} diff --git a/Mage.Sets/src/mage/sets/HasconPromo2017.java b/Mage.Sets/src/mage/sets/HASCONPromo2017.java similarity index 74% rename from Mage.Sets/src/mage/sets/HasconPromo2017.java rename to Mage.Sets/src/mage/sets/HASCONPromo2017.java index d31b579ef81..be06cda1e15 100644 --- a/Mage.Sets/src/mage/sets/HasconPromo2017.java +++ b/Mage.Sets/src/mage/sets/HASCONPromo2017.java @@ -6,19 +6,20 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author Saga */ -public final class HasconPromo2017 extends ExpansionSet { +public final class HASCONPromo2017 extends ExpansionSet { - private static final HasconPromo2017 instance = new HasconPromo2017(); + private static final HASCONPromo2017 instance = new HASCONPromo2017(); - public static HasconPromo2017 getInstance() { + public static HASCONPromo2017 getInstance() { return instance; } - private HasconPromo2017() { + private HASCONPromo2017() { super("HASCON Promo 2017", "H17", ExpansionSet.buildDate(2017, 9, 8), SetType.JOKESET); + this.hasBasicLands = false; + cards.add(new ExpansionSet.SetCardInfo("Grimlock, Dinobot Leader", "1a", Rarity.MYTHIC, mage.cards.g.GrimlockDinobotLeader.class)); cards.add(new ExpansionSet.SetCardInfo("Grimlock, Ferocious King", "1b", Rarity.MYTHIC, mage.cards.g.GrimlockFerociousKing.class)); cards.add(new ExpansionSet.SetCardInfo("Sword of Dungeons & Dragons", 3, Rarity.MYTHIC, mage.cards.s.SwordOfDungeonsAndDragons.class)); diff --git a/Mage.Sets/src/mage/sets/HappyHolidays.java b/Mage.Sets/src/mage/sets/HappyHolidays.java index 5f335b3e996..43c27e50c75 100644 --- a/Mage.Sets/src/mage/sets/HappyHolidays.java +++ b/Mage.Sets/src/mage/sets/HappyHolidays.java @@ -5,7 +5,6 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author spjspj */ public final class HappyHolidays extends ExpansionSet { @@ -18,6 +17,7 @@ public final class HappyHolidays extends ExpansionSet { private HappyHolidays() { super("Happy Holidays", "HHO", ExpansionSet.buildDate(2006, 12, 31), SetType.JOKESET); + this.hasBasicLands = false; cards.add(new SetCardInfo("Fruitcake Elemental", 6, Rarity.RARE, mage.cards.f.FruitcakeElemental.class)); cards.add(new SetCardInfo("Season's Beatings", 9, Rarity.RARE, mage.cards.s.SeasonsBeatings.class)); diff --git a/Mage.Sets/src/mage/sets/Homelands.java b/Mage.Sets/src/mage/sets/Homelands.java index 52e35f67724..cc54407c643 100644 --- a/Mage.Sets/src/mage/sets/Homelands.java +++ b/Mage.Sets/src/mage/sets/Homelands.java @@ -1,23 +1,10 @@ package mage.sets; import mage.cards.ExpansionSet; -import mage.cards.a.AbbeyMatron; -import mage.cards.a.AlibansTower; -import mage.cards.c.CemeteryGate; -import mage.cards.d.DrySpell; -import mage.cards.d.DwarvenTrader; -import mage.cards.f.FeastOfTheUnicorn; -import mage.cards.f.FolkOfAnHavva; -import mage.cards.m.MesaFalcon; -import mage.cards.r.ReefPirates; -import mage.cards.s.SengirBats; -import mage.cards.t.Torture; -import mage.cards.w.WillowFaerie; import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author North */ public final class Homelands extends ExpansionSet { @@ -37,12 +24,13 @@ public final class Homelands extends ExpansionSet { this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; + cards.add(new SetCardInfo("Abbey Gargoyles", 1, Rarity.UNCOMMON, mage.cards.a.AbbeyGargoyles.class)); - cards.add(new SetCardInfo("Abbey Matron", "2a", Rarity.COMMON, AbbeyMatron.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Abbey Matron", "2b", Rarity.COMMON, AbbeyMatron.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Abbey Matron", "2a", Rarity.COMMON, mage.cards.a.AbbeyMatron.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Abbey Matron", "2b", Rarity.COMMON, mage.cards.a.AbbeyMatron.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Aether Storm", 21, Rarity.UNCOMMON, mage.cards.a.AetherStorm.class)); - cards.add(new SetCardInfo("Aliban's Tower", "61a", Rarity.COMMON, AlibansTower.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Aliban's Tower", "61b", Rarity.COMMON, AlibansTower.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Aliban's Tower", "61a", Rarity.COMMON, mage.cards.a.AlibansTower.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Aliban's Tower", "61b", Rarity.COMMON, mage.cards.a.AlibansTower.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Ambush Party", "63a", Rarity.COMMON, mage.cards.a.AmbushParty.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Ambush Party", "63b", Rarity.COMMON, mage.cards.a.AmbushParty.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Ambush", 62, Rarity.COMMON, mage.cards.a.Ambush.class)); @@ -71,12 +59,12 @@ public final class Homelands extends ExpansionSet { cards.add(new SetCardInfo("Carapace", "84a", Rarity.COMMON, mage.cards.c.Carapace.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Carapace", "84b", Rarity.COMMON, mage.cards.c.Carapace.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Castle Sengir", 113, Rarity.UNCOMMON, mage.cards.c.CastleSengir.class)); - cards.add(new SetCardInfo("Cemetery Gate", "44a", Rarity.COMMON, CemeteryGate.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Cemetery Gate", "44b", Rarity.COMMON, CemeteryGate.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Cemetery Gate", "44a", Rarity.COMMON, mage.cards.c.CemeteryGate.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Cemetery Gate", "44b", Rarity.COMMON, mage.cards.c.CemeteryGate.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Chain Stasis", 23, Rarity.RARE, mage.cards.c.ChainStasis.class)); cards.add(new SetCardInfo("Chandler", 69, Rarity.COMMON, mage.cards.c.Chandler.class)); cards.add(new SetCardInfo("Clockwork Gnomes", 102, Rarity.COMMON, mage.cards.c.ClockworkGnomes.class)); - cards.add(new SetCardInfo("Clockwork Steed", 103, Rarity.UNCOMMON, mage.cards.c.ClockworkSteed.class)); + cards.add(new SetCardInfo("Clockwork Steed", 103, Rarity.COMMON, mage.cards.c.ClockworkSteed.class)); cards.add(new SetCardInfo("Clockwork Swarm", 104, Rarity.COMMON, mage.cards.c.ClockworkSwarm.class)); cards.add(new SetCardInfo("Coral Reef", 24, Rarity.COMMON, mage.cards.c.CoralReef.class)); cards.add(new SetCardInfo("Dark Maze", "25a", Rarity.COMMON, mage.cards.d.DarkMaze.class, NON_FULL_USE_VARIOUS)); @@ -85,29 +73,29 @@ public final class Homelands extends ExpansionSet { cards.add(new SetCardInfo("Death Speakers", 7, Rarity.UNCOMMON, mage.cards.d.DeathSpeakers.class)); cards.add(new SetCardInfo("Didgeridoo", 105, Rarity.RARE, mage.cards.d.Didgeridoo.class)); cards.add(new SetCardInfo("Drudge Spell", 45, Rarity.UNCOMMON, mage.cards.d.DrudgeSpell.class)); - cards.add(new SetCardInfo("Dry Spell", "46a", Rarity.COMMON, DrySpell.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Dry Spell", "46b", Rarity.COMMON, DrySpell.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Dry Spell", "46a", Rarity.COMMON, mage.cards.d.DrySpell.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Dry Spell", "46b", Rarity.COMMON, mage.cards.d.DrySpell.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Dwarven Pony", 70, Rarity.RARE, mage.cards.d.DwarvenPony.class)); cards.add(new SetCardInfo("Dwarven Sea Clan", 71, Rarity.RARE, mage.cards.d.DwarvenSeaClan.class)); - cards.add(new SetCardInfo("Dwarven Trader", "72a", Rarity.COMMON, DwarvenTrader.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Dwarven Trader", "72b", Rarity.COMMON, DwarvenTrader.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Dwarven Trader", "72a", Rarity.COMMON, mage.cards.d.DwarvenTrader.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Dwarven Trader", "72b", Rarity.COMMON, mage.cards.d.DwarvenTrader.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Ebony Rhino", 106, Rarity.COMMON, mage.cards.e.EbonyRhino.class)); cards.add(new SetCardInfo("Eron the Relentless", 73, Rarity.UNCOMMON, mage.cards.e.EronTheRelentless.class)); cards.add(new SetCardInfo("Evaporate", 74, Rarity.UNCOMMON, mage.cards.e.Evaporate.class)); cards.add(new SetCardInfo("Faerie Noble", 86, Rarity.RARE, mage.cards.f.FaerieNoble.class)); - cards.add(new SetCardInfo("Feast of the Unicorn", "47a", Rarity.COMMON, FeastOfTheUnicorn.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Feast of the Unicorn", "47b", Rarity.COMMON, FeastOfTheUnicorn.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Feast of the Unicorn", "47a", Rarity.COMMON, mage.cards.f.FeastOfTheUnicorn.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Feast of the Unicorn", "47b", Rarity.COMMON, mage.cards.f.FeastOfTheUnicorn.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Feroz's Ban", 107, Rarity.RARE, mage.cards.f.FerozsBan.class)); - cards.add(new SetCardInfo("Folk of An-Havva", "87a", Rarity.COMMON, FolkOfAnHavva.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Folk of An-Havva", "87b", Rarity.COMMON, FolkOfAnHavva.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Folk of An-Havva", "87a", Rarity.COMMON, mage.cards.f.FolkOfAnHavva.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Folk of An-Havva", "87b", Rarity.COMMON, mage.cards.f.FolkOfAnHavva.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Forget", 26, Rarity.RARE, mage.cards.f.Forget.class)); - cards.add(new SetCardInfo("Funeral March", 48, Rarity.UNCOMMON, mage.cards.f.FuneralMarch.class)); + cards.add(new SetCardInfo("Funeral March", 48, Rarity.COMMON, mage.cards.f.FuneralMarch.class)); cards.add(new SetCardInfo("Ghost Hounds", 49, Rarity.UNCOMMON, mage.cards.g.GhostHounds.class)); cards.add(new SetCardInfo("Giant Oyster", 28, Rarity.UNCOMMON, mage.cards.g.GiantOyster.class)); cards.add(new SetCardInfo("Giant Albatross", "27a", Rarity.COMMON, mage.cards.g.GiantAlbatross.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Giant Albatross", "27b", Rarity.COMMON, mage.cards.g.GiantAlbatross.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Grandmother Sengir", 50, Rarity.RARE, mage.cards.g.GrandmotherSengir.class)); - cards.add(new SetCardInfo("Greater Werewolf", 51, Rarity.UNCOMMON, mage.cards.g.GreaterWerewolf.class)); + cards.add(new SetCardInfo("Greater Werewolf", 51, Rarity.COMMON, mage.cards.g.GreaterWerewolf.class)); cards.add(new SetCardInfo("Hazduhr the Abbot", 8, Rarity.RARE, mage.cards.h.HazduhrTheAbbot.class)); cards.add(new SetCardInfo("Headstone", 52, Rarity.COMMON, mage.cards.h.Headstone.class)); cards.add(new SetCardInfo("Heart Wolf", 75, Rarity.RARE, mage.cards.h.HeartWolf.class)); @@ -122,7 +110,8 @@ public final class Homelands extends ExpansionSet { cards.add(new SetCardInfo("Joven's Tools", 108, Rarity.UNCOMMON, mage.cards.j.JovensTools.class)); cards.add(new SetCardInfo("Koskun Falls", 55, Rarity.RARE, mage.cards.k.KoskunFalls.class)); cards.add(new SetCardInfo("Koskun Keep", 114, Rarity.UNCOMMON, mage.cards.k.KoskunKeep.class)); - cards.add(new SetCardInfo("Labyrinth Minotaur", "30a", Rarity.COMMON, mage.cards.l.LabyrinthMinotaur.class)); + cards.add(new SetCardInfo("Labyrinth Minotaur", "30a", Rarity.COMMON, mage.cards.l.LabyrinthMinotaur.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Labyrinth Minotaur", "30b", Rarity.COMMON, mage.cards.l.LabyrinthMinotaur.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Leaping Lizard", 90, Rarity.COMMON, mage.cards.l.LeapingLizard.class)); cards.add(new SetCardInfo("Leeches", 9, Rarity.RARE, mage.cards.l.Leeches.class)); cards.add(new SetCardInfo("Mammoth Harness", 91, Rarity.RARE, mage.cards.m.MammothHarness.class)); @@ -130,16 +119,16 @@ public final class Homelands extends ExpansionSet { cards.add(new SetCardInfo("Memory Lapse", "32a", Rarity.COMMON, mage.cards.m.MemoryLapse.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Memory Lapse", "32b", Rarity.COMMON, mage.cards.m.MemoryLapse.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Merchant Scroll", 33, Rarity.COMMON, mage.cards.m.MerchantScroll.class)); - cards.add(new SetCardInfo("Mesa Falcon", "10a", Rarity.COMMON, MesaFalcon.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mesa Falcon", "10b", Rarity.COMMON, MesaFalcon.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mesa Falcon", "10a", Rarity.COMMON, mage.cards.m.MesaFalcon.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mesa Falcon", "10b", Rarity.COMMON, mage.cards.m.MesaFalcon.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Mystic Decree", 34, Rarity.RARE, mage.cards.m.MysticDecree.class)); cards.add(new SetCardInfo("Narwhal", 35, Rarity.RARE, mage.cards.n.Narwhal.class)); cards.add(new SetCardInfo("Orcish Mine", 78, Rarity.UNCOMMON, mage.cards.o.OrcishMine.class)); cards.add(new SetCardInfo("Primal Order", 92, Rarity.RARE, mage.cards.p.PrimalOrder.class)); cards.add(new SetCardInfo("Prophecy", 11, Rarity.COMMON, mage.cards.p.Prophecy.class)); - cards.add(new SetCardInfo("Rashka the Slayer", 12, Rarity.RARE, mage.cards.r.RashkaTheSlayer.class)); - cards.add(new SetCardInfo("Reef Pirates", "36a", Rarity.COMMON, ReefPirates.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Reef Pirates", "36b", Rarity.COMMON, ReefPirates.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Rashka the Slayer", 12, Rarity.UNCOMMON, mage.cards.r.RashkaTheSlayer.class)); + cards.add(new SetCardInfo("Reef Pirates", "36a", Rarity.COMMON, mage.cards.r.ReefPirates.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Reef Pirates", "36b", Rarity.COMMON, mage.cards.r.ReefPirates.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Renewal", 93, Rarity.COMMON, mage.cards.r.Renewal.class)); cards.add(new SetCardInfo("Retribution", 79, Rarity.UNCOMMON, mage.cards.r.Retribution.class)); cards.add(new SetCardInfo("Reveka, Wizard Savant", 37, Rarity.RARE, mage.cards.r.RevekaWizardSavant.class)); @@ -151,10 +140,10 @@ public final class Homelands extends ExpansionSet { cards.add(new SetCardInfo("Sea Sprite", 38, Rarity.UNCOMMON, mage.cards.s.SeaSprite.class)); cards.add(new SetCardInfo("Sea Troll", 39, Rarity.UNCOMMON, mage.cards.s.SeaTroll.class)); cards.add(new SetCardInfo("Sengir Autocrat", 56, Rarity.UNCOMMON, mage.cards.s.SengirAutocrat.class)); - cards.add(new SetCardInfo("Sengir Bats", "57a", Rarity.COMMON, SengirBats.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Sengir Bats", "57b", Rarity.COMMON, SengirBats.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Sengir Bats", "57a", Rarity.COMMON, mage.cards.s.SengirBats.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Sengir Bats", "57b", Rarity.COMMON, mage.cards.s.SengirBats.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Serra Aviary", 14, Rarity.RARE, mage.cards.s.SerraAviary.class)); - cards.add(new SetCardInfo("Serra Bestiary", 15, Rarity.UNCOMMON, mage.cards.s.SerraBestiary.class)); + cards.add(new SetCardInfo("Serra Bestiary", 15, Rarity.COMMON, mage.cards.s.SerraBestiary.class)); cards.add(new SetCardInfo("Serra Inquisitors", 16, Rarity.UNCOMMON, mage.cards.s.SerraInquisitors.class)); cards.add(new SetCardInfo("Serra Paladin", 17, Rarity.COMMON, mage.cards.s.SerraPaladin.class)); cards.add(new SetCardInfo("Serrated Arrows", 110, Rarity.COMMON, mage.cards.s.SerratedArrows.class)); @@ -162,17 +151,17 @@ public final class Homelands extends ExpansionSet { cards.add(new SetCardInfo("Shrink", "97b", Rarity.COMMON, mage.cards.s.Shrink.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Soraya the Falconer", 18, Rarity.RARE, mage.cards.s.SorayaTheFalconer.class)); cards.add(new SetCardInfo("Spectral Bears", 98, Rarity.UNCOMMON, mage.cards.s.SpectralBears.class)); - cards.add(new SetCardInfo("Torture", "59a", Rarity.COMMON, Torture.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Torture", "59b", Rarity.COMMON, Torture.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Torture", "59a", Rarity.COMMON, mage.cards.t.Torture.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Torture", "59b", Rarity.COMMON, mage.cards.t.Torture.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Trade Caravan", "19a", Rarity.COMMON, mage.cards.t.TradeCaravan.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Trade Caravan", "19b", Rarity.COMMON, mage.cards.t.TradeCaravan.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Truce", 20, Rarity.RARE, mage.cards.t.Truce.class)); cards.add(new SetCardInfo("Veldrane of Sengir", 60, Rarity.RARE, mage.cards.v.VeldraneOfSengir.class)); cards.add(new SetCardInfo("Wall of Kelp", 40, Rarity.RARE, mage.cards.w.WallOfKelp.class)); - cards.add(new SetCardInfo("Willow Faerie", "99a", Rarity.COMMON, WillowFaerie.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Willow Faerie", "99b", Rarity.COMMON, WillowFaerie.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Willow Faerie", "99a", Rarity.COMMON, mage.cards.w.WillowFaerie.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Willow Faerie", "99b", Rarity.COMMON, mage.cards.w.WillowFaerie.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Willow Priestess", 100, Rarity.RARE, mage.cards.w.WillowPriestess.class)); cards.add(new SetCardInfo("Winter Sky", 80, Rarity.RARE, mage.cards.w.WinterSky.class)); cards.add(new SetCardInfo("Wizards' School", 115, Rarity.UNCOMMON, mage.cards.w.WizardsSchool.class)); } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 24388aa9673..674806cd548 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -101,8 +101,8 @@ public final class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Fervent Paincaster", 91, Rarity.UNCOMMON, mage.cards.f.FerventPaincaster.class)); cards.add(new SetCardInfo("Firebrand Archer", 92, Rarity.COMMON, mage.cards.f.FirebrandArcher.class)); cards.add(new SetCardInfo("Forest", 189, Rarity.LAND, mage.cards.basiclands.Forest.class, FULL_ART_BFZ_VARIOUS)); - cards.add(new SetCardInfo("Forest", 198, Rarity.LAND, mage.cards.basiclands.Forest.class)); - cards.add(new SetCardInfo("Forest", 199, Rarity.LAND, mage.cards.basiclands.Forest.class)); + cards.add(new SetCardInfo("Forest", 198, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Forest", 199, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Fraying Sanity", 35, Rarity.RARE, mage.cards.f.FrayingSanity.class)); cards.add(new SetCardInfo("Frilled Sandwalla", 116, Rarity.COMMON, mage.cards.f.FrilledSandwalla.class)); cards.add(new SetCardInfo("Frontline Devastator", 93, Rarity.COMMON, mage.cards.f.FrontlineDevastator.class)); @@ -132,8 +132,8 @@ public final class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Inferno Jet", 99, Rarity.UNCOMMON, mage.cards.i.InfernoJet.class)); cards.add(new SetCardInfo("Ipnu Rivulet", 180, Rarity.UNCOMMON, mage.cards.i.IpnuRivulet.class)); cards.add(new SetCardInfo("Island", 186, Rarity.LAND, mage.cards.basiclands.Island.class, FULL_ART_BFZ_VARIOUS)); - cards.add(new SetCardInfo("Island", 192, Rarity.LAND, mage.cards.basiclands.Island.class)); - cards.add(new SetCardInfo("Island", 193, Rarity.LAND, mage.cards.basiclands.Island.class)); + cards.add(new SetCardInfo("Island", 192, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Island", 193, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Jace's Defeat", 38, Rarity.UNCOMMON, mage.cards.j.JacesDefeat.class)); cards.add(new SetCardInfo("Kefnet's Last Word", 39, Rarity.RARE, mage.cards.k.KefnetsLastWord.class)); cards.add(new SetCardInfo("Khenra Eternal", 66, Rarity.COMMON, mage.cards.k.KhenraEternal.class)); @@ -153,8 +153,8 @@ public final class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Mirage Mirror", 165, Rarity.RARE, mage.cards.m.MirageMirror.class)); cards.add(new SetCardInfo("Moaning Wall", 72, Rarity.COMMON, mage.cards.m.MoaningWall.class)); cards.add(new SetCardInfo("Mountain", 188, Rarity.LAND, mage.cards.basiclands.Mountain.class, FULL_ART_BFZ_VARIOUS)); - cards.add(new SetCardInfo("Mountain", 196, Rarity.LAND, mage.cards.basiclands.Mountain.class)); - cards.add(new SetCardInfo("Mountain", 197, Rarity.LAND, mage.cards.basiclands.Mountain.class)); + cards.add(new SetCardInfo("Mountain", 196, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mountain", 197, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Mummy Paramount", 16, Rarity.COMMON, mage.cards.m.MummyParamount.class)); cards.add(new SetCardInfo("Neheb, the Eternal", 104, Rarity.MYTHIC, mage.cards.n.NehebTheEternal.class)); cards.add(new SetCardInfo("Nicol Bolas, God-Pharaoh", 140, Rarity.MYTHIC, mage.cards.n.NicolBolasGodPharaoh.class)); @@ -172,8 +172,8 @@ public final class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Overcome", 125, Rarity.UNCOMMON, mage.cards.o.Overcome.class)); cards.add(new SetCardInfo("Overwhelming Splendor", 19, Rarity.MYTHIC, mage.cards.o.OverwhelmingSplendor.class)); cards.add(new SetCardInfo("Plains", 185, Rarity.LAND, mage.cards.basiclands.Plains.class, FULL_ART_BFZ_VARIOUS)); - cards.add(new SetCardInfo("Plains", 190, Rarity.LAND, mage.cards.basiclands.Plains.class)); - cards.add(new SetCardInfo("Plains", 191, Rarity.LAND, mage.cards.basiclands.Plains.class)); + cards.add(new SetCardInfo("Plains", 190, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Plains", 191, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Pride Sovereign", 126, Rarity.RARE, mage.cards.p.PrideSovereign.class)); cards.add(new SetCardInfo("Proven Combatant", 42, Rarity.COMMON, mage.cards.p.ProvenCombatant.class)); cards.add(new SetCardInfo("Puncturing Blow", 106, Rarity.COMMON, mage.cards.p.PuncturingBlow.class)); @@ -217,8 +217,8 @@ public final class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Supreme Will", 49, Rarity.UNCOMMON, mage.cards.s.SupremeWill.class)); cards.add(new SetCardInfo("Survivors' Encampment", 184, Rarity.COMMON, mage.cards.s.SurvivorsEncampment.class)); cards.add(new SetCardInfo("Swamp", 187, Rarity.LAND, mage.cards.basiclands.Swamp.class, FULL_ART_BFZ_VARIOUS)); - cards.add(new SetCardInfo("Swamp", 194, Rarity.LAND, mage.cards.basiclands.Swamp.class)); - cards.add(new SetCardInfo("Swamp", 195, Rarity.LAND, mage.cards.basiclands.Swamp.class)); + cards.add(new SetCardInfo("Swamp", 194, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Swamp", 195, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Swarm Intelligence", 50, Rarity.RARE, mage.cards.s.SwarmIntelligence.class)); cards.add(new SetCardInfo("Tenacious Hunter", 136, Rarity.UNCOMMON, mage.cards.t.TenaciousHunter.class)); cards.add(new SetCardInfo("The Locust God", 139, Rarity.MYTHIC, mage.cards.t.TheLocustGod.class)); diff --git a/Mage.Sets/src/mage/sets/Ixalan.java b/Mage.Sets/src/mage/sets/Ixalan.java index 7ccce7704eb..9f9cdc945a7 100644 --- a/Mage.Sets/src/mage/sets/Ixalan.java +++ b/Mage.Sets/src/mage/sets/Ixalan.java @@ -10,7 +10,6 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author fireshoes */ public final class Ixalan extends ExpansionSet { @@ -124,10 +123,10 @@ public final class Ixalan extends ExpansionSet { cards.add(new SetCardInfo("Fire Shrine Keeper", 144, Rarity.COMMON, mage.cards.f.FireShrineKeeper.class)); cards.add(new SetCardInfo("Firecannon Blast", 145, Rarity.COMMON, mage.cards.f.FirecannonBlast.class)); cards.add(new SetCardInfo("Fleet Swallower", 57, Rarity.RARE, mage.cards.f.FleetSwallower.class)); - cards.add(new SetCardInfo("Forest", 276, Rarity.LAND, mage.cards.basiclands.Forest.class)); - cards.add(new SetCardInfo("Forest", 277, Rarity.LAND, mage.cards.basiclands.Forest.class)); - cards.add(new SetCardInfo("Forest", 278, Rarity.LAND, mage.cards.basiclands.Forest.class)); - cards.add(new SetCardInfo("Forest", 279, Rarity.LAND, mage.cards.basiclands.Forest.class)); + cards.add(new SetCardInfo("Forest", 276, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Forest", 277, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Forest", 278, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Forest", 279, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Frenzied Raptor", 146, Rarity.COMMON, mage.cards.f.FrenziedRaptor.class)); cards.add(new SetCardInfo("Gilded Sentinel", 239, Rarity.COMMON, mage.cards.g.GildedSentinel.class)); cards.add(new SetCardInfo("Gishath, Sun's Avatar", 222, Rarity.MYTHIC, mage.cards.g.GishathSunsAvatar.class)); @@ -152,10 +151,10 @@ public final class Ixalan extends ExpansionSet { cards.add(new SetCardInfo("Imperial Aerosaur", 14, Rarity.UNCOMMON, mage.cards.i.ImperialAerosaur.class)); cards.add(new SetCardInfo("Imperial Lancer", 15, Rarity.UNCOMMON, mage.cards.i.ImperialLancer.class)); cards.add(new SetCardInfo("Inspiring Cleric", 16, Rarity.UNCOMMON, mage.cards.i.InspiringCleric.class)); - cards.add(new SetCardInfo("Island", 264, Rarity.LAND, mage.cards.basiclands.Island.class)); - cards.add(new SetCardInfo("Island", 265, Rarity.LAND, mage.cards.basiclands.Island.class)); - cards.add(new SetCardInfo("Island", 266, Rarity.LAND, mage.cards.basiclands.Island.class)); - cards.add(new SetCardInfo("Island", 267, Rarity.LAND, mage.cards.basiclands.Island.class)); + cards.add(new SetCardInfo("Island", 264, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Island", 265, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Island", 266, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Island", 267, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Itlimoc, Cradle of the Sun", 191, Rarity.RARE, mage.cards.i.ItlimocCradleOfTheSun.class)); cards.add(new SetCardInfo("Ixalan's Binding", 17, Rarity.UNCOMMON, mage.cards.i.IxalansBinding.class)); cards.add(new SetCardInfo("Ixalli's Diviner", 192, Rarity.COMMON, mage.cards.i.IxallisDiviner.class)); @@ -185,10 +184,10 @@ public final class Ixalan extends ExpansionSet { cards.add(new SetCardInfo("Mark of the Vampire", 113, Rarity.COMMON, mage.cards.m.MarkOfTheVampire.class)); cards.add(new SetCardInfo("Mavren Fein, Dusk Apostle", 24, Rarity.RARE, mage.cards.m.MavrenFeinDuskApostle.class)); cards.add(new SetCardInfo("Merfolk Branchwalker", 197, Rarity.UNCOMMON, mage.cards.m.MerfolkBranchwalker.class)); - cards.add(new SetCardInfo("Mountain", 272, Rarity.LAND, mage.cards.basiclands.Mountain.class)); - cards.add(new SetCardInfo("Mountain", 273, Rarity.LAND, mage.cards.basiclands.Mountain.class)); - cards.add(new SetCardInfo("Mountain", 274, Rarity.LAND, mage.cards.basiclands.Mountain.class)); - cards.add(new SetCardInfo("Mountain", 275, Rarity.LAND, mage.cards.basiclands.Mountain.class)); + cards.add(new SetCardInfo("Mountain", 272, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mountain", 273, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mountain", 274, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mountain", 275, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Navigator's Ruin", 63, Rarity.UNCOMMON, mage.cards.n.NavigatorsRuin.class)); cards.add(new SetCardInfo("New Horizons", 198, Rarity.COMMON, mage.cards.n.NewHorizons.class)); cards.add(new SetCardInfo("Nest Robber", 152, Rarity.COMMON, mage.cards.n.NestRobber.class)); @@ -203,10 +202,10 @@ public final class Ixalan extends ExpansionSet { cards.add(new SetCardInfo("Pious Interdiction", 26, Rarity.COMMON, mage.cards.p.PiousInterdiction.class)); cards.add(new SetCardInfo("Pirate's Cutlass", 242, Rarity.COMMON, mage.cards.p.PiratesCutlass.class)); cards.add(new SetCardInfo("Pirate's Prize", 68, Rarity.COMMON, mage.cards.p.PiratesPrize.class)); - cards.add(new SetCardInfo("Plains", 260, Rarity.LAND, mage.cards.basiclands.Plains.class)); - cards.add(new SetCardInfo("Plains", 261, Rarity.LAND, mage.cards.basiclands.Plains.class)); - cards.add(new SetCardInfo("Plains", 262, Rarity.LAND, mage.cards.basiclands.Plains.class)); - cards.add(new SetCardInfo("Plains", 263, Rarity.LAND, mage.cards.basiclands.Plains.class)); + cards.add(new SetCardInfo("Plains", 260, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Plains", 261, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Plains", 262, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Plains", 263, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Pounce", 200, Rarity.COMMON, mage.cards.p.Pounce.class)); cards.add(new SetCardInfo("Priest of the Wakening Sun", 27, Rarity.RARE, mage.cards.p.PriestOfTheWakeningSun.class)); cards.add(new SetCardInfo("Primal Amulet", 243, Rarity.RARE, mage.cards.p.PrimalAmulet.class)); @@ -290,10 +289,10 @@ public final class Ixalan extends ExpansionSet { cards.add(new SetCardInfo("Sunpetal Grove", 257, Rarity.RARE, mage.cards.s.SunpetalGrove.class)); cards.add(new SetCardInfo("Sunrise Seeker", 40, Rarity.COMMON, mage.cards.s.SunriseSeeker.class)); cards.add(new SetCardInfo("Sure Strike", 166, Rarity.COMMON, mage.cards.s.SureStrike.class)); - cards.add(new SetCardInfo("Swamp", 268, Rarity.LAND, mage.cards.basiclands.Swamp.class)); - cards.add(new SetCardInfo("Swamp", 269, Rarity.LAND, mage.cards.basiclands.Swamp.class)); - cards.add(new SetCardInfo("Swamp", 270, Rarity.LAND, mage.cards.basiclands.Swamp.class)); - cards.add(new SetCardInfo("Swamp", 271, Rarity.LAND, mage.cards.basiclands.Swamp.class)); + cards.add(new SetCardInfo("Swamp", 268, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Swamp", 269, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Swamp", 270, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Swamp", 271, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Swashbuckling", 167, Rarity.COMMON, mage.cards.s.Swashbuckling.class)); cards.add(new SetCardInfo("Sword-Point Diplomacy", 126, Rarity.RARE, mage.cards.s.SwordPointDiplomacy.class)); cards.add(new SetCardInfo("Tempest Caller", 86, Rarity.UNCOMMON, mage.cards.t.TempestCaller.class)); @@ -334,4 +333,4 @@ public final class Ixalan extends ExpansionSet { cards.add(new SetCardInfo("Wind Strider", 88, Rarity.COMMON, mage.cards.w.WindStrider.class)); cards.add(new SetCardInfo("Woodland Stream", 284, Rarity.COMMON, mage.cards.w.WoodlandStream.class)); } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/Magic2011.java b/Mage.Sets/src/mage/sets/Magic2011.java index e393fded7e3..7ac019836bf 100644 --- a/Mage.Sets/src/mage/sets/Magic2011.java +++ b/Mage.Sets/src/mage/sets/Magic2011.java @@ -1,4 +1,3 @@ - package mage.sets; import mage.cards.ExpansionSet; @@ -70,7 +69,7 @@ public final class Magic2011 extends ExpansionSet { cards.add(new SetCardInfo("Clone", 49, Rarity.RARE, mage.cards.c.Clone.class)); cards.add(new SetCardInfo("Cloud Crusader", 10, Rarity.COMMON, mage.cards.c.CloudCrusader.class)); cards.add(new SetCardInfo("Cloud Elemental", 50, Rarity.COMMON, mage.cards.c.CloudElemental.class)); - cards.add(new SetCardInfo("Combust", 130, Rarity.COMMON, mage.cards.c.Combust.class)); + cards.add(new SetCardInfo("Combust", 130, Rarity.UNCOMMON, mage.cards.c.Combust.class)); cards.add(new SetCardInfo("Condemn", 11, Rarity.UNCOMMON, mage.cards.c.Condemn.class)); cards.add(new SetCardInfo("Conundrum Sphinx", 51, Rarity.RARE, mage.cards.c.ConundrumSphinx.class)); cards.add(new SetCardInfo("Corrupt", 89, Rarity.UNCOMMON, mage.cards.c.Corrupt.class)); @@ -95,7 +94,7 @@ public final class Magic2011 extends ExpansionSet { cards.add(new SetCardInfo("Dryad's Favor", 169, Rarity.COMMON, mage.cards.d.DryadsFavor.class)); cards.add(new SetCardInfo("Duress", 96, Rarity.COMMON, mage.cards.d.Duress.class)); cards.add(new SetCardInfo("Duskdale Wurm", 170, Rarity.UNCOMMON, mage.cards.d.DuskdaleWurm.class)); - cards.add(new SetCardInfo("Earth Servant", 134, Rarity.COMMON, mage.cards.e.EarthServant.class)); + cards.add(new SetCardInfo("Earth Servant", 134, Rarity.UNCOMMON, mage.cards.e.EarthServant.class)); cards.add(new SetCardInfo("Elite Vanguard", 13, Rarity.UNCOMMON, mage.cards.e.EliteVanguard.class)); cards.add(new SetCardInfo("Elixir of Immortality", 206, Rarity.UNCOMMON, mage.cards.e.ElixirOfImmortality.class)); cards.add(new SetCardInfo("Elvish Archdruid", 171, Rarity.RARE, mage.cards.e.ElvishArchdruid.class)); diff --git a/Mage.Sets/src/mage/sets/Magic2012.java b/Mage.Sets/src/mage/sets/Magic2012.java index 3d2d8fcdd52..5e4480d5d02 100644 --- a/Mage.Sets/src/mage/sets/Magic2012.java +++ b/Mage.Sets/src/mage/sets/Magic2012.java @@ -1,8 +1,6 @@ - package mage.sets; import mage.cards.ExpansionSet; -import mage.cards.g.GoblinGrenade; import mage.constants.Rarity; import mage.constants.SetType; @@ -70,7 +68,7 @@ public final class Magic2012 extends ExpansionSet { cards.add(new SetCardInfo("Chasm Drake", 48, Rarity.COMMON, mage.cards.c.ChasmDrake.class)); cards.add(new SetCardInfo("Child of Night", 87, Rarity.COMMON, mage.cards.c.ChildOfNight.class)); cards.add(new SetCardInfo("Circle of Flame", 127, Rarity.UNCOMMON, mage.cards.c.CircleOfFlame.class)); - cards.add(new SetCardInfo("Combust", 128, Rarity.COMMON, mage.cards.c.Combust.class)); + cards.add(new SetCardInfo("Combust", 128, Rarity.UNCOMMON, mage.cards.c.Combust.class)); cards.add(new SetCardInfo("Consume Spirit", 88, Rarity.UNCOMMON, mage.cards.c.ConsumeSpirit.class)); cards.add(new SetCardInfo("Coral Merfolk", 49, Rarity.COMMON, mage.cards.c.CoralMerfolk.class)); cards.add(new SetCardInfo("Crimson Mage", 129, Rarity.UNCOMMON, mage.cards.c.CrimsonMage.class)); @@ -129,7 +127,7 @@ public final class Magic2012 extends ExpansionSet { cards.add(new SetCardInfo("Goblin Bangchuckers", 137, Rarity.UNCOMMON, mage.cards.g.GoblinBangchuckers.class)); cards.add(new SetCardInfo("Goblin Chieftain", 138, Rarity.RARE, mage.cards.g.GoblinChieftain.class)); cards.add(new SetCardInfo("Goblin Fireslinger", 139, Rarity.COMMON, mage.cards.g.GoblinFireslinger.class)); - cards.add(new SetCardInfo("Goblin Grenade", 140, Rarity.UNCOMMON, GoblinGrenade.class)); + cards.add(new SetCardInfo("Goblin Grenade", 140, Rarity.UNCOMMON, mage.cards.g.GoblinGrenade.class)); cards.add(new SetCardInfo("Goblin Piker", 141, Rarity.COMMON, mage.cards.g.GoblinPiker.class)); cards.add(new SetCardInfo("Goblin Tunneler", 142, Rarity.COMMON, mage.cards.g.GoblinTunneler.class)); cards.add(new SetCardInfo("Goblin War Paint", 143, Rarity.COMMON, mage.cards.g.GoblinWarPaint.class)); diff --git a/Mage.Sets/src/mage/sets/Magic2014.java b/Mage.Sets/src/mage/sets/Magic2014.java index 1aaa2ae4f1f..be6793a89bd 100644 --- a/Mage.Sets/src/mage/sets/Magic2014.java +++ b/Mage.Sets/src/mage/sets/Magic2014.java @@ -1,4 +1,3 @@ - package mage.sets; import mage.cards.ExpansionSet; @@ -77,7 +76,7 @@ public final class Magic2014 extends ExpansionSet { cards.add(new SetCardInfo("Dark Favor", 92, Rarity.COMMON, mage.cards.d.DarkFavor.class)); cards.add(new SetCardInfo("Dark Prophecy", 93, Rarity.RARE, mage.cards.d.DarkProphecy.class)); cards.add(new SetCardInfo("Darksteel Forge", 206, Rarity.MYTHIC, mage.cards.d.DarksteelForge.class)); - cards.add(new SetCardInfo("Darksteel Ingot", 207, Rarity.COMMON, mage.cards.d.DarksteelIngot.class)); + cards.add(new SetCardInfo("Darksteel Ingot", 207, Rarity.UNCOMMON, mage.cards.d.DarksteelIngot.class)); cards.add(new SetCardInfo("Dawnstrike Paladin", 15, Rarity.COMMON, mage.cards.d.DawnstrikePaladin.class)); cards.add(new SetCardInfo("Deadly Recluse", 168, Rarity.COMMON, mage.cards.d.DeadlyRecluse.class)); cards.add(new SetCardInfo("Deathgaze Cockatrice", 94, Rarity.COMMON, mage.cards.d.DeathgazeCockatrice.class)); @@ -213,7 +212,7 @@ public final class Magic2014 extends ExpansionSet { cards.add(new SetCardInfo("Serra Angel", 32, Rarity.UNCOMMON, mage.cards.s.SerraAngel.class)); cards.add(new SetCardInfo("Shadowborn Apostle", 114, Rarity.COMMON, mage.cards.s.ShadowbornApostle.class)); cards.add(new SetCardInfo("Shadowborn Demon", 115, Rarity.MYTHIC, mage.cards.s.ShadowbornDemon.class)); - cards.add(new SetCardInfo("Shimmering Grotto", 229, Rarity.COMMON, mage.cards.s.ShimmeringGrotto.class)); + cards.add(new SetCardInfo("Shimmering Grotto", 229, Rarity.UNCOMMON, mage.cards.s.ShimmeringGrotto.class)); cards.add(new SetCardInfo("Shivan Dragon", 154, Rarity.RARE, mage.cards.s.ShivanDragon.class)); cards.add(new SetCardInfo("Shiv's Embrace", 153, Rarity.UNCOMMON, mage.cards.s.ShivsEmbrace.class)); cards.add(new SetCardInfo("Shock", 155, Rarity.COMMON, mage.cards.s.Shock.class)); diff --git a/Mage.Sets/src/mage/sets/MastersEdition.java b/Mage.Sets/src/mage/sets/MastersEdition.java index 942dd35defd..99486fa7575 100644 --- a/Mage.Sets/src/mage/sets/MastersEdition.java +++ b/Mage.Sets/src/mage/sets/MastersEdition.java @@ -2,23 +2,10 @@ package mage.sets; import mage.cards.ExpansionSet; -import mage.cards.b.BasalThrull; -import mage.cards.d.DwarvenSoldier; -import mage.cards.g.GoblinChirurgeon; -import mage.cards.g.GoblinGrenade; -import mage.cards.h.HighTide; -import mage.cards.h.HymnToTourach; -import mage.cards.m.MindstabThrull; -import mage.cards.o.OrderOfLeitbur; -import mage.cards.o.OrderOfTheEbonHand; -import mage.cards.o.Oubliette; -import mage.cards.p.PhyrexianWarBeast; -import mage.cards.t.ThornThallid; import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author LevelX2 */ public final class MastersEdition extends ExpansionSet { @@ -38,6 +25,7 @@ public final class MastersEdition extends ExpansionSet { this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; + cards.add(new SetCardInfo("Adun Oakenshield", 141, Rarity.RARE, mage.cards.a.AdunOakenshield.class)); cards.add(new SetCardInfo("Amnesia", 29, Rarity.RARE, mage.cards.a.Amnesia.class)); cards.add(new SetCardInfo("Angry Mob", 1, Rarity.UNCOMMON, mage.cards.a.AngryMob.class)); @@ -54,7 +42,7 @@ public final class MastersEdition extends ExpansionSet { cards.add(new SetCardInfo("Balduvian Horde", 86, Rarity.RARE, mage.cards.b.BalduvianHorde.class)); cards.add(new SetCardInfo("Ball Lightning", 87, Rarity.RARE, mage.cards.b.BallLightning.class)); cards.add(new SetCardInfo("Baron Sengir", 58, Rarity.RARE, mage.cards.b.BaronSengir.class)); - cards.add(new SetCardInfo("Basal Thrull", 59, Rarity.COMMON, BasalThrull.class)); + cards.add(new SetCardInfo("Basal Thrull", 59, Rarity.COMMON, mage.cards.b.BasalThrull.class)); cards.add(new SetCardInfo("Benalish Hero", 5, Rarity.COMMON, mage.cards.b.BenalishHero.class)); cards.add(new SetCardInfo("Berserk", 114, Rarity.RARE, mage.cards.b.Berserk.class)); cards.add(new SetCardInfo("Bestial Fury", 88, Rarity.COMMON, mage.cards.b.BestialFury.class)); @@ -83,7 +71,7 @@ public final class MastersEdition extends ExpansionSet { cards.add(new SetCardInfo("Dragon Engine", 156, Rarity.COMMON, mage.cards.d.DragonEngine.class)); cards.add(new SetCardInfo("Dust to Dust", 10, Rarity.COMMON, mage.cards.d.DustToDust.class)); cards.add(new SetCardInfo("Dwarven Catapult", 91, Rarity.UNCOMMON, mage.cards.d.DwarvenCatapult.class)); - cards.add(new SetCardInfo("Dwarven Soldier", 92, Rarity.COMMON, DwarvenSoldier.class)); + cards.add(new SetCardInfo("Dwarven Soldier", 92, Rarity.COMMON, mage.cards.d.DwarvenSoldier.class)); cards.add(new SetCardInfo("Eater of the Dead", 67, Rarity.UNCOMMON, mage.cards.e.EaterOfTheDead.class)); cards.add(new SetCardInfo("Elder Land Wurm", 11, Rarity.UNCOMMON, mage.cards.e.ElderLandWurm.class)); cards.add(new SetCardInfo("Erg Raiders", 68, Rarity.COMMON, mage.cards.e.ErgRaiders.class)); @@ -101,8 +89,8 @@ public final class MastersEdition extends ExpansionSet { cards.add(new SetCardInfo("Fyndhorn Elves", 118, Rarity.COMMON, mage.cards.f.FyndhornElves.class)); cards.add(new SetCardInfo("Ghazban Ogre", 120, Rarity.COMMON, mage.cards.g.GhazbanOgre.class)); cards.add(new SetCardInfo("Giant Tortoise", 34, Rarity.COMMON, mage.cards.g.GiantTortoise.class)); - cards.add(new SetCardInfo("Goblin Chirurgeon", 94, Rarity.COMMON, GoblinChirurgeon.class)); - cards.add(new SetCardInfo("Goblin Grenade", 95, Rarity.UNCOMMON, GoblinGrenade.class)); + cards.add(new SetCardInfo("Goblin Chirurgeon", 94, Rarity.COMMON, mage.cards.g.GoblinChirurgeon.class)); + cards.add(new SetCardInfo("Goblin Grenade", 95, Rarity.UNCOMMON, mage.cards.g.GoblinGrenade.class)); cards.add(new SetCardInfo("Goblin Mutant", 96, Rarity.UNCOMMON, mage.cards.g.GoblinMutant.class)); cards.add(new SetCardInfo("Goblins of the Flarg", 98, Rarity.COMMON, mage.cards.g.GoblinsOfTheFlarg.class)); cards.add(new SetCardInfo("Goblin Wizard", 97, Rarity.RARE, mage.cards.g.GoblinWizard.class)); @@ -111,14 +99,14 @@ public final class MastersEdition extends ExpansionSet { cards.add(new SetCardInfo("Hallowed Ground", 14, Rarity.UNCOMMON, mage.cards.h.HallowedGround.class)); cards.add(new SetCardInfo("Hand of Justice", 15, Rarity.RARE, mage.cards.h.HandOfJustice.class)); cards.add(new SetCardInfo("Hecatomb", 71, Rarity.RARE, mage.cards.h.Hecatomb.class)); - cards.add(new SetCardInfo("High Tide", 35, Rarity.UNCOMMON, HighTide.class)); + cards.add(new SetCardInfo("High Tide", 35, Rarity.UNCOMMON, mage.cards.h.HighTide.class)); cards.add(new SetCardInfo("Holy Light", 16, Rarity.COMMON, mage.cards.h.HolyLight.class)); cards.add(new SetCardInfo("Homarid Spawning Bed", 36, Rarity.UNCOMMON, mage.cards.h.HomaridSpawningBed.class)); cards.add(new SetCardInfo("Hungry Mist", 121, Rarity.COMMON, mage.cards.h.HungryMist.class)); cards.add(new SetCardInfo("Hyalopterous Lemure", 72, Rarity.COMMON, mage.cards.h.HyalopterousLemure.class)); cards.add(new SetCardInfo("Hydroblast", 37, Rarity.COMMON, mage.cards.h.Hydroblast.class)); cards.add(new SetCardInfo("Hymn of Rebirth", 146, Rarity.UNCOMMON, mage.cards.h.HymnOfRebirth.class)); - cards.add(new SetCardInfo("Hymn to Tourach", 73, Rarity.UNCOMMON, HymnToTourach.class)); + cards.add(new SetCardInfo("Hymn to Tourach", 73, Rarity.UNCOMMON, mage.cards.h.HymnToTourach.class)); cards.add(new SetCardInfo("Icatian Lieutenant", 17, Rarity.COMMON, mage.cards.i.IcatianLieutenant.class)); cards.add(new SetCardInfo("Icatian Town", 18, Rarity.UNCOMMON, mage.cards.i.IcatianTown.class)); cards.add(new SetCardInfo("Ice Storm", 122, Rarity.UNCOMMON, mage.cards.i.IceStorm.class)); @@ -145,7 +133,7 @@ public final class MastersEdition extends ExpansionSet { cards.add(new SetCardInfo("Mana Flare", 103, Rarity.RARE, mage.cards.m.ManaFlare.class)); cards.add(new SetCardInfo("Marton Stromgald", 104, Rarity.RARE, mage.cards.m.MartonStromgald.class)); cards.add(new SetCardInfo("Mesa Pegasus", 20, Rarity.COMMON, mage.cards.m.MesaPegasus.class)); - cards.add(new SetCardInfo("Mindstab Thrull", 76, Rarity.COMMON, MindstabThrull.class)); + cards.add(new SetCardInfo("Mindstab Thrull", 76, Rarity.COMMON, mage.cards.m.MindstabThrull.class)); cards.add(new SetCardInfo("Mirror Universe", 159, Rarity.RARE, mage.cards.m.MirrorUniverse.class)); cards.add(new SetCardInfo("Mishra's Factory", 178, Rarity.UNCOMMON, mage.cards.m.MishrasFactory.class)); cards.add(new SetCardInfo("Moat", 21, Rarity.RARE, mage.cards.m.Moat.class)); @@ -159,15 +147,15 @@ public final class MastersEdition extends ExpansionSet { cards.add(new SetCardInfo("Nevinyrral's Disk", 160, Rarity.RARE, mage.cards.n.NevinyrralsDisk.class)); cards.add(new SetCardInfo("Onulet", 161, Rarity.COMMON, mage.cards.o.Onulet.class)); cards.add(new SetCardInfo("Orcish Mechanics", 106, Rarity.UNCOMMON, mage.cards.o.OrcishMechanics.class)); - cards.add(new SetCardInfo("Order of Leitbur", 22, Rarity.COMMON, OrderOfLeitbur.class)); - cards.add(new SetCardInfo("Order of the Ebon Hand", 78, Rarity.COMMON, OrderOfTheEbonHand.class)); - cards.add(new SetCardInfo("Oubliette", 79, Rarity.COMMON, Oubliette.class)); + cards.add(new SetCardInfo("Order of Leitbur", 22, Rarity.COMMON, mage.cards.o.OrderOfLeitbur.class)); + cards.add(new SetCardInfo("Order of the Ebon Hand", 78, Rarity.COMMON, mage.cards.o.OrderOfTheEbonHand.class)); + cards.add(new SetCardInfo("Oubliette", 79, Rarity.COMMON, mage.cards.o.Oubliette.class)); cards.add(new SetCardInfo("Paralyze", 80, Rarity.COMMON, mage.cards.p.Paralyze.class)); cards.add(new SetCardInfo("Petra Sphinx", 23, Rarity.RARE, mage.cards.p.PetraSphinx.class)); cards.add(new SetCardInfo("Phantom Monster", 43, Rarity.COMMON, mage.cards.p.PhantomMonster.class)); cards.add(new SetCardInfo("Phelddagrif", 150, Rarity.RARE, mage.cards.p.Phelddagrif.class)); cards.add(new SetCardInfo("Phyrexian Boon", 81, Rarity.COMMON, mage.cards.p.PhyrexianBoon.class)); - cards.add(new SetCardInfo("Phyrexian War Beast", 162, Rarity.UNCOMMON, PhyrexianWarBeast.class)); + cards.add(new SetCardInfo("Phyrexian War Beast", 162, Rarity.UNCOMMON, mage.cards.p.PhyrexianWarBeast.class)); cards.add(new SetCardInfo("Plains", 181, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Plains", 182, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Plains", 183, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); @@ -208,7 +196,7 @@ public final class MastersEdition extends ExpansionSet { cards.add(new SetCardInfo("Telekinesis", 52, Rarity.COMMON, mage.cards.t.Telekinesis.class)); cards.add(new SetCardInfo("Thawing Glaciers", 180, Rarity.RARE, mage.cards.t.ThawingGlaciers.class)); cards.add(new SetCardInfo("Thicket Basilisk", 134, Rarity.UNCOMMON, mage.cards.t.ThicketBasilisk.class)); - cards.add(new SetCardInfo("Thorn Thallid", 135, Rarity.COMMON, ThornThallid.class)); + cards.add(new SetCardInfo("Thorn Thallid", 135, Rarity.COMMON, mage.cards.t.ThornThallid.class)); cards.add(new SetCardInfo("Thrull Champion", 83, Rarity.RARE, mage.cards.t.ThrullChampion.class)); cards.add(new SetCardInfo("Thrull Retainer", 84, Rarity.COMMON, mage.cards.t.ThrullRetainer.class)); cards.add(new SetCardInfo("Thunder Spirit", 27, Rarity.UNCOMMON, mage.cards.t.ThunderSpirit.class)); @@ -231,5 +219,4 @@ public final class MastersEdition extends ExpansionSet { cards.add(new SetCardInfo("Ydwen Efreet", 112, Rarity.RARE, mage.cards.y.YdwenEfreet.class)); cards.add(new SetCardInfo("Zuran Orb", 174, Rarity.UNCOMMON, mage.cards.z.ZuranOrb.class)); } - -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/MastersEditionII.java b/Mage.Sets/src/mage/sets/MastersEditionII.java index c3f9f8ffbf1..7002dff323a 100644 --- a/Mage.Sets/src/mage/sets/MastersEditionII.java +++ b/Mage.Sets/src/mage/sets/MastersEditionII.java @@ -2,23 +2,10 @@ package mage.sets; import mage.cards.ExpansionSet; -import mage.cards.a.ArmorThrull; -import mage.cards.b.BrassclawOrcs; -import mage.cards.c.CombatMedic; -import mage.cards.e.ElvishHunter; -import mage.cards.f.FarrelsZealot; -import mage.cards.g.GorillaShaman; -import mage.cards.i.IcatianJavelineers; -import mage.cards.i.IcatianScout; -import mage.cards.l.LimDulsHighGuard; -import mage.cards.n.Necrite; -import mage.cards.n.NightSoil; -import mage.cards.o.OrcishVeteran; import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author LevelX2 */ public final class MastersEditionII extends ExpansionSet { @@ -31,25 +18,26 @@ public final class MastersEditionII extends ExpansionSet { private MastersEditionII() { super("Masters Edition II", "ME2", ExpansionSet.buildDate(2008, 9, 22), SetType.MAGIC_ONLINE); - this.hasBasicLands = false; + this.hasBasicLands = true; this.hasBoosters = true; this.numBoosterLands = 1; this.numBoosterCommon = 10; this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; - cards.add(new SetCardInfo("Aether Storm", 39, Rarity.UNCOMMON, mage.cards.a.AetherStorm.class)); + cards.add(new SetCardInfo("Abbey Gargoyles", 1, Rarity.UNCOMMON, mage.cards.a.AbbeyGargoyles.class)); cards.add(new SetCardInfo("Adarkar Sentinel", 201, Rarity.COMMON, mage.cards.a.AdarkarSentinel.class)); cards.add(new SetCardInfo("Aeolipile", 202, Rarity.COMMON, mage.cards.a.Aeolipile.class)); + cards.add(new SetCardInfo("Aether Storm", 39, Rarity.UNCOMMON, mage.cards.a.AetherStorm.class)); cards.add(new SetCardInfo("Ambush Party", 115, Rarity.COMMON, mage.cards.a.AmbushParty.class)); cards.add(new SetCardInfo("An-Zerrin Ruins", 117, Rarity.RARE, mage.cards.a.AnZerrinRuins.class)); cards.add(new SetCardInfo("Anarchy", 116, Rarity.RARE, mage.cards.a.Anarchy.class)); cards.add(new SetCardInfo("Angel of Fury", 2, Rarity.RARE, mage.cards.a.AngelOfFury.class)); cards.add(new SetCardInfo("Angel of Light", 3, Rarity.UNCOMMON, mage.cards.a.AngelOfLight.class)); - cards.add(new SetCardInfo("Armored Griffin", 5, Rarity.COMMON, mage.cards.a.ArmoredGriffin.class)); cards.add(new SetCardInfo("Armor of Faith", 4, Rarity.COMMON, mage.cards.a.ArmorOfFaith.class)); - cards.add(new SetCardInfo("Armor Thrull", 77, Rarity.COMMON, ArmorThrull.class)); + cards.add(new SetCardInfo("Armor Thrull", 77, Rarity.COMMON, mage.cards.a.ArmorThrull.class)); + cards.add(new SetCardInfo("Armored Griffin", 5, Rarity.COMMON, mage.cards.a.ArmoredGriffin.class)); cards.add(new SetCardInfo("Ashen Ghoul", 78, Rarity.UNCOMMON, mage.cards.a.AshenGhoul.class)); cards.add(new SetCardInfo("Ashnod's Cylix", 203, Rarity.RARE, mage.cards.a.AshnodsCylix.class)); cards.add(new SetCardInfo("Aurochs", 153, Rarity.COMMON, mage.cards.a.Aurochs.class)); @@ -64,7 +52,7 @@ public final class MastersEditionII extends ExpansionSet { cards.add(new SetCardInfo("Binding Grasp", 41, Rarity.RARE, mage.cards.b.BindingGrasp.class)); cards.add(new SetCardInfo("Bounty of the Hunt", 154, Rarity.RARE, mage.cards.b.BountyOfTheHunt.class)); cards.add(new SetCardInfo("Brainstorm", 42, Rarity.COMMON, mage.cards.b.Brainstorm.class)); - cards.add(new SetCardInfo("Brassclaw Orcs", 119, Rarity.COMMON, BrassclawOrcs.class)); + cards.add(new SetCardInfo("Brassclaw Orcs", 119, Rarity.COMMON, mage.cards.b.BrassclawOrcs.class)); cards.add(new SetCardInfo("Brimstone Dragon", 120, Rarity.RARE, mage.cards.b.BrimstoneDragon.class)); cards.add(new SetCardInfo("Brine Shaman", 80, Rarity.COMMON, mage.cards.b.BrineShaman.class)); cards.add(new SetCardInfo("Broken Visage", 81, Rarity.UNCOMMON, mage.cards.b.BrokenVisage.class)); @@ -73,7 +61,7 @@ public final class MastersEditionII extends ExpansionSet { cards.add(new SetCardInfo("Carapace", 155, Rarity.COMMON, mage.cards.c.Carapace.class)); cards.add(new SetCardInfo("Caribou Range", 8, Rarity.RARE, mage.cards.c.CaribouRange.class)); cards.add(new SetCardInfo("Clockwork Steed", 205, Rarity.UNCOMMON, mage.cards.c.ClockworkSteed.class)); - cards.add(new SetCardInfo("Combat Medic", 9, Rarity.COMMON, CombatMedic.class)); + cards.add(new SetCardInfo("Combat Medic", 9, Rarity.COMMON, mage.cards.c.CombatMedic.class)); cards.add(new SetCardInfo("Conquer", 122, Rarity.UNCOMMON, mage.cards.c.Conquer.class)); cards.add(new SetCardInfo("Counterspell", 44, Rarity.UNCOMMON, mage.cards.c.Counterspell.class)); cards.add(new SetCardInfo("Dance of the Dead", 83, Rarity.UNCOMMON, mage.cards.d.DanceOfTheDead.class)); @@ -86,6 +74,7 @@ public final class MastersEditionII extends ExpansionSet { cards.add(new SetCardInfo("Disenchant", 10, Rarity.COMMON, mage.cards.d.Disenchant.class)); cards.add(new SetCardInfo("Dreams of the Dead", 46, Rarity.RARE, mage.cards.d.DreamsOfTheDead.class)); cards.add(new SetCardInfo("Drift of the Dead", 86, Rarity.COMMON, mage.cards.d.DriftOfTheDead.class)); + cards.add(new SetCardInfo("Dry Spell", 87, Rarity.COMMON, mage.cards.d.DrySpell.class)); cards.add(new SetCardInfo("Dwarven Ruins", 227, Rarity.UNCOMMON, mage.cards.d.DwarvenRuins.class)); cards.add(new SetCardInfo("Dystopia", 88, Rarity.RARE, mage.cards.d.Dystopia.class)); cards.add(new SetCardInfo("Earthlink", 192, Rarity.RARE, mage.cards.e.Earthlink.class)); @@ -95,7 +84,7 @@ public final class MastersEditionII extends ExpansionSet { cards.add(new SetCardInfo("Elkin Bottle", 207, Rarity.RARE, mage.cards.e.ElkinBottle.class)); cards.add(new SetCardInfo("Elven Lyre", 208, Rarity.COMMON, mage.cards.e.ElvenLyre.class)); cards.add(new SetCardInfo("Elvish Farmer", 156, Rarity.RARE, mage.cards.e.ElvishFarmer.class)); - cards.add(new SetCardInfo("Elvish Hunter", 157, Rarity.COMMON, ElvishHunter.class)); + cards.add(new SetCardInfo("Elvish Hunter", 157, Rarity.COMMON, mage.cards.e.ElvishHunter.class)); cards.add(new SetCardInfo("Elvish Ranger", 158, Rarity.COMMON, mage.cards.e.ElvishRanger.class)); cards.add(new SetCardInfo("Elvish Spirit Guide", 159, Rarity.UNCOMMON, mage.cards.e.ElvishSpiritGuide.class)); cards.add(new SetCardInfo("Energy Storm", 11, Rarity.RARE, mage.cards.e.EnergyStorm.class)); @@ -105,7 +94,7 @@ public final class MastersEditionII extends ExpansionSet { cards.add(new SetCardInfo("Essence Filter", 160, Rarity.UNCOMMON, mage.cards.e.EssenceFilter.class)); cards.add(new SetCardInfo("Essence Flare", 48, Rarity.COMMON, mage.cards.e.EssenceFlare.class)); cards.add(new SetCardInfo("Farrel's Mantle", 13, Rarity.UNCOMMON, mage.cards.f.FarrelsMantle.class)); - cards.add(new SetCardInfo("Farrel's Zealot", 14, Rarity.UNCOMMON, FarrelsZealot.class)); + cards.add(new SetCardInfo("Farrel's Zealot", 14, Rarity.UNCOMMON, mage.cards.f.FarrelsZealot.class)); cards.add(new SetCardInfo("Feral Thallid", 161, Rarity.COMMON, mage.cards.f.FeralThallid.class)); cards.add(new SetCardInfo("Fire Dragon", 125, Rarity.RARE, mage.cards.f.FireDragon.class)); cards.add(new SetCardInfo("Flame Spirit", 126, Rarity.UNCOMMON, mage.cards.f.FlameSpirit.class)); @@ -122,14 +111,14 @@ public final class MastersEditionII extends ExpansionSet { cards.add(new SetCardInfo("Giant Trap Door Spider", 195, Rarity.UNCOMMON, mage.cards.g.GiantTrapDoorSpider.class)); cards.add(new SetCardInfo("Glacial Chasm", 229, Rarity.RARE, mage.cards.g.GlacialChasm.class)); cards.add(new SetCardInfo("Glacial Crevasses", 127, Rarity.RARE, mage.cards.g.GlacialCrevasses.class)); - cards.add(new SetCardInfo("Gorilla Shaman", 129, Rarity.UNCOMMON, GorillaShaman.class)); + cards.add(new SetCardInfo("Gorilla Shaman", 129, Rarity.UNCOMMON, mage.cards.g.GorillaShaman.class)); cards.add(new SetCardInfo("Grandmother Sengir", 93, Rarity.RARE, mage.cards.g.GrandmotherSengir.class)); cards.add(new SetCardInfo("Havenwood Battleground", 230, Rarity.UNCOMMON, mage.cards.h.HavenwoodBattleground.class)); cards.add(new SetCardInfo("Heart of Yavimaya", 231, Rarity.RARE, mage.cards.h.HeartOfYavimaya.class)); cards.add(new SetCardInfo("Helm of Obedience", 210, Rarity.RARE, mage.cards.h.HelmOfObedience.class)); - cards.add(new SetCardInfo("Icatian Javelineers", 15, Rarity.COMMON, IcatianJavelineers.class)); + cards.add(new SetCardInfo("Icatian Javelineers", 15, Rarity.COMMON, mage.cards.i.IcatianJavelineers.class)); cards.add(new SetCardInfo("Icatian Phalanx", 16, Rarity.COMMON, mage.cards.i.IcatianPhalanx.class)); - cards.add(new SetCardInfo("Icatian Scout", 17, Rarity.COMMON, IcatianScout.class)); + cards.add(new SetCardInfo("Icatian Scout", 17, Rarity.COMMON, mage.cards.i.IcatianScout.class)); cards.add(new SetCardInfo("Ice Floe", 232, Rarity.UNCOMMON, mage.cards.i.IceFloe.class)); cards.add(new SetCardInfo("Iceberg", 49, Rarity.UNCOMMON, mage.cards.i.Iceberg.class)); cards.add(new SetCardInfo("Icequake", 94, Rarity.COMMON, mage.cards.i.Icequake.class)); @@ -159,7 +148,7 @@ public final class MastersEditionII extends ExpansionSet { cards.add(new SetCardInfo("Krovikan Sorcerer", 51, Rarity.COMMON, mage.cards.k.KrovikanSorcerer.class)); cards.add(new SetCardInfo("Lat-Nam's Legacy", 52, Rarity.COMMON, mage.cards.l.LatNamsLegacy.class)); cards.add(new SetCardInfo("Leaping Lizard", 171, Rarity.COMMON, mage.cards.l.LeapingLizard.class)); - cards.add(new SetCardInfo("Lim-Dul's High Guard", 103, Rarity.UNCOMMON, LimDulsHighGuard.class)); + cards.add(new SetCardInfo("Lim-Dul's High Guard", 103, Rarity.UNCOMMON, mage.cards.l.LimDulsHighGuard.class)); cards.add(new SetCardInfo("Lodestone Bauble", 213, Rarity.RARE, mage.cards.l.LodestoneBauble.class)); cards.add(new SetCardInfo("Magus of the Unseen", 53, Rarity.RARE, mage.cards.m.MagusOfTheUnseen.class)); cards.add(new SetCardInfo("Mana Crypt", 214, Rarity.RARE, mage.cards.m.ManaCrypt.class)); @@ -167,20 +156,21 @@ public final class MastersEditionII extends ExpansionSet { cards.add(new SetCardInfo("Mesmeric Trance", 55, Rarity.RARE, mage.cards.m.MesmericTrance.class)); cards.add(new SetCardInfo("Meteor Shower", 135, Rarity.COMMON, mage.cards.m.MeteorShower.class)); cards.add(new SetCardInfo("Minion of Leshrac", 104, Rarity.RARE, mage.cards.m.MinionOfLeshrac.class)); + cards.add(new SetCardInfo("Mishra's Groundbreaker", 215, Rarity.UNCOMMON, mage.cards.m.MishrasGroundbreaker.class)); cards.add(new SetCardInfo("Misinformation", 105, Rarity.UNCOMMON, mage.cards.m.Misinformation.class)); cards.add(new SetCardInfo("Mudslide", 136, Rarity.RARE, mage.cards.m.Mudslide.class)); cards.add(new SetCardInfo("Narwhal", 57, Rarity.UNCOMMON, mage.cards.n.Narwhal.class)); cards.add(new SetCardInfo("Nature's Blessing", 196, Rarity.UNCOMMON, mage.cards.n.NaturesBlessing.class)); cards.add(new SetCardInfo("Nature's Wrath", 172, Rarity.RARE, mage.cards.n.NaturesWrath.class)); - cards.add(new SetCardInfo("Necrite", 106, Rarity.COMMON, Necrite.class)); + cards.add(new SetCardInfo("Necrite", 106, Rarity.COMMON, mage.cards.n.Necrite.class)); cards.add(new SetCardInfo("Necropotence", 107, Rarity.RARE, mage.cards.n.Necropotence.class)); - cards.add(new SetCardInfo("Night Soil", 173, Rarity.UNCOMMON, NightSoil.class)); + cards.add(new SetCardInfo("Night Soil", 173, Rarity.UNCOMMON, mage.cards.n.NightSoil.class)); cards.add(new SetCardInfo("Orc General", 137, Rarity.UNCOMMON, mage.cards.o.OrcGeneral.class)); cards.add(new SetCardInfo("Orcish Cannoneers", 138, Rarity.UNCOMMON, mage.cards.o.OrcishCannoneers.class)); cards.add(new SetCardInfo("Orcish Captain", 139, Rarity.UNCOMMON, mage.cards.o.OrcishCaptain.class)); cards.add(new SetCardInfo("Orcish Lumberjack", 142, Rarity.COMMON, mage.cards.o.OrcishLumberjack.class)); cards.add(new SetCardInfo("Orcish Squatters", 143, Rarity.RARE, mage.cards.o.OrcishSquatters.class)); - cards.add(new SetCardInfo("Orcish Veteran", 144, Rarity.COMMON, OrcishVeteran.class)); + cards.add(new SetCardInfo("Orcish Veteran", 144, Rarity.COMMON, mage.cards.o.OrcishVeteran.class)); cards.add(new SetCardInfo("Order of the Sacred Torch", 25, Rarity.RARE, mage.cards.o.OrderOfTheSacredTorch.class)); cards.add(new SetCardInfo("Order of the White Shield", 26, Rarity.UNCOMMON, mage.cards.o.OrderOfTheWhiteShield.class)); cards.add(new SetCardInfo("Panic", 145, Rarity.COMMON, mage.cards.p.Panic.class)); @@ -200,6 +190,7 @@ public final class MastersEditionII extends ExpansionSet { cards.add(new SetCardInfo("Ritual of Subdual", 174, Rarity.RARE, mage.cards.r.RitualOfSubdual.class)); cards.add(new SetCardInfo("Ritual of the Machine", 109, Rarity.RARE, mage.cards.r.RitualOfTheMachine.class)); cards.add(new SetCardInfo("Roterothopter", 218, Rarity.COMMON, mage.cards.r.Roterothopter.class)); + cards.add(new SetCardInfo("Royal Decree", 31, Rarity.RARE, mage.cards.r.RoyalDecree.class)); cards.add(new SetCardInfo("Royal Trooper", 32, Rarity.COMMON, mage.cards.r.RoyalTrooper.class)); cards.add(new SetCardInfo("Ruins of Trokair", 234, Rarity.UNCOMMON, mage.cards.r.RuinsOfTrokair.class)); cards.add(new SetCardInfo("Savannah", 235, Rarity.RARE, mage.cards.s.Savannah.class)); @@ -227,8 +218,8 @@ public final class MastersEditionII extends ExpansionSet { cards.add(new SetCardInfo("Spore Cloud", 176, Rarity.UNCOMMON, mage.cards.s.SporeCloud.class)); cards.add(new SetCardInfo("Spore Flower", 177, Rarity.UNCOMMON, mage.cards.s.SporeFlower.class)); cards.add(new SetCardInfo("Stampede", 178, Rarity.UNCOMMON, mage.cards.s.Stampede.class)); - cards.add(new SetCardInfo("Stonehands", 151, Rarity.COMMON, mage.cards.s.Stonehands.class)); cards.add(new SetCardInfo("Stone Spirit", 150, Rarity.UNCOMMON, mage.cards.s.StoneSpirit.class)); + cards.add(new SetCardInfo("Stonehands", 151, Rarity.COMMON, mage.cards.s.Stonehands.class)); cards.add(new SetCardInfo("Storm Spirit", 198, Rarity.RARE, mage.cards.s.StormSpirit.class)); cards.add(new SetCardInfo("Stromgald Cabal", 113, Rarity.RARE, mage.cards.s.StromgaldCabal.class)); cards.add(new SetCardInfo("Stunted Growth", 179, Rarity.RARE, mage.cards.s.StuntedGrowth.class)); @@ -237,8 +228,8 @@ public final class MastersEditionII extends ExpansionSet { cards.add(new SetCardInfo("Swords to Plowshares", 37, Rarity.UNCOMMON, mage.cards.s.SwordsToPlowshares.class)); cards.add(new SetCardInfo("Taiga", 238, Rarity.RARE, mage.cards.t.Taiga.class)); cards.add(new SetCardInfo("Temporal Manipulation", 69, Rarity.RARE, mage.cards.t.TemporalManipulation.class)); - cards.add(new SetCardInfo("Thallid", 180, Rarity.COMMON, mage.cards.t.Thallid.class)); cards.add(new SetCardInfo("Thallid Devourer", 181, Rarity.COMMON, mage.cards.t.ThallidDevourer.class)); + cards.add(new SetCardInfo("Thallid", 180, Rarity.COMMON, mage.cards.t.Thallid.class)); cards.add(new SetCardInfo("Thelonite Druid", 182, Rarity.RARE, mage.cards.t.TheloniteDruid.class)); cards.add(new SetCardInfo("Thermokarst", 183, Rarity.COMMON, mage.cards.t.Thermokarst.class)); cards.add(new SetCardInfo("Thought Lash", 70, Rarity.RARE, mage.cards.t.ThoughtLash.class)); @@ -247,13 +238,16 @@ public final class MastersEditionII extends ExpansionSet { cards.add(new SetCardInfo("Tinder Wall", 184, Rarity.COMMON, mage.cards.t.TinderWall.class)); cards.add(new SetCardInfo("Tundra", 239, Rarity.RARE, mage.cards.t.Tundra.class)); cards.add(new SetCardInfo("Underground Sea", 240, Rarity.RARE, mage.cards.u.UndergroundSea.class)); + cards.add(new SetCardInfo("Varchild's Crusader", 152, Rarity.COMMON, mage.cards.v.VarchildsCrusader.class)); cards.add(new SetCardInfo("Viscerid Armor", 72, Rarity.COMMON, mage.cards.v.VisceridArmor.class)); cards.add(new SetCardInfo("Viscerid Drone", 73, Rarity.UNCOMMON, mage.cards.v.VisceridDrone.class)); cards.add(new SetCardInfo("Wall of Kelp", 74, Rarity.COMMON, mage.cards.w.WallOfKelp.class)); cards.add(new SetCardInfo("Warning", 38, Rarity.COMMON, mage.cards.w.Warning.class)); + cards.add(new SetCardInfo("Whirling Catapult", 224, Rarity.UNCOMMON, mage.cards.w.WhirlingCatapult.class)); cards.add(new SetCardInfo("Whiteout", 185, Rarity.COMMON, mage.cards.w.Whiteout.class)); cards.add(new SetCardInfo("Wind Spirit", 75, Rarity.UNCOMMON, mage.cards.w.WindSpirit.class)); cards.add(new SetCardInfo("Wings of Aesthir", 199, Rarity.UNCOMMON, mage.cards.w.WingsOfAesthir.class)); + cards.add(new SetCardInfo("Winter's Night", 200, Rarity.RARE, mage.cards.w.WintersNight.class)); cards.add(new SetCardInfo("Withering Wisps", 114, Rarity.UNCOMMON, mage.cards.w.WitheringWisps.class)); cards.add(new SetCardInfo("Wolf Pack", 187, Rarity.RARE, mage.cards.w.WolfPack.class)); cards.add(new SetCardInfo("Woolly Mammoths", 188, Rarity.COMMON, mage.cards.w.WoollyMammoths.class)); @@ -261,5 +255,4 @@ public final class MastersEditionII extends ExpansionSet { cards.add(new SetCardInfo("Yavimaya Ancients", 190, Rarity.UNCOMMON, mage.cards.y.YavimayaAncients.class)); cards.add(new SetCardInfo("Zuran Spellcaster", 76, Rarity.COMMON, mage.cards.z.ZuranSpellcaster.class)); } - } diff --git a/Mage.Sets/src/mage/sets/MastersEditionIII.java b/Mage.Sets/src/mage/sets/MastersEditionIII.java index 199b32e7324..779517679cf 100644 --- a/Mage.Sets/src/mage/sets/MastersEditionIII.java +++ b/Mage.Sets/src/mage/sets/MastersEditionIII.java @@ -2,12 +2,10 @@ package mage.sets; import mage.cards.ExpansionSet; -import mage.cards.f.FeveredStrength; import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author LevelX2 */ public final class MastersEditionIII extends ExpansionSet { @@ -27,6 +25,7 @@ public final class MastersEditionIII extends ExpansionSet { this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; + cards.add(new SetCardInfo("Active Volcano", 85, Rarity.UNCOMMON, mage.cards.a.ActiveVolcano.class)); cards.add(new SetCardInfo("Akron Legionnaire", 1, Rarity.RARE, mage.cards.a.AkronLegionnaire.class)); cards.add(new SetCardInfo("Alabaster Potion", 2, Rarity.UNCOMMON, mage.cards.a.AlabasterPotion.class)); @@ -87,7 +86,7 @@ public final class MastersEditionIII extends ExpansionSet { cards.add(new SetCardInfo("False Defeat", 11, Rarity.UNCOMMON, mage.cards.f.FalseDefeat.class)); cards.add(new SetCardInfo("Famine", 65, Rarity.UNCOMMON, mage.cards.f.Famine.class)); cards.add(new SetCardInfo("Fellwar Stone", 195, Rarity.COMMON, mage.cards.f.FellwarStone.class)); - cards.add(new SetCardInfo("Fevered Strength", 66, Rarity.COMMON, FeveredStrength.class)); + cards.add(new SetCardInfo("Fevered Strength", 66, Rarity.COMMON, mage.cards.f.FeveredStrength.class)); cards.add(new SetCardInfo("Fire Ambush", 97, Rarity.COMMON, mage.cards.f.FireAmbush.class)); cards.add(new SetCardInfo("Fire Drake", 98, Rarity.COMMON, mage.cards.f.FireDrake.class)); cards.add(new SetCardInfo("Fire Sprites", 118, Rarity.COMMON, mage.cards.f.FireSprites.class)); @@ -247,5 +246,4 @@ public final class MastersEditionIII extends ExpansionSet { cards.add(new SetCardInfo("Zhang Fei, Fierce Warrior", 28, Rarity.UNCOMMON, mage.cards.z.ZhangFeiFierceWarrior.class)); cards.add(new SetCardInfo("Zodiac Dragon", 112, Rarity.RARE, mage.cards.z.ZodiacDragon.class)); } - -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/MastersEditionIV.java b/Mage.Sets/src/mage/sets/MastersEditionIV.java index 8658d66d9b5..ba6d2eb7e95 100644 --- a/Mage.Sets/src/mage/sets/MastersEditionIV.java +++ b/Mage.Sets/src/mage/sets/MastersEditionIV.java @@ -2,8 +2,6 @@ package mage.sets; import mage.cards.ExpansionSet; -import mage.cards.a.AesthirGlider; -import mage.cards.e.EliteCatWarrior; import mage.cards.repository.CardCriteria; import mage.cards.repository.CardInfo; import mage.cards.repository.CardRepository; @@ -14,7 +12,6 @@ import java.util.ArrayList; import java.util.List; /** - * * @author LevelX2 */ public final class MastersEditionIV extends ExpansionSet { @@ -37,8 +34,9 @@ public final class MastersEditionIV extends ExpansionSet { this.numBoosterRare = 1; this.ratioBoosterMythic = 0; this.ratioBoosterSpecialLand = 1; // replace all basic lands + cards.add(new SetCardInfo("Acid Rain", 36, Rarity.RARE, mage.cards.a.AcidRain.class)); - cards.add(new SetCardInfo("Aesthir Glider", 176, Rarity.COMMON, AesthirGlider.class)); + cards.add(new SetCardInfo("Aesthir Glider", 176, Rarity.COMMON, mage.cards.a.AesthirGlider.class)); cards.add(new SetCardInfo("Air Elemental", 37, Rarity.UNCOMMON, mage.cards.a.AirElemental.class)); cards.add(new SetCardInfo("Al-abara's Carpet", 177, Rarity.RARE, mage.cards.a.AlAbarasCarpet.class)); cards.add(new SetCardInfo("Alaborn Musketeer", 1, Rarity.COMMON, mage.cards.a.AlabornMusketeer.class)); @@ -113,7 +111,7 @@ public final class MastersEditionIV extends ExpansionSet { cards.add(new SetCardInfo("Ebony Horse", 198, Rarity.COMMON, mage.cards.e.EbonyHorse.class)); cards.add(new SetCardInfo("Ebony Rhino", 199, Rarity.COMMON, mage.cards.e.EbonyRhino.class)); cards.add(new SetCardInfo("Elephant Graveyard", 244, Rarity.UNCOMMON, mage.cards.e.ElephantGraveyard.class)); - cards.add(new SetCardInfo("Elite Cat Warrior", 151, Rarity.COMMON, EliteCatWarrior.class)); + cards.add(new SetCardInfo("Elite Cat Warrior", 151, Rarity.COMMON, mage.cards.e.EliteCatWarrior.class)); cards.add(new SetCardInfo("Energy Flux", 48, Rarity.UNCOMMON, mage.cards.e.EnergyFlux.class)); cards.add(new SetCardInfo("Eye for an Eye", 12, Rarity.RARE, mage.cards.e.EyeForAnEye.class)); cards.add(new SetCardInfo("False Summoning", 49, Rarity.COMMON, mage.cards.f.FalseSummoning.class)); @@ -317,5 +315,4 @@ public final class MastersEditionIV extends ExpansionSet { return new ArrayList<>(savedSpecialLand); } - -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/MediaInserts.java b/Mage.Sets/src/mage/sets/MediaInserts.java index 63974d83518..47d1bd4566f 100644 --- a/Mage.Sets/src/mage/sets/MediaInserts.java +++ b/Mage.Sets/src/mage/sets/MediaInserts.java @@ -2,7 +2,6 @@ package mage.sets; import mage.cards.ExpansionSet; -import mage.cards.h.HighTide; import mage.constants.Rarity; import mage.constants.SetType; @@ -18,6 +17,7 @@ public final class MediaInserts extends ExpansionSet { super("Media Inserts", "MBP", ExpansionSet.buildDate(1990, 1, 1), SetType.PROMOTIONAL); this.hasBoosters = false; this.hasBasicLands = false; + cards.add(new SetCardInfo("Acquire", 83, Rarity.RARE, mage.cards.a.Acquire.class)); cards.add(new SetCardInfo("Aeronaut Tinkerer", 118, Rarity.COMMON, mage.cards.a.AeronautTinkerer.class)); cards.add(new SetCardInfo("Ajani, Caller of the Pride", 72, Rarity.MYTHIC, mage.cards.a.AjaniCallerOfThePride.class)); @@ -48,7 +48,7 @@ public final class MediaInserts extends ExpansionSet { cards.add(new SetCardInfo("Celestial Colonnade", 23, Rarity.SPECIAL, mage.cards.c.CelestialColonnade.class)); cards.add(new SetCardInfo("Chandra, Fire of Kaladesh", 997, Rarity.SPECIAL, mage.cards.c.ChandraFireOfKaladesh.class)); cards.add(new SetCardInfo("Chandra, Flamecaller", 175, Rarity.MYTHIC, mage.cards.c.ChandraFlamecaller.class)); - cards.add(new SetCardInfo("Chandra, Pyromaster", 75, Rarity.MYTHIC, mage.cards.c.ChandraPyromaster.class)); + cards.add(new SetCardInfo("Chandra, Pyromaster", 75, Rarity.MYTHIC, mage.cards.c.ChandraPyromaster.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Chandra, Pyromaster", 102, Rarity.MYTHIC, mage.cards.c.ChandraPyromaster.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Chandra, Roaring Flame", 997, Rarity.SPECIAL, mage.cards.c.ChandraRoaringFlame.class)); cards.add(new SetCardInfo("Chandra, Torch of Defiance", 180, Rarity.MYTHIC, mage.cards.c.ChandraTorchOfDefiance.class)); @@ -102,7 +102,7 @@ public final class MediaInserts extends ExpansionSet { cards.add(new SetCardInfo("Hamletback Goliath", 71, Rarity.RARE, mage.cards.h.HamletbackGoliath.class)); cards.add(new SetCardInfo("Harbinger of the Hunt", 116, Rarity.SPECIAL, mage.cards.h.HarbingerOfTheHunt.class)); cards.add(new SetCardInfo("Hero of Goma Fada", 136, Rarity.SPECIAL, mage.cards.h.HeroOfGomaFada.class)); - cards.add(new SetCardInfo("High Tide", 80, Rarity.COMMON, HighTide.class)); + cards.add(new SetCardInfo("High Tide", 80, Rarity.COMMON, mage.cards.h.HighTide.class)); cards.add(new SetCardInfo("Hixus, Prison Warden", 126, Rarity.SPECIAL, mage.cards.h.HixusPrisonWarden.class)); cards.add(new SetCardInfo("Honored Hierarch", 129, Rarity.SPECIAL, mage.cards.h.HonoredHierarch.class)); cards.add(new SetCardInfo("Honor of the Pure", 20, Rarity.RARE, mage.cards.h.HonorOfThePure.class)); @@ -113,8 +113,8 @@ public final class MediaInserts extends ExpansionSet { cards.add(new SetCardInfo("Jace, Memory Adept", 73, Rarity.MYTHIC, mage.cards.j.JaceMemoryAdept.class)); cards.add(new SetCardInfo("Jace, Telepath Unbound", 995, Rarity.SPECIAL, mage.cards.j.JaceTelepathUnbound.class)); cards.add(new SetCardInfo("Jace, the Living Guildpact", 100, Rarity.MYTHIC, mage.cards.j.JaceTheLivingGuildpact.class)); - cards.add(new SetCardInfo("Jace, Unraveler of Secrets", 173, Rarity.MYTHIC, mage.cards.j.JaceUnravelerOfSecrets.class)); - cards.add(new SetCardInfo("Jace, Unraveler of Secrets", 178, Rarity.MYTHIC, mage.cards.j.JaceUnravelerOfSecrets.class)); + cards.add(new SetCardInfo("Jace, Unraveler of Secrets", 173, Rarity.MYTHIC, mage.cards.j.JaceUnravelerOfSecrets.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Jace, Unraveler of Secrets", 178, Rarity.MYTHIC, mage.cards.j.JaceUnravelerOfSecrets.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Jace, Vryn's Prodigy", 995, Rarity.SPECIAL, mage.cards.j.JaceVrynsProdigy.class)); cards.add(new SetCardInfo("Jaya Ballard, Task Mage", 18, Rarity.RARE, mage.cards.j.JayaBallardTaskMage.class)); cards.add(new SetCardInfo("Karametra's Acolyte", 78, Rarity.UNCOMMON, mage.cards.k.KarametrasAcolyte.class)); @@ -127,7 +127,7 @@ public final class MediaInserts extends ExpansionSet { cards.add(new SetCardInfo("Liliana, Death's Majesty", 179, Rarity.MYTHIC, mage.cards.l.LilianaDeathsMajesty.class)); cards.add(new SetCardInfo("Liliana, Defiant Necromancer", 996, Rarity.SPECIAL, mage.cards.l.LilianaDefiantNecromancer.class)); cards.add(new SetCardInfo("Liliana, the Last Hope", 174, Rarity.MYTHIC, mage.cards.l.LilianaTheLastHope.class)); - cards.add(new SetCardInfo("Liliana Vess", 30, Rarity.RARE, mage.cards.l.LilianaVess.class)); + cards.add(new SetCardInfo("Liliana Vess", 30, Rarity.RARE, mage.cards.l.LilianaVess.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Liliana Vess", 101, Rarity.MYTHIC, mage.cards.l.LilianaVess.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Magister of Worth", 86, Rarity.SPECIAL, mage.cards.m.MagisterOfWorth.class)); cards.add(new SetCardInfo("Mana Crypt", 6, Rarity.RARE, mage.cards.m.ManaCrypt.class)); @@ -211,4 +211,4 @@ public final class MediaInserts extends ExpansionSet { cards.add(new SetCardInfo("Windseeker Centaur", 7, Rarity.SPECIAL, mage.cards.w.WindseekerCentaur.class)); cards.add(new SetCardInfo("Xathrid Necromancer", 91, Rarity.SPECIAL, mage.cards.x.XathridNecromancer.class)); } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/MercadianMasques.java b/Mage.Sets/src/mage/sets/MercadianMasques.java index 73f52e99038..a1110e968cd 100644 --- a/Mage.Sets/src/mage/sets/MercadianMasques.java +++ b/Mage.Sets/src/mage/sets/MercadianMasques.java @@ -1,4 +1,3 @@ - package mage.sets; import mage.cards.ExpansionSet; @@ -309,7 +308,7 @@ public final class MercadianMasques extends ExpansionSet { cards.add(new SetCardInfo("Stinging Barrier", 107, Rarity.COMMON, mage.cards.s.StingingBarrier.class)); cards.add(new SetCardInfo("Stone Rain", 215, Rarity.COMMON, mage.cards.s.StoneRain.class)); cards.add(new SetCardInfo("Story Circle", 51, Rarity.UNCOMMON, mage.cards.s.StoryCircle.class)); - cards.add(new SetCardInfo("Strongarm Thug", 165, Rarity.COMMON, mage.cards.s.StrongarmThug.class)); + cards.add(new SetCardInfo("Strongarm Thug", 165, Rarity.UNCOMMON, mage.cards.s.StrongarmThug.class)); cards.add(new SetCardInfo("Subterranean Hangar", 329, Rarity.UNCOMMON, mage.cards.s.SubterraneanHangar.class)); cards.add(new SetCardInfo("Sustenance", 278, Rarity.UNCOMMON, mage.cards.s.Sustenance.class)); cards.add(new SetCardInfo("Swamp", 339, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); diff --git a/Mage.Sets/src/mage/sets/Mirage.java b/Mage.Sets/src/mage/sets/Mirage.java index ff6d1c12dee..4a45154f428 100644 --- a/Mage.Sets/src/mage/sets/Mirage.java +++ b/Mage.Sets/src/mage/sets/Mirage.java @@ -1,12 +1,10 @@ package mage.sets; import mage.cards.ExpansionSet; -import mage.cards.d.Delirium; import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author North */ public final class Mirage extends ExpansionSet { @@ -26,6 +24,7 @@ public final class Mirage extends ExpansionSet { this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; + cards.add(new SetCardInfo("Abyssal Hunter", 103, Rarity.RARE, mage.cards.a.AbyssalHunter.class)); cards.add(new SetCardInfo("Afiya Grove", 205, Rarity.RARE, mage.cards.a.AfiyaGrove.class)); cards.add(new SetCardInfo("Afterlife", 1, Rarity.UNCOMMON, mage.cards.a.Afterlife.class)); @@ -84,7 +83,7 @@ public final class Mirage extends ExpansionSet { cards.add(new SetCardInfo("Dark Banishing", 115, Rarity.COMMON, mage.cards.d.DarkBanishing.class)); cards.add(new SetCardInfo("Dark Ritual", 116, Rarity.COMMON, mage.cards.d.DarkRitual.class)); cards.add(new SetCardInfo("Dazzling Beauty", 8, Rarity.COMMON, mage.cards.d.DazzlingBeauty.class)); - cards.add(new SetCardInfo("Delirium", 260, Rarity.UNCOMMON, Delirium.class)); + cards.add(new SetCardInfo("Delirium", 260, Rarity.UNCOMMON, mage.cards.d.Delirium.class)); cards.add(new SetCardInfo("Dirtwater Wraith", 117, Rarity.COMMON, mage.cards.d.DirtwaterWraith.class)); cards.add(new SetCardInfo("Disempower", 9, Rarity.COMMON, mage.cards.d.Disempower.class)); cards.add(new SetCardInfo("Disenchant", 10, Rarity.COMMON, mage.cards.d.Disenchant.class)); @@ -245,6 +244,7 @@ public final class Mirage extends ExpansionSet { cards.add(new SetCardInfo("Ritual of Steel", 36, Rarity.COMMON, mage.cards.r.RitualOfSteel.class)); cards.add(new SetCardInfo("Rock Basilisk", 279, Rarity.RARE, mage.cards.r.RockBasilisk.class)); cards.add(new SetCardInfo("Rocky Tar Pit", 329, Rarity.UNCOMMON, mage.cards.r.RockyTarPit.class)); + cards.add(new SetCardInfo("Roots of Life", 237, Rarity.UNCOMMON, mage.cards.r.RootsOfLife.class)); cards.add(new SetCardInfo("Sabertooth Cobra", 238, Rarity.COMMON, mage.cards.s.SabertoothCobra.class)); cards.add(new SetCardInfo("Sacred Mesa", 37, Rarity.RARE, mage.cards.s.SacredMesa.class)); cards.add(new SetCardInfo("Sandbar Crocodile", 88, Rarity.COMMON, mage.cards.s.SandbarCrocodile.class)); @@ -329,4 +329,4 @@ public final class Mirage extends ExpansionSet { cards.add(new SetCardInfo("Zombie Mob", 153, Rarity.UNCOMMON, mage.cards.z.ZombieMob.class)); cards.add(new SetCardInfo("Zuberi, Golden Feather", 51, Rarity.RARE, mage.cards.z.ZuberiGoldenFeather.class)); } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/ModernMasters2015.java b/Mage.Sets/src/mage/sets/ModernMasters2015.java index 0e8f97315e4..32302982315 100644 --- a/Mage.Sets/src/mage/sets/ModernMasters2015.java +++ b/Mage.Sets/src/mage/sets/ModernMasters2015.java @@ -1,4 +1,3 @@ - package mage.sets; import mage.cards.ExpansionSet; @@ -243,7 +242,7 @@ public final class ModernMasters2015 extends ExpansionSet { cards.add(new SetCardInfo("Sylvan Bounty", 164, Rarity.COMMON, mage.cards.s.SylvanBounty.class)); cards.add(new SetCardInfo("Taj-Nar Swordsmith", 36, Rarity.UNCOMMON, mage.cards.t.TajNarSwordsmith.class)); cards.add(new SetCardInfo("Tarmogoyf", 165, Rarity.MYTHIC, mage.cards.t.Tarmogoyf.class)); - cards.add(new SetCardInfo("Telling Time", 61, Rarity.UNCOMMON, mage.cards.t.TellingTime.class)); + cards.add(new SetCardInfo("Telling Time", 61, Rarity.COMMON, mage.cards.t.TellingTime.class)); cards.add(new SetCardInfo("Terashi's Grasp", 37, Rarity.COMMON, mage.cards.t.TerashisGrasp.class)); cards.add(new SetCardInfo("Tezzeret's Gambit", 63, Rarity.UNCOMMON, mage.cards.t.TezzeretsGambit.class)); cards.add(new SetCardInfo("Tezzeret the Seeker", 62, Rarity.MYTHIC, mage.cards.t.TezzeretTheSeeker.class)); diff --git a/Mage.Sets/src/mage/sets/NinthEdition.java b/Mage.Sets/src/mage/sets/NinthEdition.java index 2996fb9c077..93759bbb0f3 100644 --- a/Mage.Sets/src/mage/sets/NinthEdition.java +++ b/Mage.Sets/src/mage/sets/NinthEdition.java @@ -1,8 +1,6 @@ package mage.sets; import mage.cards.ExpansionSet; -import mage.cards.f.FishliverOil; -import mage.cards.r.RukhEgg; import mage.constants.Rarity; import mage.constants.SetType; @@ -22,6 +20,7 @@ public final class NinthEdition extends ExpansionSet { this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; + cards.add(new SetCardInfo("Adarkar Wastes", 317, Rarity.RARE, mage.cards.a.AdarkarWastes.class)); cards.add(new SetCardInfo("Air Elemental", 58, Rarity.UNCOMMON, mage.cards.a.AirElemental.class)); cards.add(new SetCardInfo("Aladdin's Ring", 286, Rarity.RARE, mage.cards.a.AladdinsRing.class)); @@ -110,7 +109,7 @@ public final class NinthEdition extends ExpansionSet { cards.add(new SetCardInfo("Festering Goblin", 130, Rarity.COMMON, mage.cards.f.FesteringGoblin.class)); cards.add(new SetCardInfo("Final Punishment", 131, Rarity.RARE, mage.cards.f.FinalPunishment.class)); cards.add(new SetCardInfo("Firebreathing", 181, Rarity.COMMON, mage.cards.f.Firebreathing.class)); - cards.add(new SetCardInfo("Fishliver Oil", 77, Rarity.COMMON, FishliverOil.class)); + cards.add(new SetCardInfo("Fishliver Oil", 77, Rarity.COMMON, mage.cards.f.FishliverOil.class)); cards.add(new SetCardInfo("Flame Wave", 182, Rarity.UNCOMMON, mage.cards.f.FlameWave.class)); cards.add(new SetCardInfo("Flashfires", 183, Rarity.UNCOMMON, mage.cards.f.Flashfires.class)); cards.add(new SetCardInfo("Fleeting Image", 78, Rarity.RARE, mage.cards.f.FleetingImage.class)); @@ -266,7 +265,7 @@ public final class NinthEdition extends ExpansionSet { cards.add(new SetCardInfo("Rootbreaker Wurm", 267, Rarity.UNCOMMON, mage.cards.r.RootbreakerWurm.class)); cards.add(new SetCardInfo("Rootwalla", 268, Rarity.COMMON, mage.cards.r.Rootwalla.class)); cards.add(new SetCardInfo("Royal Assassin", 159, Rarity.RARE, mage.cards.r.RoyalAssassin.class)); - cards.add(new SetCardInfo("Rukh Egg", 214, Rarity.RARE, RukhEgg.class)); + cards.add(new SetCardInfo("Rukh Egg", 214, Rarity.RARE, mage.cards.r.RukhEgg.class)); cards.add(new SetCardInfo("Sacred Ground", 37, Rarity.RARE, mage.cards.s.SacredGround.class)); cards.add(new SetCardInfo("Sacred Nectar", 38, Rarity.COMMON, mage.cards.s.SacredNectar.class)); cards.add(new SetCardInfo("Sage Aven", 95, Rarity.COMMON, mage.cards.s.SageAven.class)); @@ -338,9 +337,9 @@ public final class NinthEdition extends ExpansionSet { cards.add(new SetCardInfo("Underworld Dreams", 167, Rarity.RARE, mage.cards.u.UnderworldDreams.class)); cards.add(new SetCardInfo("Unholy Strength", 168, Rarity.COMMON, mage.cards.u.UnholyStrength.class)); cards.add(new SetCardInfo("Ur-Golem's Eye", 314, Rarity.UNCOMMON, mage.cards.u.UrGolemsEye.class)); - cards.add(new SetCardInfo("Urza's Mine", 327, Rarity.COMMON, mage.cards.u.UrzasMine.class)); - cards.add(new SetCardInfo("Urza's Power Plant", 328, Rarity.COMMON, mage.cards.u.UrzasPowerPlant.class)); - cards.add(new SetCardInfo("Urza's Tower", 329, Rarity.COMMON, mage.cards.u.UrzasTower.class)); + cards.add(new SetCardInfo("Urza's Mine", 327, Rarity.UNCOMMON, mage.cards.u.UrzasMine.class)); + cards.add(new SetCardInfo("Urza's Power Plant", 328, Rarity.UNCOMMON, mage.cards.u.UrzasPowerPlant.class)); + cards.add(new SetCardInfo("Urza's Tower", 329, Rarity.UNCOMMON, mage.cards.u.UrzasTower.class)); cards.add(new SetCardInfo("Utopia Tree", 277, Rarity.RARE, mage.cards.u.UtopiaTree.class)); cards.add(new SetCardInfo("Venerable Monk", 51, Rarity.COMMON, mage.cards.v.VenerableMonk.class)); cards.add(new SetCardInfo("Verdant Force", 278, Rarity.RARE, mage.cards.v.VerdantForce.class)); @@ -372,5 +371,4 @@ public final class NinthEdition extends ExpansionSet { cards.add(new SetCardInfo("Zombify", 171, Rarity.UNCOMMON, mage.cards.z.Zombify.class)); cards.add(new SetCardInfo("Zur's Weirding", 114, Rarity.RARE, mage.cards.z.ZursWeirding.class)); } - -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/NinthEditionBox.java b/Mage.Sets/src/mage/sets/NinthEditionBox.java index 10f11dfaccb..91b9c315111 100644 --- a/Mage.Sets/src/mage/sets/NinthEditionBox.java +++ b/Mage.Sets/src/mage/sets/NinthEditionBox.java @@ -15,6 +15,8 @@ public final class NinthEditionBox extends ExpansionSet { private NinthEditionBox() { super("Ninth Edition Box", "9EB", ExpansionSet.buildDate(2005, 7, 29), SetType.CORE); this.hasBoosters = false; + this.hasBasicLands = false; + cards.add(new SetCardInfo("Coral Eel", 3, Rarity.COMMON, mage.cards.c.CoralEel.class)); cards.add(new SetCardInfo("Eager Cadet", 1, Rarity.COMMON, mage.cards.e.EagerCadet.class)); cards.add(new SetCardInfo("Enormous Baloth", 9, Rarity.UNCOMMON, mage.cards.e.EnormousBaloth.class)); diff --git a/Mage.Sets/src/mage/sets/OathOfTheGatewatch.java b/Mage.Sets/src/mage/sets/OathOfTheGatewatch.java index e99f121ea51..b0c75fda4a9 100644 --- a/Mage.Sets/src/mage/sets/OathOfTheGatewatch.java +++ b/Mage.Sets/src/mage/sets/OathOfTheGatewatch.java @@ -9,7 +9,6 @@ import mage.cards.ExpansionSet; import mage.cards.repository.CardCriteria; import mage.cards.repository.CardInfo; import mage.cards.repository.CardRepository; -import mage.cards.w.Wastes; import mage.constants.Rarity; import mage.constants.SetType; @@ -17,7 +16,6 @@ import java.util.ArrayList; import java.util.List; /** - * * @author fireshoes */ public final class OathOfTheGatewatch extends ExpansionSet { @@ -35,13 +33,14 @@ public final class OathOfTheGatewatch extends ExpansionSet { this.blockName = "Battle for Zendikar"; this.parentSet = BattleForZendikar.getInstance(); this.hasBoosters = true; - this.hasBasicLands = false; + this.hasBasicLands = true; this.numBoosterLands = 1; this.numBoosterCommon = 10; this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 8; this.ratioBoosterSpecialLand = 48; + cards.add(new SetCardInfo("Abstruse Interference", 40, Rarity.COMMON, mage.cards.a.AbstruseInterference.class)); cards.add(new SetCardInfo("Affa Protector", 14, Rarity.COMMON, mage.cards.a.AffaProtector.class)); cards.add(new SetCardInfo("Akoum Flameseeker", 101, Rarity.COMMON, mage.cards.a.AkoumFlameseeker.class)); @@ -218,10 +217,10 @@ public final class OathOfTheGatewatch extends ExpansionSet { cards.add(new SetCardInfo("Wandering Fumarole", 182, Rarity.RARE, mage.cards.w.WanderingFumarole.class)); cards.add(new SetCardInfo("Warden of Geometries", 11, Rarity.COMMON, mage.cards.w.WardenOfGeometries.class)); cards.add(new SetCardInfo("Warping Wail", 12, Rarity.UNCOMMON, mage.cards.w.WarpingWail.class)); - cards.add(new SetCardInfo("Wastes", "183a", Rarity.LAND, Wastes.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Wastes", "183b", Rarity.LAND, Wastes.class, FULL_ART_BFZ_VARIOUS)); - cards.add(new SetCardInfo("Wastes", "184a", Rarity.LAND, Wastes.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Wastes", "184b", Rarity.LAND, Wastes.class, FULL_ART_BFZ_VARIOUS)); + cards.add(new SetCardInfo("Wastes", "183a", Rarity.LAND, mage.cards.w.Wastes.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Wastes", "183b", Rarity.LAND, mage.cards.w.Wastes.class, FULL_ART_BFZ_VARIOUS)); + cards.add(new SetCardInfo("Wastes", "184a", Rarity.LAND, mage.cards.w.Wastes.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Wastes", "184b", Rarity.LAND, mage.cards.w.Wastes.class, FULL_ART_BFZ_VARIOUS)); cards.add(new SetCardInfo("Weapons Trainer", 160, Rarity.UNCOMMON, mage.cards.w.WeaponsTrainer.class)); cards.add(new SetCardInfo("Witness the End", 82, Rarity.COMMON, mage.cards.w.WitnessTheEnd.class)); cards.add(new SetCardInfo("World Breaker", 126, Rarity.MYTHIC, mage.cards.w.WorldBreaker.class)); @@ -242,4 +241,4 @@ public final class OathOfTheGatewatch extends ExpansionSet { return new ArrayList<>(savedSpecialLand); } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/Odyssey.java b/Mage.Sets/src/mage/sets/Odyssey.java index b730110daa9..ac86aa2ac8e 100644 --- a/Mage.Sets/src/mage/sets/Odyssey.java +++ b/Mage.Sets/src/mage/sets/Odyssey.java @@ -1,4 +1,3 @@ - package mage.sets; import mage.cards.ExpansionSet; @@ -297,7 +296,7 @@ public final class Odyssey extends ExpansionSet { cards.add(new SetCardInfo("Second Thoughts", 45, Rarity.COMMON, mage.cards.s.SecondThoughts.class)); cards.add(new SetCardInfo("Seize the Day", 220, Rarity.RARE, mage.cards.s.SeizeTheDay.class)); cards.add(new SetCardInfo("Seton, Krosan Protector", 267, Rarity.RARE, mage.cards.s.SetonKrosanProtector.class)); - cards.add(new SetCardInfo("Seton's Desire", 268, Rarity.UNCOMMON, mage.cards.s.SetonsDesire.class)); + cards.add(new SetCardInfo("Seton's Desire", 268, Rarity.COMMON, mage.cards.s.SetonsDesire.class)); cards.add(new SetCardInfo("Shadowblood Egg", 308, Rarity.UNCOMMON, mage.cards.s.ShadowbloodEgg.class)); cards.add(new SetCardInfo("Shadowblood Ridge", 326, Rarity.RARE, mage.cards.s.ShadowbloodRidge.class)); cards.add(new SetCardInfo("Shadowmage Infiltrator", 294, Rarity.RARE, mage.cards.s.ShadowmageInfiltrator.class)); diff --git a/Mage.Sets/src/mage/sets/Onslaught.java b/Mage.Sets/src/mage/sets/Onslaught.java index 4f6bfaebab0..59bdc6e6579 100644 --- a/Mage.Sets/src/mage/sets/Onslaught.java +++ b/Mage.Sets/src/mage/sets/Onslaught.java @@ -350,7 +350,7 @@ public final class Onslaught extends ExpansionSet { cards.add(new SetCardInfo("Windswept Heath", 328, Rarity.RARE, mage.cards.w.WindsweptHeath.class, new CardGraphicInfo(new ObjectColor("GW"), null, false))); cards.add(new SetCardInfo("Wirewood Elf", 301, Rarity.COMMON, mage.cards.w.WirewoodElf.class)); cards.add(new SetCardInfo("Wirewood Herald", 302, Rarity.COMMON, mage.cards.w.WirewoodHerald.class)); - cards.add(new SetCardInfo("Wirewood Lodge", 329, Rarity.RARE, mage.cards.w.WirewoodLodge.class)); + cards.add(new SetCardInfo("Wirewood Lodge", 329, Rarity.UNCOMMON, mage.cards.w.WirewoodLodge.class)); cards.add(new SetCardInfo("Wirewood Pride", 303, Rarity.COMMON, mage.cards.w.WirewoodPride.class)); cards.add(new SetCardInfo("Wirewood Savage", 304, Rarity.COMMON, mage.cards.w.WirewoodSavage.class)); cards.add(new SetCardInfo("Withering Hex", 181, Rarity.UNCOMMON, mage.cards.w.WitheringHex.class)); diff --git a/Mage.Sets/src/mage/sets/Planechase2012.java b/Mage.Sets/src/mage/sets/Planechase2012Edition.java similarity index 98% rename from Mage.Sets/src/mage/sets/Planechase2012.java rename to Mage.Sets/src/mage/sets/Planechase2012Edition.java index e13d480a039..3b456a8d7f7 100644 --- a/Mage.Sets/src/mage/sets/Planechase2012.java +++ b/Mage.Sets/src/mage/sets/Planechase2012Edition.java @@ -1,4 +1,3 @@ - package mage.sets; import mage.cards.ExpansionSet; @@ -6,20 +5,20 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author LevelX2 */ -public final class Planechase2012 extends ExpansionSet { +public final class Planechase2012Edition extends ExpansionSet { - private static final Planechase2012 instance = new Planechase2012(); + private static final Planechase2012Edition instance = new Planechase2012Edition(); - public static Planechase2012 getInstance() { + public static Planechase2012Edition getInstance() { return instance; } - private Planechase2012() { + private Planechase2012Edition() { super("Planechase 2012 Edition", "PC2", ExpansionSet.buildDate(2012, 6, 1), SetType.SUPPLEMENTAL); this.blockName = "Command Zone"; + cards.add(new SetCardInfo("Arc Trail", 39, Rarity.UNCOMMON, mage.cards.a.ArcTrail.class)); cards.add(new SetCardInfo("Armillary Sphere", 108, Rarity.COMMON, mage.cards.a.ArmillarySphere.class)); cards.add(new SetCardInfo("Armored Griffin", 1, Rarity.UNCOMMON, mage.cards.a.ArmoredGriffin.class)); @@ -50,7 +49,7 @@ public final class Planechase2012 extends ExpansionSet { cards.add(new SetCardInfo("Dimir Infiltrator", 86, Rarity.COMMON, mage.cards.d.DimirInfiltrator.class)); cards.add(new SetCardInfo("Dowsing Shaman", 63, Rarity.UNCOMMON, mage.cards.d.DowsingShaman.class)); cards.add(new SetCardInfo("Dragonlair Spider", 87, Rarity.RARE, mage.cards.d.DragonlairSpider.class)); - cards.add(new SetCardInfo("Dreampod Druid", 64, Rarity.RARE, mage.cards.d.DreampodDruid.class)); + cards.add(new SetCardInfo("Dreampod Druid", 64, Rarity.UNCOMMON, mage.cards.d.DreampodDruid.class)); cards.add(new SetCardInfo("Elderwood Scion", 88, Rarity.RARE, mage.cards.e.ElderwoodScion.class)); cards.add(new SetCardInfo("Enigma Sphinx", 89, Rarity.RARE, mage.cards.e.EnigmaSphinx.class)); cards.add(new SetCardInfo("Enlisted Wurm", 90, Rarity.UNCOMMON, mage.cards.e.EnlistedWurm.class)); diff --git a/Mage.Sets/src/mage/sets/Planeshift.java b/Mage.Sets/src/mage/sets/Planeshift.java index eec82b0af45..57a70190de4 100644 --- a/Mage.Sets/src/mage/sets/Planeshift.java +++ b/Mage.Sets/src/mage/sets/Planeshift.java @@ -2,14 +2,10 @@ package mage.sets; import mage.cards.ExpansionSet; -import mage.cards.e.ErtaiTheCorrupted; -import mage.cards.s.SkyshipWeatherlight; -import mage.cards.t.TahngarthTalruumHero; import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author North */ public final class Planeshift extends ExpansionSet { @@ -31,6 +27,7 @@ public final class Planeshift extends ExpansionSet { this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; + cards.add(new SetCardInfo("Allied Strategies", 20, Rarity.UNCOMMON, mage.cards.a.AlliedStrategies.class)); cards.add(new SetCardInfo("Alpha Kavu", 77, Rarity.UNCOMMON, mage.cards.a.AlphaKavu.class)); cards.add(new SetCardInfo("Ancient Spider", 96, Rarity.RARE, mage.cards.a.AncientSpider.class)); @@ -61,8 +58,8 @@ public final class Planeshift extends ExpansionSet { cards.add(new SetCardInfo("Dromar's Charm", 105, Rarity.UNCOMMON, mage.cards.d.DromarsCharm.class)); cards.add(new SetCardInfo("Eladamri's Call", 106, Rarity.RARE, mage.cards.e.EladamrisCall.class)); cards.add(new SetCardInfo("Ertai's Trickery", 24, Rarity.UNCOMMON, mage.cards.e.ErtaisTrickery.class)); - cards.add(new SetCardInfo("Ertai, the Corrupted", "107a", Rarity.RARE, ErtaiTheCorrupted.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Ertai, the Corrupted", "107b", Rarity.RARE, ErtaiTheCorrupted.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Ertai, the Corrupted", "107a", Rarity.RARE, mage.cards.e.ErtaiTheCorrupted.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Ertai, the Corrupted", "107b", Rarity.RARE, mage.cards.e.ErtaiTheCorrupted.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Escape Routes", 25, Rarity.COMMON, mage.cards.e.EscapeRoutes.class)); cards.add(new SetCardInfo("Exotic Disease", 43, Rarity.UNCOMMON, mage.cards.e.ExoticDisease.class)); cards.add(new SetCardInfo("Falling Timber", 79, Rarity.COMMON, mage.cards.f.FallingTimber.class)); @@ -139,8 +136,8 @@ public final class Planeshift extends ExpansionSet { cards.add(new SetCardInfo("Singe", 71, Rarity.COMMON, mage.cards.s.Singe.class)); cards.add(new SetCardInfo("Sinister Strength", 54, Rarity.COMMON, mage.cards.s.SinisterStrength.class)); cards.add(new SetCardInfo("Sisay's Ingenuity", 33, Rarity.COMMON, mage.cards.s.SisaysIngenuity.class)); - cards.add(new SetCardInfo("Skyship Weatherlight", "133a", Rarity.RARE, SkyshipWeatherlight.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Skyship Weatherlight", "133b", Rarity.RARE, SkyshipWeatherlight.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Skyship Weatherlight", "133a", Rarity.RARE, mage.cards.s.SkyshipWeatherlight.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Skyship Weatherlight", "133b", Rarity.RARE, mage.cards.s.SkyshipWeatherlight.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Skyshroud Blessing", 92, Rarity.UNCOMMON, mage.cards.s.SkyshroudBlessing.class)); cards.add(new SetCardInfo("Slay", 55, Rarity.UNCOMMON, mage.cards.s.Slay.class)); cards.add(new SetCardInfo("Sleeping Potion", 34, Rarity.COMMON, mage.cards.s.SleepingPotion.class)); @@ -157,8 +154,8 @@ public final class Planeshift extends ExpansionSet { cards.add(new SetCardInfo("Sunscape Battlemage", 16, Rarity.UNCOMMON, mage.cards.s.SunscapeBattlemage.class)); cards.add(new SetCardInfo("Sunscape Familiar", 17, Rarity.COMMON, mage.cards.s.SunscapeFamiliar.class)); cards.add(new SetCardInfo("Surprise Deployment", 18, Rarity.UNCOMMON, mage.cards.s.SurpriseDeployment.class)); - cards.add(new SetCardInfo("Tahngarth, Talruum Hero", "74a", Rarity.RARE, TahngarthTalruumHero.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Tahngarth, Talruum Hero", "74b", Rarity.RARE, TahngarthTalruumHero.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Tahngarth, Talruum Hero", "74a", Rarity.RARE, mage.cards.t.TahngarthTalruumHero.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Tahngarth, Talruum Hero", "74b", Rarity.RARE, mage.cards.t.TahngarthTalruumHero.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Terminal Moraine", 142, Rarity.UNCOMMON, mage.cards.t.TerminalMoraine.class)); cards.add(new SetCardInfo("Terminate", 128, Rarity.COMMON, mage.cards.t.Terminate.class)); cards.add(new SetCardInfo("Thornscape Battlemage", 94, Rarity.UNCOMMON, mage.cards.t.ThornscapeBattlemage.class)); @@ -173,4 +170,4 @@ public final class Planeshift extends ExpansionSet { cards.add(new SetCardInfo("Warped Devotion", 57, Rarity.UNCOMMON, mage.cards.w.WarpedDevotion.class)); cards.add(new SetCardInfo("Waterspout Elemental", 38, Rarity.RARE, mage.cards.w.WaterspoutElemental.class)); } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/Portal.java b/Mage.Sets/src/mage/sets/Portal.java index 81162ed77cf..822317e27b6 100644 --- a/Mage.Sets/src/mage/sets/Portal.java +++ b/Mage.Sets/src/mage/sets/Portal.java @@ -2,14 +2,10 @@ package mage.sets; import mage.cards.ExpansionSet; -import mage.cards.d.DrySpell; -import mage.cards.e.EliteCatWarrior; -import mage.cards.w.WarriorsCharge; import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author Plopman */ public final class Portal extends ExpansionSet { @@ -17,7 +13,6 @@ public final class Portal extends ExpansionSet { private static final Portal instance = new Portal(); /** - * * @return */ public static Portal getInstance() { @@ -34,6 +29,7 @@ public final class Portal extends ExpansionSet { this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; + cards.add(new SetCardInfo("Alabaster Dragon", 1, Rarity.RARE, mage.cards.a.AlabasterDragon.class)); cards.add(new SetCardInfo("Alluring Scent", 157, Rarity.RARE, mage.cards.a.AlluringScent.class)); cards.add(new SetCardInfo("Anaconda", "158a", Rarity.UNCOMMON, mage.cards.a.Anaconda.class, NON_FULL_USE_VARIOUS)); @@ -86,11 +82,11 @@ public final class Portal extends ExpansionSet { cards.add(new SetCardInfo("Djinn of the Lamp", 52, Rarity.RARE, mage.cards.d.DjinnOfTheLamp.class)); cards.add(new SetCardInfo("Dread Charge", 88, Rarity.RARE, mage.cards.d.DreadCharge.class)); cards.add(new SetCardInfo("Dread Reaper", 89, Rarity.RARE, mage.cards.d.DreadReaper.class)); - cards.add(new SetCardInfo("Dry Spell", 90, Rarity.UNCOMMON, DrySpell.class)); + cards.add(new SetCardInfo("Dry Spell", 90, Rarity.UNCOMMON, mage.cards.d.DrySpell.class)); cards.add(new SetCardInfo("Earthquake", 124, Rarity.RARE, mage.cards.e.Earthquake.class)); cards.add(new SetCardInfo("Ebon Dragon", 91, Rarity.RARE, mage.cards.e.EbonDragon.class)); - cards.add(new SetCardInfo("Elite Cat Warrior", "163a", Rarity.COMMON, EliteCatWarrior.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Elite Cat Warrior", "163b", Rarity.COMMON, EliteCatWarrior.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Elite Cat Warrior", "163a", Rarity.COMMON, mage.cards.e.EliteCatWarrior.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Elite Cat Warrior", "163b", Rarity.COMMON, mage.cards.e.EliteCatWarrior.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Elven Cache", 164, Rarity.COMMON, mage.cards.e.ElvenCache.class)); cards.add(new SetCardInfo("Elvish Ranger", 165, Rarity.COMMON, mage.cards.e.ElvishRanger.class)); cards.add(new SetCardInfo("Endless Cockroaches", 92, Rarity.RARE, mage.cards.e.EndlessCockroaches.class)); @@ -244,8 +240,8 @@ public final class Portal extends ExpansionSet { cards.add(new SetCardInfo("Volcanic Hammer", 154, Rarity.COMMON, mage.cards.v.VolcanicHammer.class)); cards.add(new SetCardInfo("Wall of Granite", 155, Rarity.UNCOMMON, mage.cards.w.WallOfGranite.class)); cards.add(new SetCardInfo("Wall of Swords", 37, Rarity.UNCOMMON, mage.cards.w.WallOfSwords.class)); - cards.add(new SetCardInfo("Warrior's Charge", "38a", Rarity.COMMON, WarriorsCharge.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Warrior's Charge", "38b", Rarity.COMMON, WarriorsCharge.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Warrior's Charge", "38a", Rarity.COMMON, mage.cards.w.WarriorsCharge.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Warrior's Charge", "38b", Rarity.COMMON, mage.cards.w.WarriorsCharge.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Whiptail Wurm", 192, Rarity.UNCOMMON, mage.cards.w.WhiptailWurm.class)); cards.add(new SetCardInfo("Wicked Pact", 117, Rarity.RARE, mage.cards.w.WickedPact.class)); cards.add(new SetCardInfo("Willow Dryad", 193, Rarity.COMMON, mage.cards.w.WillowDryad.class)); @@ -256,4 +252,4 @@ public final class Portal extends ExpansionSet { cards.add(new SetCardInfo("Wood Elves", 195, Rarity.RARE, mage.cards.w.WoodElves.class)); cards.add(new SetCardInfo("Wrath of God", 39, Rarity.RARE, mage.cards.w.WrathOfGod.class)); } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/PDSFireAndLightning.java b/Mage.Sets/src/mage/sets/PremiumDeckSeriesFireAndLightning.java similarity index 92% rename from Mage.Sets/src/mage/sets/PDSFireAndLightning.java rename to Mage.Sets/src/mage/sets/PremiumDeckSeriesFireAndLightning.java index bd31a6d69fc..ec04e84bdd1 100644 --- a/Mage.Sets/src/mage/sets/PDSFireAndLightning.java +++ b/Mage.Sets/src/mage/sets/PremiumDeckSeriesFireAndLightning.java @@ -6,21 +6,21 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author fireshoes */ -public final class PDSFireAndLightning extends ExpansionSet { +public final class PremiumDeckSeriesFireAndLightning extends ExpansionSet { - private static final PDSFireAndLightning instance = new PDSFireAndLightning(); + private static final PremiumDeckSeriesFireAndLightning instance = new PremiumDeckSeriesFireAndLightning(); - public static PDSFireAndLightning getInstance() { + public static PremiumDeckSeriesFireAndLightning getInstance() { return instance; } - private PDSFireAndLightning() { + private PremiumDeckSeriesFireAndLightning() { super("Premium Deck Series: Fire and Lightning", "PD2", ExpansionSet.buildDate(2010, 11, 1), SetType.SUPPLEMENTAL); - this.hasBasicLands = false; + this.hasBasicLands = true; + cards.add(new SetCardInfo("Ball Lightning", 12, Rarity.RARE, mage.cards.b.BallLightning.class)); cards.add(new SetCardInfo("Barbarian Ring", 28, Rarity.UNCOMMON, mage.cards.b.BarbarianRing.class)); cards.add(new SetCardInfo("Boggart Ram-Gang", 13, Rarity.UNCOMMON, mage.cards.b.BoggartRamGang.class)); diff --git a/Mage.Sets/src/mage/sets/PDSGraveborn.java b/Mage.Sets/src/mage/sets/PremiumDeckSeriesGraveborn.java similarity index 92% rename from Mage.Sets/src/mage/sets/PDSGraveborn.java rename to Mage.Sets/src/mage/sets/PremiumDeckSeriesGraveborn.java index d3295c88978..35dcb392342 100644 --- a/Mage.Sets/src/mage/sets/PDSGraveborn.java +++ b/Mage.Sets/src/mage/sets/PremiumDeckSeriesGraveborn.java @@ -6,20 +6,20 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author fireshoes */ -public final class PDSGraveborn extends ExpansionSet { +public final class PremiumDeckSeriesGraveborn extends ExpansionSet { - private static final PDSGraveborn instance = new PDSGraveborn(); + private static final PremiumDeckSeriesGraveborn instance = new PremiumDeckSeriesGraveborn(); - public static PDSGraveborn getInstance() { + public static PremiumDeckSeriesGraveborn getInstance() { return instance; } - private PDSGraveborn() { + private PremiumDeckSeriesGraveborn() { super("Premium Deck Series: Graveborn", "PD3", ExpansionSet.buildDate(2011, 11, 1), SetType.SUPPLEMENTAL); - this.hasBasicLands = false; + this.hasBasicLands = true; + cards.add(new SetCardInfo("Animate Dead", 16, Rarity.UNCOMMON, mage.cards.a.AnimateDead.class)); cards.add(new SetCardInfo("Avatar of Woe", 6, Rarity.RARE, mage.cards.a.AvatarOfWoe.class)); cards.add(new SetCardInfo("Blazing Archon", 11, Rarity.RARE, mage.cards.b.BlazingArchon.class)); diff --git a/Mage.Sets/src/mage/sets/PDSSlivers.java b/Mage.Sets/src/mage/sets/PremiumDeckSeriesSlivers.java similarity index 94% rename from Mage.Sets/src/mage/sets/PDSSlivers.java rename to Mage.Sets/src/mage/sets/PremiumDeckSeriesSlivers.java index 62f6d53f18d..0dcd4dffc50 100644 --- a/Mage.Sets/src/mage/sets/PDSSlivers.java +++ b/Mage.Sets/src/mage/sets/PremiumDeckSeriesSlivers.java @@ -6,20 +6,20 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author fireshoes */ -public final class PDSSlivers extends ExpansionSet { +public final class PremiumDeckSeriesSlivers extends ExpansionSet { - private static final PDSSlivers instance = new PDSSlivers(); + private static final PremiumDeckSeriesSlivers instance = new PremiumDeckSeriesSlivers(); - public static PDSSlivers getInstance() { + public static PremiumDeckSeriesSlivers getInstance() { return instance; } - private PDSSlivers() { + private PremiumDeckSeriesSlivers() { super("Premium Deck Series: Slivers", "H09", ExpansionSet.buildDate(2009, 11, 1), SetType.SUPPLEMENTAL); - this.hasBasicLands = false; + this.hasBasicLands = true; + cards.add(new SetCardInfo("Acidic Sliver", 13, Rarity.UNCOMMON, mage.cards.a.AcidicSliver.class)); cards.add(new SetCardInfo("Amoeboid Changeling", 3, Rarity.COMMON, mage.cards.a.AmoeboidChangeling.class)); cards.add(new SetCardInfo("Ancient Ziggurat", 31, Rarity.UNCOMMON, mage.cards.a.AncientZiggurat.class)); diff --git a/Mage.Sets/src/mage/sets/PrereleaseEvents.java b/Mage.Sets/src/mage/sets/PrereleaseEvents.java index 332dd771a68..7cd1605e9a8 100644 --- a/Mage.Sets/src/mage/sets/PrereleaseEvents.java +++ b/Mage.Sets/src/mage/sets/PrereleaseEvents.java @@ -15,7 +15,8 @@ public final class PrereleaseEvents extends ExpansionSet { private PrereleaseEvents() { super("Prerelease Events", "PTC", ExpansionSet.buildDate(1990, 1, 1), SetType.PROMOTIONAL); this.hasBoosters = false; - this.hasBasicLands = false; + this.hasBasicLands = true; + cards.add(new SetCardInfo("Abbot of Keral Keep", 198, Rarity.RARE, mage.cards.a.AbbotOfKeralKeep.class)); cards.add(new SetCardInfo("Abhorrent Overlord", 70, Rarity.SPECIAL, mage.cards.a.AbhorrentOverlord.class)); cards.add(new SetCardInfo("Abzan Ascendancy", 88, Rarity.SPECIAL, mage.cards.a.AbzanAscendancy.class)); diff --git a/Mage.Sets/src/mage/sets/RivalsOfIxalan.java b/Mage.Sets/src/mage/sets/RivalsOfIxalan.java index 54d76ef304f..e0995645d6e 100644 --- a/Mage.Sets/src/mage/sets/RivalsOfIxalan.java +++ b/Mage.Sets/src/mage/sets/RivalsOfIxalan.java @@ -6,7 +6,6 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author fireshoes */ public final class RivalsOfIxalan extends ExpansionSet { @@ -22,7 +21,7 @@ public final class RivalsOfIxalan extends ExpansionSet { this.blockName = "Ixalan"; this.parentSet = Ixalan.getInstance(); this.hasBoosters = true; - this.hasBasicLands = false; + this.hasBasicLands = true; this.numBoosterLands = 0; this.numBoosterCommon = 11; this.numBoosterUncommon = 3; diff --git a/Mage.Sets/src/mage/sets/SeventhEdition.java b/Mage.Sets/src/mage/sets/SeventhEdition.java index 20232d82bbe..bcb68617e3c 100644 --- a/Mage.Sets/src/mage/sets/SeventhEdition.java +++ b/Mage.Sets/src/mage/sets/SeventhEdition.java @@ -2,13 +2,10 @@ package mage.sets; import mage.cards.ExpansionSet; -import mage.cards.g.GoblinWarDrums; -import mage.cards.s.StormShaman; import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author North */ public final class SeventhEdition extends ExpansionSet { @@ -27,6 +24,7 @@ public final class SeventhEdition extends ExpansionSet { this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; + cards.add(new SetCardInfo("Abyssal Horror", 115, Rarity.RARE, mage.cards.a.AbyssalHorror.class)); cards.add(new SetCardInfo("Abyssal Specter", 116, Rarity.UNCOMMON, mage.cards.a.AbyssalSpecter.class)); cards.add(new SetCardInfo("Adarkar Wastes", 325, Rarity.RARE, mage.cards.a.AdarkarWastes.class)); @@ -151,7 +149,7 @@ public final class SeventhEdition extends ExpansionSet { cards.add(new SetCardInfo("Goblin Matron", 191, Rarity.UNCOMMON, mage.cards.g.GoblinMatron.class)); cards.add(new SetCardInfo("Goblin Raider", 192, Rarity.COMMON, mage.cards.g.GoblinRaider.class)); cards.add(new SetCardInfo("Goblin Spelunkers", 193, Rarity.COMMON, mage.cards.g.GoblinSpelunkers.class)); - cards.add(new SetCardInfo("Goblin War Drums", 194, Rarity.UNCOMMON, GoblinWarDrums.class)); + cards.add(new SetCardInfo("Goblin War Drums", 194, Rarity.UNCOMMON, mage.cards.g.GoblinWarDrums.class)); cards.add(new SetCardInfo("Gorilla Chieftain", 250, Rarity.COMMON, mage.cards.g.GorillaChieftain.class)); cards.add(new SetCardInfo("Grafted Skullcap", 298, Rarity.RARE, mage.cards.g.GraftedSkullcap.class)); cards.add(new SetCardInfo("Granite Grip", 195, Rarity.COMMON, mage.cards.g.GraniteGrip.class)); @@ -318,7 +316,7 @@ public final class SeventhEdition extends ExpansionSet { cards.add(new SetCardInfo("Stone Rain", 221, Rarity.COMMON, mage.cards.s.StoneRain.class)); cards.add(new SetCardInfo("Storm Cauldron", 320, Rarity.RARE, mage.cards.s.StormCauldron.class)); cards.add(new SetCardInfo("Storm Crow", 100, Rarity.COMMON, mage.cards.s.StormCrow.class)); - cards.add(new SetCardInfo("Storm Shaman", 222, Rarity.UNCOMMON, StormShaman.class)); + cards.add(new SetCardInfo("Storm Shaman", 222, Rarity.UNCOMMON, mage.cards.s.StormShaman.class)); cards.add(new SetCardInfo("Strands of Night", 165, Rarity.UNCOMMON, mage.cards.s.StrandsOfNight.class)); cards.add(new SetCardInfo("Stream of Life", 272, Rarity.COMMON, mage.cards.s.StreamOfLife.class)); cards.add(new SetCardInfo("Stronghold Assassin", 166, Rarity.RARE, mage.cards.s.StrongholdAssassin.class)); @@ -378,4 +376,4 @@ public final class SeventhEdition extends ExpansionSet { cards.add(new SetCardInfo("Yavimaya Enchantress", 285, Rarity.UNCOMMON, mage.cards.y.YavimayaEnchantress.class)); cards.add(new SetCardInfo("Yawgmoth's Edict", 171, Rarity.UNCOMMON, mage.cards.y.YawgmothsEdict.class)); } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/Shadowmoor.java b/Mage.Sets/src/mage/sets/Shadowmoor.java index 27144ed8320..769955a7816 100644 --- a/Mage.Sets/src/mage/sets/Shadowmoor.java +++ b/Mage.Sets/src/mage/sets/Shadowmoor.java @@ -2,12 +2,10 @@ package mage.sets; import mage.cards.ExpansionSet; -import mage.cards.t.Torture; import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author North */ public final class Shadowmoor extends ExpansionSet { @@ -63,17 +61,17 @@ public final class Shadowmoor extends ExpansionSet { cards.add(new SetCardInfo("Consign to Dream", 32, Rarity.COMMON, mage.cards.c.ConsignToDream.class)); cards.add(new SetCardInfo("Corrosive Mentor", 61, Rarity.UNCOMMON, mage.cards.c.CorrosiveMentor.class)); cards.add(new SetCardInfo("Corrupt", 62, Rarity.UNCOMMON, mage.cards.c.Corrupt.class)); - cards.add(new SetCardInfo("Counterbore", 33, Rarity.UNCOMMON, mage.cards.c.Counterbore.class)); + cards.add(new SetCardInfo("Counterbore", 33, Rarity.RARE, mage.cards.c.Counterbore.class)); cards.add(new SetCardInfo("Crabapple Cohort", 109, Rarity.COMMON, mage.cards.c.CrabappleCohort.class)); cards.add(new SetCardInfo("Cragganwick Cremator", 87, Rarity.RARE, mage.cards.c.CragganwickCremator.class)); - cards.add(new SetCardInfo("Crimson Wisps", 88, Rarity.UNCOMMON, mage.cards.c.CrimsonWisps.class)); + cards.add(new SetCardInfo("Crimson Wisps", 88, Rarity.COMMON, mage.cards.c.CrimsonWisps.class)); cards.add(new SetCardInfo("Crowd of Cinders", 63, Rarity.UNCOMMON, mage.cards.c.CrowdOfCinders.class)); cards.add(new SetCardInfo("Cultbrand Cinder", 182, Rarity.COMMON, mage.cards.c.CultbrandCinder.class)); - cards.add(new SetCardInfo("Cursecatcher", 34, Rarity.UNCOMMON, mage.cards.c.Cursecatcher.class)); cards.add(new SetCardInfo("Curse of Chains", 139, Rarity.COMMON, mage.cards.c.CurseOfChains.class)); + cards.add(new SetCardInfo("Cursecatcher", 34, Rarity.UNCOMMON, mage.cards.c.Cursecatcher.class)); cards.add(new SetCardInfo("Dawnglow Infusion", 225, Rarity.UNCOMMON, mage.cards.d.DawnglowInfusion.class)); - cards.add(new SetCardInfo("Deepchannel Mentor", 35, Rarity.UNCOMMON, mage.cards.d.DeepchannelMentor.class)); cards.add(new SetCardInfo("Deep-Slumber Titan", 89, Rarity.RARE, mage.cards.d.DeepSlumberTitan.class)); + cards.add(new SetCardInfo("Deepchannel Mentor", 35, Rarity.UNCOMMON, mage.cards.d.DeepchannelMentor.class)); cards.add(new SetCardInfo("Demigod of Revenge", 183, Rarity.RARE, mage.cards.d.DemigodOfRevenge.class)); cards.add(new SetCardInfo("Deus of Calamity", 204, Rarity.RARE, mage.cards.d.DeusOfCalamity.class)); cards.add(new SetCardInfo("Devoted Druid", 110, Rarity.COMMON, mage.cards.d.DevotedDruid.class)); @@ -169,9 +167,9 @@ public final class Shadowmoor extends ExpansionSet { cards.add(new SetCardInfo("Lockjaw Snapper", 255, Rarity.UNCOMMON, mage.cards.l.LockjawSnapper.class)); cards.add(new SetCardInfo("Lurebound Scarecrow", 256, Rarity.UNCOMMON, mage.cards.l.LureboundScarecrow.class)); cards.add(new SetCardInfo("Madblind Mountain", 274, Rarity.UNCOMMON, mage.cards.m.MadblindMountain.class)); + cards.add(new SetCardInfo("Mana Reflection", 122, Rarity.RARE, mage.cards.m.ManaReflection.class)); cards.add(new SetCardInfo("Manaforge Cinder", 191, Rarity.COMMON, mage.cards.m.ManaforgeCinder.class)); cards.add(new SetCardInfo("Manamorphose", 211, Rarity.COMMON, mage.cards.m.Manamorphose.class)); - cards.add(new SetCardInfo("Mana Reflection", 122, Rarity.RARE, mage.cards.m.ManaReflection.class)); cards.add(new SetCardInfo("Mass Calcify", 12, Rarity.RARE, mage.cards.m.MassCalcify.class)); cards.add(new SetCardInfo("Medicine Runner", 230, Rarity.COMMON, mage.cards.m.MedicineRunner.class)); cards.add(new SetCardInfo("Memory Plunder", 169, Rarity.RARE, mage.cards.m.MemoryPlunder.class)); @@ -199,8 +197,8 @@ public final class Shadowmoor extends ExpansionSet { cards.add(new SetCardInfo("Niveous Wisps", 15, Rarity.COMMON, mage.cards.n.NiveousWisps.class)); cards.add(new SetCardInfo("Nurturer Initiate", 124, Rarity.COMMON, mage.cards.n.NurturerInitiate.class)); cards.add(new SetCardInfo("Old Ghastbark", 232, Rarity.COMMON, mage.cards.o.OldGhastbark.class)); - cards.add(new SetCardInfo("Oona, Queen of the Fae", 172, Rarity.RARE, mage.cards.o.OonaQueenOfTheFae.class)); cards.add(new SetCardInfo("Oona's Gatewarden", 173, Rarity.COMMON, mage.cards.o.OonasGatewarden.class)); + cards.add(new SetCardInfo("Oona, Queen of the Fae", 172, Rarity.RARE, mage.cards.o.OonaQueenOfTheFae.class)); cards.add(new SetCardInfo("Oracle of Nectars", 233, Rarity.RARE, mage.cards.o.OracleOfNectars.class)); cards.add(new SetCardInfo("Order of Whiteclay", 16, Rarity.RARE, mage.cards.o.OrderOfWhiteclay.class)); cards.add(new SetCardInfo("Oversoul of Dusk", 234, Rarity.RARE, mage.cards.o.OversoulOfDusk.class)); @@ -297,7 +295,7 @@ public final class Shadowmoor extends ExpansionSet { cards.add(new SetCardInfo("Toil to Renown", 130, Rarity.COMMON, mage.cards.t.ToilToRenown.class)); cards.add(new SetCardInfo("Torpor Dust", 177, Rarity.COMMON, mage.cards.t.TorporDust.class)); cards.add(new SetCardInfo("Torrent of Souls", 199, Rarity.UNCOMMON, mage.cards.t.TorrentOfSouls.class)); - cards.add(new SetCardInfo("Torture", 80, Rarity.COMMON, Torture.class)); + cards.add(new SetCardInfo("Torture", 80, Rarity.COMMON, mage.cards.t.Torture.class)); cards.add(new SetCardInfo("Tower Above", 131, Rarity.UNCOMMON, mage.cards.t.TowerAbove.class)); cards.add(new SetCardInfo("Traitor's Roar", 200, Rarity.COMMON, mage.cards.t.TraitorsRoar.class)); cards.add(new SetCardInfo("Trip Noose", 266, Rarity.UNCOMMON, mage.cards.t.TripNoose.class)); @@ -314,8 +312,8 @@ public final class Shadowmoor extends ExpansionSet { cards.add(new SetCardInfo("Wheel of Sun and Moon", 243, Rarity.RARE, mage.cards.w.WheelOfSunAndMoon.class)); cards.add(new SetCardInfo("Whimwader", 54, Rarity.COMMON, mage.cards.w.Whimwader.class)); cards.add(new SetCardInfo("Wicker Warcrawler", 269, Rarity.UNCOMMON, mage.cards.w.WickerWarcrawler.class)); - cards.add(new SetCardInfo("Wildslayer Elves", 133, Rarity.COMMON, mage.cards.w.WildslayerElves.class)); cards.add(new SetCardInfo("Wild Swing", 108, Rarity.UNCOMMON, mage.cards.w.WildSwing.class)); + cards.add(new SetCardInfo("Wildslayer Elves", 133, Rarity.COMMON, mage.cards.w.WildslayerElves.class)); cards.add(new SetCardInfo("Wilt-Leaf Cavaliers", 244, Rarity.UNCOMMON, mage.cards.w.WiltLeafCavaliers.class)); cards.add(new SetCardInfo("Wilt-Leaf Liege", 245, Rarity.RARE, mage.cards.w.WiltLeafLiege.class)); cards.add(new SetCardInfo("Windbrisk Raptor", 26, Rarity.RARE, mage.cards.w.WindbriskRaptor.class)); diff --git a/Mage.Sets/src/mage/sets/Starter1999.java b/Mage.Sets/src/mage/sets/Starter1999.java index a2dfcb04873..e7e5d8050ca 100644 --- a/Mage.Sets/src/mage/sets/Starter1999.java +++ b/Mage.Sets/src/mage/sets/Starter1999.java @@ -1,4 +1,3 @@ - package mage.sets; import mage.cards.ExpansionSet; @@ -86,7 +85,7 @@ public final class Starter1999 extends ExpansionSet { cards.add(new SetCardInfo("Goblin Commando", 100, Rarity.UNCOMMON, mage.cards.g.GoblinCommando.class)); cards.add(new SetCardInfo("Goblin General", 101, Rarity.UNCOMMON, mage.cards.g.GoblinGeneral.class)); cards.add(new SetCardInfo("Goblin Glider", 102, Rarity.UNCOMMON, mage.cards.g.GoblinGlider.class)); - cards.add(new SetCardInfo("Goblin Hero", 103, Rarity.RARE, mage.cards.g.GoblinHero.class)); + cards.add(new SetCardInfo("Goblin Hero", 103, Rarity.COMMON, mage.cards.g.GoblinHero.class)); cards.add(new SetCardInfo("Goblin Lore", 104, Rarity.UNCOMMON, mage.cards.g.GoblinLore.class)); cards.add(new SetCardInfo("Goblin Mountaineer", 105, Rarity.COMMON, mage.cards.g.GoblinMountaineer.class)); cards.add(new SetCardInfo("Goblin Settler", 106, Rarity.UNCOMMON, mage.cards.g.GoblinSettler.class)); @@ -114,7 +113,7 @@ public final class Starter1999 extends ExpansionSet { cards.add(new SetCardInfo("Man-o'-War", 41, Rarity.UNCOMMON, mage.cards.m.ManOWar.class)); cards.add(new SetCardInfo("Merfolk of the Pearl Trident", 42, Rarity.COMMON, mage.cards.m.MerfolkOfThePearlTrident.class)); cards.add(new SetCardInfo("Mind Rot", 83, Rarity.COMMON, mage.cards.m.MindRot.class)); - cards.add(new SetCardInfo("Mons's Goblin Raiders", 112, Rarity.RARE, mage.cards.m.MonssGoblinRaiders.class)); + cards.add(new SetCardInfo("Mons's Goblin Raiders", 112, Rarity.COMMON, mage.cards.m.MonssGoblinRaiders.class)); cards.add(new SetCardInfo("Monstrous Growth", 132, Rarity.COMMON, mage.cards.m.MonstrousGrowth.class)); cards.add(new SetCardInfo("Moon Sprite", 133, Rarity.UNCOMMON, mage.cards.m.MoonSprite.class)); cards.add(new SetCardInfo("Mountain", 166, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); diff --git a/Mage.Sets/src/mage/sets/SuperSeries.java b/Mage.Sets/src/mage/sets/SuperSeries.java index 5d4ce44b78e..c50c19245e2 100644 --- a/Mage.Sets/src/mage/sets/SuperSeries.java +++ b/Mage.Sets/src/mage/sets/SuperSeries.java @@ -6,7 +6,6 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author fireshoes */ public final class SuperSeries extends ExpansionSet { @@ -20,6 +19,8 @@ public final class SuperSeries extends ExpansionSet { private SuperSeries() { super("Super Series", "SUS", ExpansionSet.buildDate(1996, 1, 1), SetType.PROMOTIONAL); this.hasBoosters = false; + this.hasBasicLands = false; + cards.add(new SetCardInfo("City of Brass", 6, Rarity.SPECIAL, mage.cards.c.CityOfBrass.class)); cards.add(new SetCardInfo("Crusade", 4, Rarity.SPECIAL, mage.cards.c.Crusade.class)); cards.add(new SetCardInfo("Elvish Champion", 17, Rarity.SPECIAL, mage.cards.e.ElvishChampion.class, NON_FULL_USE_VARIOUS)); diff --git a/Mage.Sets/src/mage/sets/Tempest.java b/Mage.Sets/src/mage/sets/Tempest.java index a5fce2ce5a9..5269f4c17c7 100644 --- a/Mage.Sets/src/mage/sets/Tempest.java +++ b/Mage.Sets/src/mage/sets/Tempest.java @@ -104,7 +104,7 @@ public final class Tempest extends ExpansionSet { cards.add(new SetCardInfo("Eladamri, Lord of Leaves", 224, Rarity.RARE, mage.cards.e.EladamriLordOfLeaves.class)); cards.add(new SetCardInfo("Elite Javelineer", 17, Rarity.COMMON, mage.cards.e.EliteJavelineer.class)); cards.add(new SetCardInfo("Elven Warhounds", 225, Rarity.RARE, mage.cards.e.ElvenWarhounds.class)); - cards.add(new SetCardInfo("Elvish Fury", 226, Rarity.UNCOMMON, mage.cards.e.ElvishFury.class)); + cards.add(new SetCardInfo("Elvish Fury", 226, Rarity.COMMON, mage.cards.e.ElvishFury.class)); cards.add(new SetCardInfo("Emerald Medallion", 283, Rarity.RARE, mage.cards.e.EmeraldMedallion.class)); cards.add(new SetCardInfo("Emmessi Tome", 284, Rarity.RARE, mage.cards.e.EmmessiTome.class)); cards.add(new SetCardInfo("Endless Scream", 132, Rarity.COMMON, mage.cards.e.EndlessScream.class)); @@ -205,7 +205,7 @@ public final class Tempest extends ExpansionSet { cards.add(new SetCardInfo("Mogg Fanatic", 190, Rarity.COMMON, mage.cards.m.MoggFanatic.class)); cards.add(new SetCardInfo("Mogg Hollows", 320, Rarity.UNCOMMON, mage.cards.m.MoggHollows.class)); cards.add(new SetCardInfo("Mogg Raider", 191, Rarity.COMMON, mage.cards.m.MoggRaider.class)); - cards.add(new SetCardInfo("Mogg Squad", 192, Rarity.COMMON, mage.cards.m.MoggSquad.class)); + cards.add(new SetCardInfo("Mogg Squad", 192, Rarity.UNCOMMON, mage.cards.m.MoggSquad.class)); cards.add(new SetCardInfo("Mongrel Pack", 237, Rarity.RARE, mage.cards.m.MongrelPack.class)); cards.add(new SetCardInfo("Mountain", 343, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Mountain", 344, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); diff --git a/Mage.Sets/src/mage/sets/TempestRemastered.java b/Mage.Sets/src/mage/sets/TempestRemastered.java index fa98de3e01a..cfccc6aed73 100644 --- a/Mage.Sets/src/mage/sets/TempestRemastered.java +++ b/Mage.Sets/src/mage/sets/TempestRemastered.java @@ -1,4 +1,3 @@ - package mage.sets; import mage.cards.ExpansionSet; @@ -85,7 +84,7 @@ public final class TempestRemastered extends ExpansionSet { cards.add(new SetCardInfo("Dream Prowler", 47, Rarity.UNCOMMON, mage.cards.d.DreamProwler.class)); cards.add(new SetCardInfo("Dungeon Shade", 103, Rarity.COMMON, mage.cards.d.DungeonShade.class)); cards.add(new SetCardInfo("Elven Rite", 169, Rarity.COMMON, mage.cards.e.ElvenRite.class)); - cards.add(new SetCardInfo("Elvish Fury", 170, Rarity.UNCOMMON, mage.cards.e.ElvishFury.class)); + cards.add(new SetCardInfo("Elvish Fury", 170, Rarity.COMMON, mage.cards.e.ElvishFury.class)); cards.add(new SetCardInfo("Emmessi Tome", 221, Rarity.UNCOMMON, mage.cards.e.EmmessiTome.class)); cards.add(new SetCardInfo("Endangered Armodon", 171, Rarity.COMMON, mage.cards.e.EndangeredArmodon.class)); cards.add(new SetCardInfo("Ephemeron", 48, Rarity.RARE, mage.cards.e.Ephemeron.class)); diff --git a/Mage.Sets/src/mage/sets/TheDark.java b/Mage.Sets/src/mage/sets/TheDark.java index 869fa6d4222..fed5a520d82 100644 --- a/Mage.Sets/src/mage/sets/TheDark.java +++ b/Mage.Sets/src/mage/sets/TheDark.java @@ -1,4 +1,3 @@ - package mage.sets; import mage.cards.ExpansionSet; @@ -31,10 +30,10 @@ public final class TheDark extends ExpansionSet { cards.add(new SetCardInfo("Apprentice Wizard", 21, Rarity.RARE, mage.cards.a.ApprenticeWizard.class)); cards.add(new SetCardInfo("Ashes to Ashes", 39, Rarity.COMMON, mage.cards.a.AshesToAshes.class)); cards.add(new SetCardInfo("Ball Lightning", 57, Rarity.RARE, mage.cards.b.BallLightning.class)); - cards.add(new SetCardInfo("Banshee", 40, Rarity.RARE, mage.cards.b.Banshee.class)); + cards.add(new SetCardInfo("Banshee", 40, Rarity.UNCOMMON, mage.cards.b.Banshee.class)); cards.add(new SetCardInfo("Barl's Cage", 96, Rarity.RARE, mage.cards.b.BarlsCage.class)); cards.add(new SetCardInfo("Blood Moon", 58, Rarity.RARE, mage.cards.b.BloodMoon.class)); - cards.add(new SetCardInfo("Blood of the Martyr", 2, Rarity.RARE, mage.cards.b.BloodOfTheMartyr.class)); + cards.add(new SetCardInfo("Blood of the Martyr", 2, Rarity.UNCOMMON, mage.cards.b.BloodOfTheMartyr.class)); cards.add(new SetCardInfo("Bog Imp", 41, Rarity.COMMON, mage.cards.b.BogImp.class)); cards.add(new SetCardInfo("Bog Rats", 42, Rarity.COMMON, mage.cards.b.BogRats.class)); cards.add(new SetCardInfo("Bone Flute", 97, Rarity.UNCOMMON, mage.cards.b.BoneFlute.class)); @@ -46,10 +45,10 @@ public final class TheDark extends ExpansionSet { cards.add(new SetCardInfo("City of Shadows", 116, Rarity.RARE, mage.cards.c.CityOfShadows.class)); cards.add(new SetCardInfo("Cleansing", 4, Rarity.RARE, mage.cards.c.Cleansing.class)); cards.add(new SetCardInfo("Coal Golem", 99, Rarity.UNCOMMON, mage.cards.c.CoalGolem.class)); - cards.add(new SetCardInfo("Curse Artifact", 43, Rarity.RARE, mage.cards.c.CurseArtifact.class)); + cards.add(new SetCardInfo("Curse Artifact", 43, Rarity.UNCOMMON, mage.cards.c.CurseArtifact.class)); cards.add(new SetCardInfo("Dance of Many", 22, Rarity.RARE, mage.cards.d.DanceOfMany.class)); cards.add(new SetCardInfo("Dark Heart of the Wood", 95, Rarity.COMMON, mage.cards.d.DarkHeartOfTheWood.class)); - cards.add(new SetCardInfo("Dark Sphere", 100, Rarity.RARE, mage.cards.d.DarkSphere.class)); + cards.add(new SetCardInfo("Dark Sphere", 100, Rarity.UNCOMMON, mage.cards.d.DarkSphere.class)); cards.add(new SetCardInfo("Deep Water", 23, Rarity.COMMON, mage.cards.d.DeepWater.class)); cards.add(new SetCardInfo("Diabolic Machine", 101, Rarity.UNCOMMON, mage.cards.d.DiabolicMachine.class)); cards.add(new SetCardInfo("Drowned", 24, Rarity.COMMON, mage.cards.d.Drowned.class)); @@ -60,11 +59,11 @@ public final class TheDark extends ExpansionSet { cards.add(new SetCardInfo("Erosion", 26, Rarity.COMMON, mage.cards.e.Erosion.class)); cards.add(new SetCardInfo("Eternal Flame", 61, Rarity.RARE, mage.cards.e.EternalFlame.class)); cards.add(new SetCardInfo("Exorcist", 6, Rarity.RARE, mage.cards.e.Exorcist.class)); - cards.add(new SetCardInfo("Fasting", 7, Rarity.RARE, mage.cards.f.Fasting.class)); + cards.add(new SetCardInfo("Fasting", 7, Rarity.UNCOMMON, mage.cards.f.Fasting.class)); cards.add(new SetCardInfo("Fellwar Stone", 102, Rarity.UNCOMMON, mage.cards.f.FellwarStone.class)); cards.add(new SetCardInfo("Festival", 8, Rarity.COMMON, mage.cards.f.Festival.class)); - cards.add(new SetCardInfo("Fire and Brimstone", 9, Rarity.RARE, mage.cards.f.FireAndBrimstone.class)); cards.add(new SetCardInfo("Fire Drake", 62, Rarity.UNCOMMON, mage.cards.f.FireDrake.class)); + cards.add(new SetCardInfo("Fire and Brimstone", 9, Rarity.UNCOMMON, mage.cards.f.FireAndBrimstone.class)); cards.add(new SetCardInfo("Fissure", 63, Rarity.COMMON, mage.cards.f.Fissure.class)); cards.add(new SetCardInfo("Flood", 27, Rarity.UNCOMMON, mage.cards.f.Flood.class)); cards.add(new SetCardInfo("Fountain of Youth", 103, Rarity.UNCOMMON, mage.cards.f.FountainOfYouth.class)); @@ -101,7 +100,7 @@ public final class TheDark extends ExpansionSet { cards.add(new SetCardInfo("Morale", 14, Rarity.COMMON, mage.cards.m.Morale.class)); cards.add(new SetCardInfo("Murk Dwellers", 49, Rarity.COMMON, mage.cards.m.MurkDwellers.class)); cards.add(new SetCardInfo("Nameless Race", 50, Rarity.RARE, mage.cards.n.NamelessRace.class)); - cards.add(new SetCardInfo("Necropolis", 105, Rarity.RARE, mage.cards.n.Necropolis.class)); + cards.add(new SetCardInfo("Necropolis", 105, Rarity.UNCOMMON, mage.cards.n.Necropolis.class)); cards.add(new SetCardInfo("Niall Silvain", 82, Rarity.RARE, mage.cards.n.NiallSilvain.class)); cards.add(new SetCardInfo("Orc General", 73, Rarity.UNCOMMON, mage.cards.o.OrcGeneral.class)); cards.add(new SetCardInfo("People of the Woods", 83, Rarity.UNCOMMON, mage.cards.p.PeopleOfTheWoods.class)); @@ -110,10 +109,10 @@ public final class TheDark extends ExpansionSet { cards.add(new SetCardInfo("Psychic Allergy", 34, Rarity.RARE, mage.cards.p.PsychicAllergy.class)); cards.add(new SetCardInfo("Rag Man", 51, Rarity.RARE, mage.cards.r.RagMan.class)); cards.add(new SetCardInfo("Riptide", 35, Rarity.COMMON, mage.cards.r.Riptide.class)); - cards.add(new SetCardInfo("Runesword", 107, Rarity.RARE, mage.cards.r.Runesword.class)); + cards.add(new SetCardInfo("Runesword", 107, Rarity.UNCOMMON, mage.cards.r.Runesword.class)); cards.add(new SetCardInfo("Safe Haven", 118, Rarity.RARE, mage.cards.s.SafeHaven.class)); cards.add(new SetCardInfo("Savaen Elves", 84, Rarity.COMMON, mage.cards.s.SavaenElves.class)); - cards.add(new SetCardInfo("Scarecrow", 108, Rarity.RARE, mage.cards.s.Scarecrow.class)); + cards.add(new SetCardInfo("Scarecrow", 108, Rarity.UNCOMMON, mage.cards.s.Scarecrow.class)); cards.add(new SetCardInfo("Scarwood Bandits", 85, Rarity.RARE, mage.cards.s.ScarwoodBandits.class)); cards.add(new SetCardInfo("Scarwood Goblins", 94, Rarity.COMMON, mage.cards.s.ScarwoodGoblins.class)); cards.add(new SetCardInfo("Scarwood Hag", 86, Rarity.UNCOMMON, mage.cards.s.ScarwoodHag.class)); @@ -122,21 +121,21 @@ public final class TheDark extends ExpansionSet { cards.add(new SetCardInfo("Sisters of the Flame", 74, Rarity.UNCOMMON, mage.cards.s.SistersOfTheFlame.class)); cards.add(new SetCardInfo("Skull of Orm", 109, Rarity.UNCOMMON, mage.cards.s.SkullOfOrm.class)); cards.add(new SetCardInfo("Sorrow's Path", 119, Rarity.RARE, mage.cards.s.SorrowsPath.class)); - cards.add(new SetCardInfo("Spitting Slug", 88, Rarity.RARE, mage.cards.s.SpittingSlug.class)); + cards.add(new SetCardInfo("Spitting Slug", 88, Rarity.UNCOMMON, mage.cards.s.SpittingSlug.class)); cards.add(new SetCardInfo("Squire", 17, Rarity.COMMON, mage.cards.s.Squire.class)); cards.add(new SetCardInfo("Standing Stones", 110, Rarity.UNCOMMON, mage.cards.s.StandingStones.class)); cards.add(new SetCardInfo("Stone Calendar", 111, Rarity.RARE, mage.cards.s.StoneCalendar.class)); cards.add(new SetCardInfo("Sunken City", 36, Rarity.COMMON, mage.cards.s.SunkenCity.class)); - cards.add(new SetCardInfo("Tangle Kelp", 37, Rarity.RARE, mage.cards.t.TangleKelp.class)); - cards.add(new SetCardInfo("The Fallen", 53, Rarity.RARE, mage.cards.t.TheFallen.class)); + cards.add(new SetCardInfo("Tangle Kelp", 37, Rarity.UNCOMMON, mage.cards.t.TangleKelp.class)); + cards.add(new SetCardInfo("The Fallen", 53, Rarity.UNCOMMON, mage.cards.t.TheFallen.class)); cards.add(new SetCardInfo("Tivadar's Crusade", 18, Rarity.UNCOMMON, mage.cards.t.TivadarsCrusade.class)); cards.add(new SetCardInfo("Tormod's Crypt", 112, Rarity.UNCOMMON, mage.cards.t.TormodsCrypt.class)); - cards.add(new SetCardInfo("Tower of Coireall", 113, Rarity.RARE, mage.cards.t.TowerOfCoireall.class)); + cards.add(new SetCardInfo("Tower of Coireall", 113, Rarity.UNCOMMON, mage.cards.t.TowerOfCoireall.class)); cards.add(new SetCardInfo("Tracker", 89, Rarity.RARE, mage.cards.t.Tracker.class)); cards.add(new SetCardInfo("Uncle Istvan", 54, Rarity.UNCOMMON, mage.cards.u.UncleIstvan.class)); cards.add(new SetCardInfo("Venom", 90, Rarity.COMMON, mage.cards.v.Venom.class)); - cards.add(new SetCardInfo("Wand of Ith", 114, Rarity.RARE, mage.cards.w.WandOfIth.class)); - cards.add(new SetCardInfo("War Barge", 115, Rarity.RARE, mage.cards.w.WarBarge.class)); + cards.add(new SetCardInfo("Wand of Ith", 114, Rarity.UNCOMMON, mage.cards.w.WandOfIth.class)); + cards.add(new SetCardInfo("War Barge", 115, Rarity.UNCOMMON, mage.cards.w.WarBarge.class)); cards.add(new SetCardInfo("Water Wurm", 38, Rarity.COMMON, mage.cards.w.WaterWurm.class)); cards.add(new SetCardInfo("Witch Hunter", 19, Rarity.RARE, mage.cards.w.WitchHunter.class)); cards.add(new SetCardInfo("Word of Binding", 55, Rarity.COMMON, mage.cards.w.WordOfBinding.class)); diff --git a/Mage.Sets/src/mage/sets/TimeSpiralTimeshifted.java b/Mage.Sets/src/mage/sets/TimeSpiralTimeshifted.java index da2fe23c4bf..350e324ddc7 100644 --- a/Mage.Sets/src/mage/sets/TimeSpiralTimeshifted.java +++ b/Mage.Sets/src/mage/sets/TimeSpiralTimeshifted.java @@ -1,9 +1,6 @@ - package mage.sets; import mage.cards.ExpansionSet; -import mage.cards.i.IcatianJavelineers; -import mage.cards.s.SwampMosquito; import mage.constants.Rarity; import mage.constants.SetType; @@ -24,7 +21,7 @@ public final class TimeSpiralTimeshifted extends ExpansionSet { this.blockName = "Time Spiral"; this.parentSet = TimeSpiral.getInstance(); this.hasBasicLands = false; - cards.add(new SetCardInfo("Akroma, Angel of Wrath", 1, Rarity.COMMON, mage.cards.a.AkromaAngelOfWrath.class)); + cards.add(new SetCardInfo("Akroma, Angel of Wrath", 1, Rarity.SPECIAL, mage.cards.a.AkromaAngelOfWrath.class)); cards.add(new SetCardInfo("Arena", 117, Rarity.SPECIAL, mage.cards.a.Arena.class)); cards.add(new SetCardInfo("Assault // Battery", 106, Rarity.SPECIAL, mage.cards.a.AssaultBattery.class)); cards.add(new SetCardInfo("Auratog", 2, Rarity.COMMON, mage.cards.a.Auratog.class)); @@ -73,7 +70,7 @@ public final class TimeSpiralTimeshifted extends ExpansionSet { cards.add(new SetCardInfo("Hail Storm", 79, Rarity.SPECIAL, mage.cards.h.HailStorm.class)); cards.add(new SetCardInfo("Honorable Passage", 9, Rarity.SPECIAL, mage.cards.h.HonorablePassage.class)); cards.add(new SetCardInfo("Hunting Moa", 80, Rarity.COMMON, mage.cards.h.HuntingMoa.class)); - cards.add(new SetCardInfo("Icatian Javelineers", 10, Rarity.SPECIAL, IcatianJavelineers.class)); + cards.add(new SetCardInfo("Icatian Javelineers", 10, Rarity.SPECIAL, mage.cards.i.IcatianJavelineers.class)); cards.add(new SetCardInfo("Jasmine Boreal", 93, Rarity.COMMON, mage.cards.j.JasmineBoreal.class)); cards.add(new SetCardInfo("Jolrael, Empress of Beasts", 81, Rarity.SPECIAL, mage.cards.j.JolraelEmpressOfBeasts.class)); cards.add(new SetCardInfo("Kobold Taskmaster", 65, Rarity.SPECIAL, mage.cards.k.KoboldTaskmaster.class)); @@ -118,7 +115,7 @@ public final class TimeSpiralTimeshifted extends ExpansionSet { cards.add(new SetCardInfo("Stormscape Familiar", 32, Rarity.COMMON, mage.cards.s.StormscapeFamiliar.class)); cards.add(new SetCardInfo("Stupor", 48, Rarity.COMMON, mage.cards.s.Stupor.class)); cards.add(new SetCardInfo("Suq'Ata Lancer", 69, Rarity.COMMON, mage.cards.s.SuqAtaLancer.class)); - cards.add(new SetCardInfo("Swamp Mosquito", 49, Rarity.SPECIAL, SwampMosquito.class)); + cards.add(new SetCardInfo("Swamp Mosquito", 49, Rarity.SPECIAL, mage.cards.s.SwampMosquito.class)); cards.add(new SetCardInfo("Teferi's Moat", 103, Rarity.SPECIAL, mage.cards.t.TeferisMoat.class)); cards.add(new SetCardInfo("Thallid", 86, Rarity.COMMON, mage.cards.t.Thallid.class)); cards.add(new SetCardInfo("The Rack", 113, Rarity.SPECIAL, mage.cards.t.TheRack.class)); diff --git a/Mage.Sets/src/mage/sets/Torment.java b/Mage.Sets/src/mage/sets/Torment.java index 5f56b5d7d2f..847347f882f 100644 --- a/Mage.Sets/src/mage/sets/Torment.java +++ b/Mage.Sets/src/mage/sets/Torment.java @@ -32,7 +32,7 @@ public final class Torment extends ExpansionSet { cards.add(new SetCardInfo("Acorn Harvest", 118, Rarity.COMMON, mage.cards.a.AcornHarvest.class)); cards.add(new SetCardInfo("Ambassador Laquatus", 23, Rarity.RARE, mage.cards.a.AmbassadorLaquatus.class)); cards.add(new SetCardInfo("Angel of Retribution", 1, Rarity.RARE, mage.cards.a.AngelOfRetribution.class)); - cards.add(new SetCardInfo("Anurid Scavenger", 119, Rarity.COMMON, mage.cards.a.AnuridScavenger.class)); + cards.add(new SetCardInfo("Anurid Scavenger", 119, Rarity.UNCOMMON, mage.cards.a.AnuridScavenger.class)); cards.add(new SetCardInfo("Aquamoeba", 24, Rarity.COMMON, mage.cards.a.Aquamoeba.class)); cards.add(new SetCardInfo("Arrogant Wurm", 120, Rarity.UNCOMMON, mage.cards.a.ArrogantWurm.class)); cards.add(new SetCardInfo("Aven Trooper", 2, Rarity.COMMON, mage.cards.a.AvenTrooper.class)); diff --git a/Mage.Sets/src/mage/sets/UginsFate.java b/Mage.Sets/src/mage/sets/UginsFate.java index 07e234b6d54..a87356e6ead 100644 --- a/Mage.Sets/src/mage/sets/UginsFate.java +++ b/Mage.Sets/src/mage/sets/UginsFate.java @@ -6,7 +6,6 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author fireshoes */ public final class UginsFate extends ExpansionSet { @@ -20,6 +19,8 @@ public final class UginsFate extends ExpansionSet { private UginsFate() { super("Ugin's Fate", "UGIN", ExpansionSet.buildDate(2015, 1, 16), SetType.PROMOTIONAL); this.hasBoosters = false; + this.hasBasicLands = false; + cards.add(new SetCardInfo("Ainok Tracker", 96, Rarity.COMMON, mage.cards.a.AinokTracker.class)); cards.add(new SetCardInfo("Altar of the Brood", 216, Rarity.RARE, mage.cards.a.AltarOfTheBrood.class)); cards.add(new SetCardInfo("Arashin War Beast", 123, Rarity.UNCOMMON, mage.cards.a.ArashinWarBeast.class)); diff --git a/Mage.Sets/src/mage/sets/Unglued.java b/Mage.Sets/src/mage/sets/Unglued.java index 524cae92c96..b432e5833fc 100644 --- a/Mage.Sets/src/mage/sets/Unglued.java +++ b/Mage.Sets/src/mage/sets/Unglued.java @@ -7,7 +7,6 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author lopho */ public final class Unglued extends ExpansionSet { @@ -21,31 +20,44 @@ public final class Unglued extends ExpansionSet { private Unglued() { super("Unglued", "UGL", ExpansionSet.buildDate(1998, 8, 11), SetType.JOKESET); - cards.add(new SetCardInfo("Chicken Egg", 41, Rarity.COMMON, mage.cards.c.ChickenEgg.class)); + cards.add(new SetCardInfo("Burning Cinder Fury of Crimson Chaos Fire", 40, Rarity.RARE, mage.cards.b.BurningCinderFuryOfCrimsonChaosFire.class)); + cards.add(new SetCardInfo("Checks and Balances", 16, Rarity.UNCOMMON, mage.cards.c.ChecksAndBalances.class)); cards.add(new SetCardInfo("Chicken a la King", 17, Rarity.RARE, mage.cards.c.ChickenALaKing.class)); + cards.add(new SetCardInfo("Chicken Egg", 41, Rarity.COMMON, mage.cards.c.ChickenEgg.class)); + cards.add(new SetCardInfo("Clam-I-Am", 19, Rarity.COMMON, mage.cards.c.ClamIAm.class)); + cards.add(new SetCardInfo("Clambassadors", 18, Rarity.COMMON, mage.cards.c.Clambassadors.class)); + cards.add(new SetCardInfo("Denied!", 22, Rarity.COMMON, mage.cards.d.Denied.class)); cards.add(new SetCardInfo("Elvish Impersonators", 56, Rarity.COMMON, mage.cards.e.ElvishImpersonators.class)); + cards.add(new SetCardInfo("Flock of Rabid Sheep", 57, Rarity.UNCOMMON, mage.cards.f.FlockOfRabidSheep.class)); cards.add(new SetCardInfo("Forest", 88, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(FrameStyle.UGL_FULL_ART_BASIC, false))); cards.add(new SetCardInfo("Fowl Play", 24, Rarity.COMMON, mage.cards.f.FowlPlay.class)); + cards.add(new SetCardInfo("Free-for-All", 25, Rarity.RARE, mage.cards.f.FreeForAll.class)); + cards.add(new SetCardInfo("Free-Range Chicken", 58, Rarity.COMMON, mage.cards.f.FreeRangeChicken.class)); cards.add(new SetCardInfo("Gerrymandering", 59, Rarity.UNCOMMON, mage.cards.g.Gerrymandering.class)); + cards.add(new SetCardInfo("Goblin Bowling Team", 44, Rarity.COMMON, mage.cards.g.GoblinBowlingTeam.class)); cards.add(new SetCardInfo("Goblin Tutor", 45, Rarity.UNCOMMON, mage.cards.g.GoblinTutor.class)); cards.add(new SetCardInfo("Growth Spurt", 61, Rarity.COMMON, mage.cards.g.GrowthSpurt.class)); cards.add(new SetCardInfo("Hungry Hungry Heifer", 63, Rarity.UNCOMMON, mage.cards.h.HungryHungryHeifer.class)); cards.add(new SetCardInfo("Incoming!", 64, Rarity.RARE, mage.cards.i.Incoming.class)); cards.add(new SetCardInfo("Island", 85, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(FrameStyle.UGL_FULL_ART_BASIC, false))); cards.add(new SetCardInfo("Jack-in-the-Mox", 75, Rarity.RARE, mage.cards.j.JackInTheMox.class)); + cards.add(new SetCardInfo("Jalum Grifter", 47, Rarity.RARE, mage.cards.j.JalumGrifter.class)); cards.add(new SetCardInfo("Jumbo Imp", 34, Rarity.UNCOMMON, mage.cards.j.JumboImp.class)); cards.add(new SetCardInfo("Krazy Kow", 48, Rarity.COMMON, mage.cards.k.KrazyKow.class)); cards.add(new SetCardInfo("Mine, Mine, Mine!", 65, Rarity.RARE, mage.cards.m.MineMineMine.class)); cards.add(new SetCardInfo("Mountain", 87, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(FrameStyle.UGL_FULL_ART_BASIC, false))); - cards.add(new SetCardInfo("Once More With Feeling", 11, Rarity.RARE, mage.cards.o.OnceMoreWithFeeling.class)); + cards.add(new SetCardInfo("Once More with Feeling", 11, Rarity.RARE, mage.cards.o.OnceMoreWithFeeling.class)); cards.add(new SetCardInfo("Paper Tiger", 78, Rarity.COMMON, mage.cards.p.PaperTiger.class)); cards.add(new SetCardInfo("Plains", 84, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(FrameStyle.UGL_FULL_ART_BASIC, false))); cards.add(new SetCardInfo("Poultrygeist", 37, Rarity.COMMON, mage.cards.p.Poultrygeist.class)); + cards.add(new SetCardInfo("Ricochet", 50, Rarity.UNCOMMON, mage.cards.r.Ricochet.class)); cards.add(new SetCardInfo("Rock Lobster", 79, Rarity.COMMON, mage.cards.r.RockLobster.class)); cards.add(new SetCardInfo("Scissors Lizard", 80, Rarity.COMMON, mage.cards.s.ScissorsLizard.class)); cards.add(new SetCardInfo("Spark Fiend", 51, Rarity.RARE, mage.cards.s.SparkFiend.class)); + cards.add(new SetCardInfo("Spatula of the Ages", 81, Rarity.UNCOMMON, mage.cards.s.SpatulaOfTheAges.class)); cards.add(new SetCardInfo("Strategy, Schmategy", 52, Rarity.RARE, mage.cards.s.StrategySchmategy.class)); cards.add(new SetCardInfo("Swamp", 86, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(FrameStyle.UGL_FULL_ART_BASIC, false))); + cards.add(new SetCardInfo("Temp of the Damned", 38, Rarity.COMMON, mage.cards.t.TempOfTheDamned.class)); cards.add(new SetCardInfo("The Cheese Stands Alone", 2, Rarity.RARE, mage.cards.t.TheCheeseStandsAlone.class)); cards.add(new SetCardInfo("Timmy, Power Gamer", 68, Rarity.RARE, mage.cards.t.TimmyPowerGamer.class)); cards.add(new SetCardInfo("Urza's Science Fair Project", 83, Rarity.UNCOMMON, mage.cards.u.UrzasScienceFairProject.class)); diff --git a/Mage.Sets/src/mage/sets/Unhinged.java b/Mage.Sets/src/mage/sets/Unhinged.java index a2098352175..9a927bad34b 100644 --- a/Mage.Sets/src/mage/sets/Unhinged.java +++ b/Mage.Sets/src/mage/sets/Unhinged.java @@ -21,12 +21,36 @@ public final class Unhinged extends ExpansionSet { private Unhinged() { super("Unhinged", "UNH", ExpansionSet.buildDate(2004, 11, 20), SetType.JOKESET); + cards.add(new SetCardInfo("\"Ach! Hans, Run!\"", 116, Rarity.RARE, mage.cards.a.AchHansRun.class)); + cards.add(new SetCardInfo("B-I-N-G-O", 92, Rarity.RARE, mage.cards.b.BINGO.class)); + cards.add(new SetCardInfo("Blast from the Past", 72, Rarity.RARE, mage.cards.b.BlastFromThePast.class)); + cards.add(new SetCardInfo("Bloodletter", 50, Rarity.COMMON, mage.cards.b.Bloodletter.class)); + cards.add(new SetCardInfo("Booster Tutor", 51, Rarity.UNCOMMON, mage.cards.b.BoosterTutor.class)); + cards.add(new SetCardInfo("Double Header", 31, Rarity.COMMON, mage.cards.d.DoubleHeader.class)); + cards.add(new SetCardInfo("First Come, First Served", 12, Rarity.UNCOMMON, mage.cards.f.FirstComeFirstServed.class)); cards.add(new SetCardInfo("Forest", 140, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(FrameStyle.UNH_FULL_ART_BASIC, false))); + cards.add(new SetCardInfo("Form of the Squirrel", 96, Rarity.RARE, mage.cards.f.FormOfTheSquirrel.class)); + cards.add(new SetCardInfo("Goblin Secret Agent", 79, Rarity.COMMON, mage.cards.g.GoblinSecretAgent.class)); cards.add(new SetCardInfo("Island", 137, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(FrameStyle.UNH_FULL_ART_BASIC, false))); cards.add(new SetCardInfo("Johnny, Combo Player", 35, Rarity.RARE, mage.cards.j.JohnnyComboPlayer.class)); + cards.add(new SetCardInfo("Mana Screw", 123, Rarity.UNCOMMON, mage.cards.m.ManaScrew.class)); + cards.add(new SetCardInfo("Mise", 38, Rarity.UNCOMMON, mage.cards.m.Mise.class)); + cards.add(new SetCardInfo("Monkey Monkey Monkey", 104, Rarity.COMMON, mage.cards.m.MonkeyMonkeyMonkey.class)); cards.add(new SetCardInfo("Mountain", 139, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(FrameStyle.UNH_FULL_ART_BASIC, false))); cards.add(new SetCardInfo("Mox Lotus", 124, Rarity.RARE, mage.cards.m.MoxLotus.class)); + cards.add(new SetCardInfo("Now I Know My ABC's", 41, Rarity.RARE, mage.cards.n.NowIKnowMyABCs.class)); cards.add(new SetCardInfo("Plains", 136, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(FrameStyle.UNH_FULL_ART_BASIC, false))); + cards.add(new SetCardInfo("Rare-B-Gone", 119, Rarity.RARE, mage.cards.r.RareBGone.class)); + cards.add(new SetCardInfo("Six-y Beast", 89, Rarity.UNCOMMON, mage.cards.s.SixyBeast.class)); cards.add(new SetCardInfo("Swamp", 138, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(FrameStyle.UNH_FULL_ART_BASIC, false))); + cards.add(new SetCardInfo("Symbol Status", 114, Rarity.UNCOMMON, mage.cards.s.SymbolStatus.class)); + cards.add(new SetCardInfo("The Fallen Apart", 55, Rarity.COMMON, mage.cards.t.TheFallenApart.class)); + cards.add(new SetCardInfo("Togglodyte", 129, Rarity.UNCOMMON, mage.cards.t.Togglodyte.class)); + cards.add(new SetCardInfo("Uktabi Kong", 115, Rarity.RARE, mage.cards.u.UktabiKong.class)); + cards.add(new SetCardInfo("Urza's Hot Tub", 131, Rarity.UNCOMMON, mage.cards.u.UrzasHotTub.class)); + cards.add(new SetCardInfo("When Fluffy Bunnies Attack", 67, Rarity.COMMON, mage.cards.w.WhenFluffyBunniesAttack.class)); + cards.add(new SetCardInfo("Wordmail", 22, Rarity.COMMON, mage.cards.w.Wordmail.class)); + cards.add(new SetCardInfo("World-Bottling Kit", 133, Rarity.RARE, mage.cards.w.WorldBottlingKit.class)); + cards.add(new SetCardInfo("Zzzyxas's Abyss", 70, Rarity.RARE, mage.cards.z.ZzzyxassAbyss.class)); } } diff --git a/Mage.Sets/src/mage/sets/Unstable.java b/Mage.Sets/src/mage/sets/Unstable.java index a30cc6a6287..83d3a8dd3ab 100644 --- a/Mage.Sets/src/mage/sets/Unstable.java +++ b/Mage.Sets/src/mage/sets/Unstable.java @@ -22,21 +22,32 @@ public final class Unstable extends ExpansionSet { private Unstable() { super("Unstable", "UST", ExpansionSet.buildDate(2017, 12, 8), SetType.JOKESET); - cards.add(new SetCardInfo("Amateur Auteur", 3, Rarity.COMMON, mage.cards.a.AmateurAuteur.class)); + cards.add(new SetCardInfo("Amateur Auteur", "3a", Rarity.COMMON, mage.cards.a.AmateurAuteur.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Amateur Auteur", "3b", Rarity.COMMON, mage.cards.a.AmateurAuteur.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Amateur Auteur", "3c", Rarity.COMMON, mage.cards.a.AmateurAuteur.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Amateur Auteur", "3d", Rarity.COMMON, mage.cards.a.AmateurAuteur.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("As Luck Would Have It", 102, Rarity.RARE, mage.cards.a.AsLuckWouldHaveIt.class)); cards.add(new SetCardInfo("Baron Von Count", 127, Rarity.MYTHIC, mage.cards.b.BaronVonCount.class)); + cards.add(new SetCardInfo("Beast in Show", "103a", Rarity.COMMON, mage.cards.b.BeastInShow.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Beast in Show", "103b", Rarity.COMMON, mage.cards.b.BeastInShow.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Beast in Show", "103c", Rarity.COMMON, mage.cards.b.BeastInShow.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Beast in Show", "103d", Rarity.COMMON, mage.cards.b.BeastInShow.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Box of Free-Range Goblins", 77, Rarity.COMMON, mage.cards.b.BoxOfFreerangeGoblins.class)); cards.add(new SetCardInfo("Buzzing Whack-a-Doodle", 141, Rarity.UNCOMMON, mage.cards.b.BuzzingWhackADoodle.class)); cards.add(new SetCardInfo("Chittering Doom", 104, Rarity.UNCOMMON, mage.cards.c.ChitteringDoom.class)); cards.add(new SetCardInfo("Crow Storm", 31, Rarity.UNCOMMON, mage.cards.c.CrowStorm.class)); - cards.add(new SetCardInfo("Curious Killbot", 145, Rarity.COMMON, mage.cards.c.CuriousKillbot.class)); + cards.add(new SetCardInfo("Curious Killbot", "145a", Rarity.COMMON, mage.cards.c.CuriousKillbot.class)); + cards.add(new SetCardInfo("Delighted Killbot", "145b", Rarity.COMMON, mage.cards.d.DelightedKillbot.class)); + cards.add(new SetCardInfo("Despondent Killbot", "145c", Rarity.COMMON, mage.cards.d.DespondentKillbot.class)); cards.add(new SetCardInfo("Dr. Julius Jumblemorph", 130, Rarity.MYTHIC, mage.cards.d.DrJuliusJumblemorph.class)); + cards.add(new SetCardInfo("Enraged Killbot", "145d", Rarity.COMMON, mage.cards.e.EnragedKillbot.class)); cards.add(new SetCardInfo("Earl of Squirrel", 108, Rarity.RARE, mage.cards.e.EarlOfSquirrel.class)); cards.add(new SetCardInfo("Forest", 216, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(FrameStyle.UST_FULL_ART_BASIC, false))); cards.add(new SetCardInfo("GO TO JAIL", 8, Rarity.COMMON, mage.cards.g.GOTOJAIL.class)); cards.add(new SetCardInfo("Garbage Elemental", "82c", Rarity.UNCOMMON, mage.cards.g.GarbageElementalC.class)); cards.add(new SetCardInfo("Ground Pounder", 110, Rarity.COMMON, mage.cards.g.GroundPounder.class)); cards.add(new SetCardInfo("Hammer Helper", 85, Rarity.COMMON, mage.cards.h.HammerHelper.class)); + cards.add(new SetCardInfo("Hammer Jammer", 86, Rarity.UNCOMMON, mage.cards.h.HammerJammer.class)); cards.add(new SetCardInfo("Hydradoodle", 112, Rarity.RARE, mage.cards.h.Hydradoodle.class)); cards.add(new SetCardInfo("Inhumaniac", 59, Rarity.UNCOMMON, mage.cards.i.Inhumaniac.class)); cards.add(new SetCardInfo("Island", 213, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(FrameStyle.UST_FULL_ART_BASIC, false))); @@ -44,18 +55,26 @@ public final class Unstable extends ExpansionSet { cards.add(new SetCardInfo("Lobe Lobber", 153, Rarity.UNCOMMON, mage.cards.l.LobeLobber.class)); cards.add(new SetCardInfo("Mad Science Fair Project", 154, Rarity.COMMON, mage.cards.m.MadScienceFairProject.class)); cards.add(new SetCardInfo("Mountain", 215, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(FrameStyle.UST_FULL_ART_BASIC, false))); + cards.add(new SetCardInfo("Novellamental", "41a", Rarity.COMMON, mage.cards.n.Novellamental.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Novellamental", "41b", Rarity.COMMON, mage.cards.n.Novellamental.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Novellamental", "41c", Rarity.COMMON, mage.cards.n.Novellamental.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Novellamental", "41d", Rarity.COMMON, mage.cards.n.Novellamental.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Oddly Uneven", 15, Rarity.RARE, mage.cards.o.OddlyUneven.class)); cards.add(new SetCardInfo("Painiac", 91, Rarity.COMMON, mage.cards.p.Painiac.class)); cards.add(new SetCardInfo("Plains", 212, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(FrameStyle.UST_FULL_ART_BASIC, false))); cards.add(new SetCardInfo("Snickering Squirrel", 68, Rarity.COMMON, mage.cards.s.SnickeringSquirrel.class)); cards.add(new SetCardInfo("Squirrel-Powered Scheme", 70, Rarity.UNCOMMON, mage.cards.s.SquirrelPoweredScheme.class)); + cards.add(new SetCardInfo("Staff of the Letter Magus", 159, Rarity.UNCOMMON, mage.cards.s.StaffOfTheLetterMagus.class)); cards.add(new SetCardInfo("Steamflogger Boss", 93, Rarity.RARE, mage.cards.s.SteamfloggerBoss.class)); cards.add(new SetCardInfo("Steel Squirrel", 162, Rarity.UNCOMMON, mage.cards.s.SteelSquirrel.class)); cards.add(new SetCardInfo("Summon the Pack", 74, Rarity.MYTHIC, mage.cards.s.SummonThePack.class)); cards.add(new SetCardInfo("Swamp", 214, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(FrameStyle.UST_FULL_ART_BASIC, false))); - cards.add(new SetCardInfo("Sword of Dungeons & Dragons", 1, Rarity.MYTHIC, mage.cards.s.SwordOfDungeonsAndDragons.class)); - cards.add(new SetCardInfo("Target Minotaur", 98, Rarity.COMMON, mage.cards.t.TargetMinotaur.class)); - cards.add(new SetCardInfo("The Big Idea", "76", Rarity.RARE, mage.cards.t.TheBigIdea.class)); + cards.add(new SetCardInfo("Sword of Dungeons & Dragons", 163, Rarity.MYTHIC, mage.cards.s.SwordOfDungeonsAndDragons.class)); + cards.add(new SetCardInfo("Target Minotaur", "98a", Rarity.COMMON, mage.cards.t.TargetMinotaur.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Target Minotaur", "98b", Rarity.COMMON, mage.cards.t.TargetMinotaur.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Target Minotaur", "98c", Rarity.COMMON, mage.cards.t.TargetMinotaur.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Target Minotaur", "98d", Rarity.COMMON, mage.cards.t.TargetMinotaur.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("The Big Idea", 76, Rarity.RARE, mage.cards.t.TheBigIdea.class)); cards.add(new SetCardInfo("Time Out", 48, Rarity.COMMON, mage.cards.t.TimeOut.class)); cards.add(new SetCardInfo("Very Cryptic Command", "49d", Rarity.RARE, mage.cards.v.VeryCrypticCommandD.class)); cards.add(new SetCardInfo("Willing Test Subject", 126, Rarity.COMMON, mage.cards.w.WillingTestSubject.class)); diff --git a/Mage.Sets/src/mage/sets/UrzasDestiny.java b/Mage.Sets/src/mage/sets/UrzasDestiny.java index 0d1da153d20..17e0fd38ed1 100644 --- a/Mage.Sets/src/mage/sets/UrzasDestiny.java +++ b/Mage.Sets/src/mage/sets/UrzasDestiny.java @@ -120,6 +120,7 @@ public final class UrzasDestiny extends ExpansionSet { cards.add(new SetCardInfo("Repercussion", 95, Rarity.RARE, mage.cards.r.Repercussion.class)); cards.add(new SetCardInfo("Replenish", 15, Rarity.RARE, mage.cards.r.Replenish.class)); cards.add(new SetCardInfo("Rescue", 44, Rarity.COMMON, mage.cards.r.Rescue.class)); + cards.add(new SetCardInfo("Rofellos's Gift", 119, Rarity.COMMON, mage.cards.r.RofellossGift.class)); cards.add(new SetCardInfo("Rofellos, Llanowar Emissary", 118, Rarity.RARE, mage.cards.r.RofellosLlanowarEmissary.class)); cards.add(new SetCardInfo("Sanctimony", 16, Rarity.UNCOMMON, mage.cards.s.Sanctimony.class)); cards.add(new SetCardInfo("Scent of Brine", 45, Rarity.COMMON, mage.cards.s.ScentOfBrine.class)); diff --git a/Mage.Sets/src/mage/sets/UrzasSaga.java b/Mage.Sets/src/mage/sets/UrzasSaga.java index d231b8227d3..161a5e42ca6 100644 --- a/Mage.Sets/src/mage/sets/UrzasSaga.java +++ b/Mage.Sets/src/mage/sets/UrzasSaga.java @@ -1,4 +1,3 @@ - package mage.sets; import mage.cards.ExpansionSet; @@ -230,7 +229,7 @@ public final class UrzasSaga extends ExpansionSet { cards.add(new SetCardInfo("Plains", 333, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Plains", 334, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Planar Birth", 31, Rarity.RARE, mage.cards.p.PlanarBirth.class)); - cards.add(new SetCardInfo("Planar Void", 149, Rarity.RARE, mage.cards.p.PlanarVoid.class)); + cards.add(new SetCardInfo("Planar Void", 149, Rarity.UNCOMMON, mage.cards.p.PlanarVoid.class)); cards.add(new SetCardInfo("Polluted Mire", 323, Rarity.COMMON, mage.cards.p.PollutedMire.class)); cards.add(new SetCardInfo("Pouncing Jaguar", 269, Rarity.COMMON, mage.cards.p.PouncingJaguar.class)); cards.add(new SetCardInfo("Power Sink", 89, Rarity.COMMON, mage.cards.p.PowerSink.class)); diff --git a/Mage.Sets/src/mage/sets/VintageMasters.java b/Mage.Sets/src/mage/sets/VintageMasters.java index 92ca744361c..bc5a3822612 100644 --- a/Mage.Sets/src/mage/sets/VintageMasters.java +++ b/Mage.Sets/src/mage/sets/VintageMasters.java @@ -1,10 +1,7 @@ - package mage.sets; import java.util.List; import mage.cards.ExpansionSet; -import mage.cards.h.HighTide; -import mage.cards.h.HymnToTourach; import mage.cards.repository.CardCriteria; import mage.cards.repository.CardInfo; import mage.cards.repository.CardRepository; @@ -115,7 +112,7 @@ public final class VintageMasters extends ExpansionSet { cards.add(new SetCardInfo("Desert Twister", 203, Rarity.UNCOMMON, mage.cards.d.DesertTwister.class)); cards.add(new SetCardInfo("Devout Witness", 24, Rarity.UNCOMMON, mage.cards.d.DevoutWitness.class)); cards.add(new SetCardInfo("Drakestown Forgotten", 117, Rarity.RARE, mage.cards.d.DrakestownForgotten.class)); - cards.add(new SetCardInfo("Dreampod Druid", 204, Rarity.RARE, mage.cards.d.DreampodDruid.class)); + cards.add(new SetCardInfo("Dreampod Druid", 204, Rarity.UNCOMMON, mage.cards.d.DreampodDruid.class)); cards.add(new SetCardInfo("Edric, Spymaster of Trest", 251, Rarity.RARE, mage.cards.e.EdricSpymasterOfTrest.class)); cards.add(new SetCardInfo("Elephant Guide", 205, Rarity.COMMON, mage.cards.e.ElephantGuide.class)); cards.add(new SetCardInfo("Elvish Aberration", 206, Rarity.COMMON, mage.cards.e.ElvishAberration.class)); @@ -169,9 +166,9 @@ public final class VintageMasters extends ExpansionSet { cards.add(new SetCardInfo("Gush", 72, Rarity.UNCOMMON, mage.cards.g.Gush.class)); cards.add(new SetCardInfo("Gustcloak Harrier", 30, Rarity.COMMON, mage.cards.g.GustcloakHarrier.class)); cards.add(new SetCardInfo("Hermit Druid", 216, Rarity.RARE, mage.cards.h.HermitDruid.class)); - cards.add(new SetCardInfo("High Tide", 73, Rarity.UNCOMMON, HighTide.class)); + cards.add(new SetCardInfo("High Tide", 73, Rarity.UNCOMMON, mage.cards.h.HighTide.class)); cards.add(new SetCardInfo("Hulking Goblin", 174, Rarity.COMMON, mage.cards.h.HulkingGoblin.class)); - cards.add(new SetCardInfo("Hymn to Tourach", 122, Rarity.UNCOMMON, HymnToTourach.class)); + cards.add(new SetCardInfo("Hymn to Tourach", 122, Rarity.UNCOMMON, mage.cards.h.HymnToTourach.class)); cards.add(new SetCardInfo("Ichorid", 123, Rarity.RARE, mage.cards.i.Ichorid.class)); cards.add(new SetCardInfo("Ivory Tower", 269, Rarity.UNCOMMON, mage.cards.i.IvoryTower.class)); cards.add(new SetCardInfo("Jace, the Mind Sculptor", 74, Rarity.MYTHIC, mage.cards.j.JaceTheMindSculptor.class)); diff --git a/Mage.Sets/src/mage/sets/WPNAndGatewayPromos.java b/Mage.Sets/src/mage/sets/WPNAndGatewayPromos.java new file mode 100644 index 00000000000..2ca40ffc6bd --- /dev/null +++ b/Mage.Sets/src/mage/sets/WPNAndGatewayPromos.java @@ -0,0 +1,95 @@ +package mage.sets; + +import mage.cards.ExpansionSet; +import mage.constants.Rarity; +import mage.constants.SetType; + +/** + * @author fireshoes, JayDi85 + */ +public final class WPNAndGatewayPromos extends ExpansionSet { + + private static final WPNAndGatewayPromos instance = new WPNAndGatewayPromos(); + + public static WPNAndGatewayPromos getInstance() { + return instance; + } + + private WPNAndGatewayPromos() { + super("WPN and Gateway Promos", "GRC", ExpansionSet.buildDate(2011, 6, 17), SetType.PROMOTIONAL); + this.hasBoosters = false; + this.hasBasicLands = false; + + // one inner set for many promos by years (Gameway + Wizards Play Network promos by years) + // https://mtg.gamepedia.com/Gateway_cards + + // Gateway Promos -- xmage uses one set (GRC), but scryfall store it by years + // 2006 - https://scryfall.com/sets/pgtw + cards.add(new SetCardInfo("Fiery Temper", 3, Rarity.RARE, mage.cards.f.FieryTemper.class)); + cards.add(new SetCardInfo("Icatian Javelineers", 2, Rarity.RARE, mage.cards.i.IcatianJavelineers.class)); + cards.add(new SetCardInfo("Wood Elves", 1, Rarity.RARE, mage.cards.w.WoodElves.class)); + // 2007 - https://scryfall.com/sets/pg07 + cards.add(new SetCardInfo("Boomerang", 4, Rarity.RARE, mage.cards.b.Boomerang.class)); + cards.add(new SetCardInfo("Calciderm", 5, Rarity.RARE, mage.cards.c.Calciderm.class)); + cards.add(new SetCardInfo("Dauntless Dourbark", 12, Rarity.RARE, mage.cards.d.DauntlessDourbark.class)); + cards.add(new SetCardInfo("Llanowar Elves", 9, Rarity.RARE, mage.cards.l.LlanowarElves.class)); + cards.add(new SetCardInfo("Mind Stone", 11, Rarity.RARE, mage.cards.m.MindStone.class)); + cards.add(new SetCardInfo("Mogg Fanatic", 10, Rarity.RARE, mage.cards.m.MoggFanatic.class)); + cards.add(new SetCardInfo("Reckless Wurm", 6, Rarity.RARE, mage.cards.r.RecklessWurm.class)); + cards.add(new SetCardInfo("Yixlid Jailer", 7, Rarity.RARE, mage.cards.y.YixlidJailer.class)); + cards.add(new SetCardInfo("Zoetic Cavern", 8, Rarity.RARE, mage.cards.z.ZoeticCavern.class)); + // 2008a - https://scryfall.com/sets/pg08 + cards.add(new SetCardInfo("Boggart Ram-Gang", 17, Rarity.RARE, mage.cards.b.BoggartRamGang.class)); + cards.add(new SetCardInfo("Cenn's Tactician", 14, Rarity.RARE, mage.cards.c.CennsTactician.class)); + cards.add(new SetCardInfo("Duergar Hedge-Mage", 19, Rarity.RARE, mage.cards.d.DuergarHedgeMage.class)); + cards.add(new SetCardInfo("Gravedigger", 16, Rarity.RARE, mage.cards.g.Gravedigger.class)); + cards.add(new SetCardInfo("Lava Axe", 13, Rarity.RARE, mage.cards.l.LavaAxe.class)); + cards.add(new SetCardInfo("Oona's Blackguard", 15, Rarity.RARE, mage.cards.o.OonasBlackguard.class)); + cards.add(new SetCardInfo("Selkie Hedge-Mage", 20, Rarity.RARE, mage.cards.s.SelkieHedgeMage.class)); + cards.add(new SetCardInfo("Wilt-Leaf Cavaliers", 18, Rarity.RARE, mage.cards.w.WiltLeafCavaliers.class)); + + // Wizards Play Network Promos -- xmage uses one set (GRC), but scryfall store it by years + // 2008b - https://scryfall.com/sets/pwpn + cards.add(new SetCardInfo("Sprouting Thrinax", 21, Rarity.RARE, mage.cards.s.SproutingThrinax.class)); + cards.add(new SetCardInfo("Woolly Thoctar", 22, Rarity.RARE, mage.cards.w.WoollyThoctar.class)); + // 2009 - https://scryfall.com/sets/pwp09 + cards.add(new SetCardInfo("Hellspark Elemental", 25, Rarity.RARE, mage.cards.h.HellsparkElemental.class)); + cards.add(new SetCardInfo("Kor Duelist", 32, Rarity.RARE, mage.cards.k.KorDuelist.class)); + cards.add(new SetCardInfo("Marisi's Twinclaws", 26, Rarity.RARE, mage.cards.m.MarisisTwinclaws.class)); + cards.add(new SetCardInfo("Mind Control", 30, Rarity.RARE, mage.cards.m.MindControl.class)); + cards.add(new SetCardInfo("Path to Exile", 24, Rarity.RARE, mage.cards.p.PathToExile.class)); + cards.add(new SetCardInfo("Rise from the Grave", 31, Rarity.RARE, mage.cards.r.RiseFromTheGrave.class)); + cards.add(new SetCardInfo("Slave of Bolas", 27, Rarity.RARE, mage.cards.s.SlaveOfBolas.class)); + cards.add(new SetCardInfo("Vampire Nighthawk", 33, Rarity.RARE, mage.cards.v.VampireNighthawk.class)); + // 2010 - https://scryfall.com/sets/pwp10 + cards.add(new SetCardInfo("Curse of Wizardry", 47, Rarity.RARE, mage.cards.c.CurseOfWizardry.class)); + cards.add(new SetCardInfo("Fling", 50, Rarity.RARE, mage.cards.f.Fling.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Golem's Heart", 60, Rarity.RARE, mage.cards.g.GolemsHeart.class)); + cards.add(new SetCardInfo("Kor Firewalker", 36, Rarity.RARE, mage.cards.k.KorFirewalker.class)); + cards.add(new SetCardInfo("Leatherback Baloth", 37, Rarity.RARE, mage.cards.l.LeatherbackBaloth.class)); + cards.add(new SetCardInfo("Pathrazer of Ulamog", 46, Rarity.RARE, mage.cards.p.PathrazerOfUlamog.class)); + cards.add(new SetCardInfo("Plague Stinger", 59, Rarity.RARE, mage.cards.p.PlagueStinger.class)); + cards.add(new SetCardInfo("Skinrender", 63, Rarity.RARE, mage.cards.s.Skinrender.class)); + cards.add(new SetCardInfo("Sylvan Ranger", 51, Rarity.RARE, mage.cards.s.SylvanRanger.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Syphon Mind", 40, Rarity.RARE, mage.cards.s.SyphonMind.class)); + // 2011 - https://scryfall.com/sets/pwp11 + cards.add(new SetCardInfo("Auramancer", 77, Rarity.RARE, mage.cards.a.Auramancer.class)); + cards.add(new SetCardInfo("Bloodcrazed Neonate", 83, Rarity.RARE, mage.cards.b.BloodcrazedNeonate.class)); + cards.add(new SetCardInfo("Boneyard Wurm", 84, Rarity.RARE, mage.cards.b.BoneyardWurm.class)); + cards.add(new SetCardInfo("Circle of Flame", 78, Rarity.RARE, mage.cards.c.CircleOfFlame.class)); + cards.add(new SetCardInfo("Curse of the Bloody Tome", 80, Rarity.RARE, mage.cards.c.CurseOfTheBloodyTome.class)); + cards.add(new SetCardInfo("Fling", 69, Rarity.RARE, mage.cards.f.Fling.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Master's Call", 64, Rarity.RARE, mage.cards.m.MastersCall.class)); + cards.add(new SetCardInfo("Maul Splicer", 72, Rarity.RARE, mage.cards.m.MaulSplicer.class)); + cards.add(new SetCardInfo("Plague Myr", 65, Rarity.RARE, mage.cards.p.PlagueMyr.class)); + cards.add(new SetCardInfo("Shrine of Burning Rage", 73, Rarity.RARE, mage.cards.s.ShrineOfBurningRage.class)); + cards.add(new SetCardInfo("Signal Pest", 66, Rarity.RARE, mage.cards.s.SignalPest.class)); + cards.add(new SetCardInfo("Sylvan Ranger", 70, Rarity.RARE, mage.cards.s.SylvanRanger.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Tormented Soul", 76, Rarity.RARE, mage.cards.t.TormentedSoul.class)); + cards.add(new SetCardInfo("Vault Skirge", 71, Rarity.RARE, mage.cards.v.VaultSkirge.class)); + // 2012 - https://scryfall.com/sets/pwp12 + cards.add(new SetCardInfo("Curse of Thirst", 81, Rarity.RARE, mage.cards.c.CurseOfThirst.class)); + cards.add(new SetCardInfo("Gather the Townsfolk", 79, Rarity.RARE, mage.cards.g.GatherTheTownsfolk.class)); + cards.add(new SetCardInfo("Nearheath Stalker", 82, Rarity.RARE, mage.cards.n.NearheathStalker.class)); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/WPNGateway.java b/Mage.Sets/src/mage/sets/WPNGateway.java deleted file mode 100644 index ea7ec76c723..00000000000 --- a/Mage.Sets/src/mage/sets/WPNGateway.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * 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.sets; - -import mage.cards.ExpansionSet; -import mage.cards.i.IcatianJavelineers; -import mage.constants.Rarity; -import mage.constants.SetType; - -/** - * - * @author fireshoes - */ -public final class WPNGateway extends ExpansionSet { - - private static final WPNGateway instance = new WPNGateway(); - - public static WPNGateway getInstance() { - return instance; - } - - private WPNGateway() { - super("WPN Gateway", "GRC", ExpansionSet.buildDate(2011, 6, 17), SetType.PROMOTIONAL); - this.hasBoosters = false; - this.hasBasicLands = false; - cards.add(new SetCardInfo("Auramancer", 77, Rarity.SPECIAL, mage.cards.a.Auramancer.class)); - cards.add(new SetCardInfo("Bloodcrazed Neonate", 83, Rarity.SPECIAL, mage.cards.b.BloodcrazedNeonate.class)); - cards.add(new SetCardInfo("Boggart Ram-Gang", 17, Rarity.SPECIAL, mage.cards.b.BoggartRamGang.class)); - cards.add(new SetCardInfo("Boneyard Wurm", 84, Rarity.SPECIAL, mage.cards.b.BoneyardWurm.class)); - cards.add(new SetCardInfo("Boomerang", 4, Rarity.SPECIAL, mage.cards.b.Boomerang.class)); - cards.add(new SetCardInfo("Calciderm", 5, Rarity.SPECIAL, mage.cards.c.Calciderm.class)); - cards.add(new SetCardInfo("Cenn's Tactician", 14, Rarity.SPECIAL, mage.cards.c.CennsTactician.class)); - cards.add(new SetCardInfo("Circle of Flame", 78, Rarity.SPECIAL, mage.cards.c.CircleOfFlame.class)); - cards.add(new SetCardInfo("Curse of the Bloody Tome", 80, Rarity.SPECIAL, mage.cards.c.CurseOfTheBloodyTome.class)); - cards.add(new SetCardInfo("Curse of Thirst", 81, Rarity.SPECIAL, mage.cards.c.CurseOfThirst.class)); - cards.add(new SetCardInfo("Curse of Wizardry", 47, Rarity.SPECIAL, mage.cards.c.CurseOfWizardry.class)); - cards.add(new SetCardInfo("Dauntless Dourbark", 12, Rarity.SPECIAL, mage.cards.d.DauntlessDourbark.class)); - cards.add(new SetCardInfo("Deathless Angel", 49, Rarity.SPECIAL, mage.cards.d.DeathlessAngel.class)); - cards.add(new SetCardInfo("Duergar Hedge-Mage", 19, Rarity.SPECIAL, mage.cards.d.DuergarHedgeMage.class)); - cards.add(new SetCardInfo("Emeria Angel", 35, Rarity.SPECIAL, mage.cards.e.EmeriaAngel.class)); - cards.add(new SetCardInfo("Fiery Temper", 3, Rarity.SPECIAL, mage.cards.f.FieryTemper.class)); - cards.add(new SetCardInfo("Fling", 69, Rarity.SPECIAL, mage.cards.f.Fling.class)); - cards.add(new SetCardInfo("Gather the Townsfolk", 79, Rarity.SPECIAL, mage.cards.g.GatherTheTownsfolk.class)); - cards.add(new SetCardInfo("Golem's Heart", 60, Rarity.SPECIAL, mage.cards.g.GolemsHeart.class)); - cards.add(new SetCardInfo("Gravedigger", 16, Rarity.SPECIAL, mage.cards.g.Gravedigger.class)); - cards.add(new SetCardInfo("Hada Freeblade", 38, Rarity.SPECIAL, mage.cards.h.HadaFreeblade.class)); - cards.add(new SetCardInfo("Hellspark Elemental", 25, Rarity.SPECIAL, mage.cards.h.HellsparkElemental.class)); - cards.add(new SetCardInfo("Icatian Javelineers", 2, Rarity.SPECIAL, IcatianJavelineers.class)); - cards.add(new SetCardInfo("Kalastria Highborn", 39, Rarity.SPECIAL, mage.cards.k.KalastriaHighborn.class)); - cards.add(new SetCardInfo("Kor Duelist", 32, Rarity.SPECIAL, mage.cards.k.KorDuelist.class)); - cards.add(new SetCardInfo("Kor Firewalker", 36, Rarity.SPECIAL, mage.cards.k.KorFirewalker.class)); - cards.add(new SetCardInfo("Lava Axe", 13, Rarity.SPECIAL, mage.cards.l.LavaAxe.class)); - cards.add(new SetCardInfo("Leatherback Baloth", 37, Rarity.SPECIAL, mage.cards.l.LeatherbackBaloth.class)); - cards.add(new SetCardInfo("Llanowar Elves", 9, Rarity.SPECIAL, mage.cards.l.LlanowarElves.class)); - cards.add(new SetCardInfo("Marisi's Twinclaws", 26, Rarity.SPECIAL, mage.cards.m.MarisisTwinclaws.class)); - cards.add(new SetCardInfo("Master's Call", 64, Rarity.SPECIAL, mage.cards.m.MastersCall.class)); - cards.add(new SetCardInfo("Maul Splicer", 72, Rarity.SPECIAL, mage.cards.m.MaulSplicer.class)); - cards.add(new SetCardInfo("Mind Control", 30, Rarity.SPECIAL, mage.cards.m.MindControl.class)); - cards.add(new SetCardInfo("Mind Stone", 11, Rarity.SPECIAL, mage.cards.m.MindStone.class)); - cards.add(new SetCardInfo("Mogg Fanatic", 10, Rarity.SPECIAL, mage.cards.m.MoggFanatic.class)); - cards.add(new SetCardInfo("Mycoid Shepherd", 28, Rarity.SPECIAL, mage.cards.m.MycoidShepherd.class)); - cards.add(new SetCardInfo("Naya Sojourners", 29, Rarity.SPECIAL, mage.cards.n.NayaSojourners.class)); - cards.add(new SetCardInfo("Nearheath Stalker", 82, Rarity.SPECIAL, mage.cards.n.NearheathStalker.class)); - cards.add(new SetCardInfo("Nissa's Chosen", 34, Rarity.SPECIAL, mage.cards.n.NissasChosen.class)); - cards.add(new SetCardInfo("Oona's Blackguard", 15, Rarity.SPECIAL, mage.cards.o.OonasBlackguard.class)); - cards.add(new SetCardInfo("Pathrazer of Ulamog", 46, Rarity.SPECIAL, mage.cards.p.PathrazerOfUlamog.class)); - cards.add(new SetCardInfo("Path to Exile", 24, Rarity.SPECIAL, mage.cards.p.PathToExile.class)); - cards.add(new SetCardInfo("Plague Myr", 65, Rarity.SPECIAL, mage.cards.p.PlagueMyr.class)); - cards.add(new SetCardInfo("Plague Stinger", 59, Rarity.SPECIAL, mage.cards.p.PlagueStinger.class)); - cards.add(new SetCardInfo("Reckless Wurm", 6, Rarity.SPECIAL, mage.cards.r.RecklessWurm.class)); - cards.add(new SetCardInfo("Rise from the Grave", 31, Rarity.SPECIAL, mage.cards.r.RiseFromTheGrave.class)); - cards.add(new SetCardInfo("Selkie Hedge-Mage", 20, Rarity.SPECIAL, mage.cards.s.SelkieHedgeMage.class)); - cards.add(new SetCardInfo("Shrine of Burning Rage", 73, Rarity.SPECIAL, mage.cards.s.ShrineOfBurningRage.class)); - cards.add(new SetCardInfo("Signal Pest", 66, Rarity.SPECIAL, mage.cards.s.SignalPest.class)); - cards.add(new SetCardInfo("Skinrender", 63, Rarity.SPECIAL, mage.cards.s.Skinrender.class)); - cards.add(new SetCardInfo("Slave of Bolas", 27, Rarity.SPECIAL, mage.cards.s.SlaveOfBolas.class)); - cards.add(new SetCardInfo("Sprouting Thrinax", 21, Rarity.SPECIAL, mage.cards.s.SproutingThrinax.class)); - cards.add(new SetCardInfo("Staggershock", 48, Rarity.SPECIAL, mage.cards.s.Staggershock.class)); - cards.add(new SetCardInfo("Sylvan Ranger", 70, Rarity.SPECIAL, mage.cards.s.SylvanRanger.class)); - cards.add(new SetCardInfo("Syphon Mind", 40, Rarity.SPECIAL, mage.cards.s.SyphonMind.class)); - cards.add(new SetCardInfo("Tormented Soul", 76, Rarity.SPECIAL, mage.cards.t.TormentedSoul.class)); - cards.add(new SetCardInfo("Vampire Nighthawk", 33, Rarity.SPECIAL, mage.cards.v.VampireNighthawk.class)); - cards.add(new SetCardInfo("Vault Skirge", 71, Rarity.SPECIAL, mage.cards.v.VaultSkirge.class)); - cards.add(new SetCardInfo("Wilt-Leaf Cavaliers", 18, Rarity.SPECIAL, mage.cards.w.WiltLeafCavaliers.class)); - cards.add(new SetCardInfo("Wood Elves", 1, Rarity.SPECIAL, mage.cards.w.WoodElves.class)); - cards.add(new SetCardInfo("Woolly Thoctar", 22, Rarity.SPECIAL, mage.cards.w.WoollyThoctar.class)); - cards.add(new SetCardInfo("Yixlid Jailer", 7, Rarity.SPECIAL, mage.cards.y.YixlidJailer.class)); - cards.add(new SetCardInfo("Zoetic Cavern", 8, Rarity.SPECIAL, mage.cards.z.ZoeticCavern.class)); - } -} diff --git a/Mage.Sets/src/mage/sets/WelcomeDeck2016.java b/Mage.Sets/src/mage/sets/WelcomeDeck2016.java index c4b6e6442b7..fd8b916d4dc 100644 --- a/Mage.Sets/src/mage/sets/WelcomeDeck2016.java +++ b/Mage.Sets/src/mage/sets/WelcomeDeck2016.java @@ -1,4 +1,3 @@ - package mage.sets; import mage.cards.ExpansionSet; @@ -32,7 +31,7 @@ public final class WelcomeDeck2016 extends ExpansionSet { cards.add(new SetCardInfo("Nightmare", 8, Rarity.RARE, mage.cards.n.Nightmare.class)); cards.add(new SetCardInfo("Oakenform", 15, Rarity.COMMON, mage.cards.o.Oakenform.class)); cards.add(new SetCardInfo("Sengir Vampire", 9, Rarity.UNCOMMON, mage.cards.s.SengirVampire.class)); - cards.add(new SetCardInfo("Serra Angel", 3, Rarity.RARE, mage.cards.s.SerraAngel.class)); + cards.add(new SetCardInfo("Serra Angel", 3, Rarity.UNCOMMON, mage.cards.s.SerraAngel.class)); cards.add(new SetCardInfo("Shivan Dragon", 13, Rarity.RARE, mage.cards.s.ShivanDragon.class)); cards.add(new SetCardInfo("Soul of the Harvest", 16, Rarity.RARE, mage.cards.s.SoulOfTheHarvest.class)); cards.add(new SetCardInfo("Sphinx of Magosi", 6, Rarity.RARE, mage.cards.s.SphinxOfMagosi.class)); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/JumpStartTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/JumpStartTest.java new file mode 100644 index 00000000000..ca0be117360 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/JumpStartTest.java @@ -0,0 +1,110 @@ +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; + +/** + * Jump-start is found on instants and sorceries. You can cast a card with + * jump-start from your graveyard by paying all its regular costs and one + * additional cost: discarding a card from your hand. + * + * @author LevelX2 + */ +public class JumpStartTest extends CardTestPlayerBase { + + @Test + public void testNormalUse() { + // Direct Current deals 2 damage to any target. + // Jump-start + addCard(Zone.HAND, playerA, "Direct Current", 1); // Sorcery {1}{R}{R} + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 6); + addCard(Zone.HAND, playerA, "Disenchant", 1); + + addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 1); // 2/2 + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Direct Current", "Silvercoat Lion"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Direct Current with jump-start", playerB); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertGraveyardCount(playerB, "Silvercoat Lion", 1); + assertHandCount(playerA, 0); // 1 from sacrificed Clue and 1 from draw of turn 3 + assertExileCount(playerA, "Direct Current", 1); + + assertLife(playerA, 20); + assertLife(playerB, 18); + + } + + @Test + public void testCastFromGraveyardCountered() { + // Direct Current deals 2 damage to any target. + // Jump-start + addCard(Zone.HAND, playerA, "Direct Current", 1); // Sorcery {1}{R}{R} + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 6); + addCard(Zone.HAND, playerA, "Disenchant", 1); + + addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 1); // 2/2 + addCard(Zone.HAND, playerB, "Counterspell", 1); + addCard(Zone.BATTLEFIELD, playerB, "Island", 2); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Direct Current", "Silvercoat Lion"); + castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Direct Current with jump-start", playerB); + castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerB, "Counterspell", "Direct Current"); + + setStopAt(1, PhaseStep.END_TURN); + execute(); + + assertGraveyardCount(playerB, "Silvercoat Lion", 1); + assertGraveyardCount(playerB, "Counterspell", 1); + assertHandCount(playerA, 0); + assertGraveyardCount(playerA, "Direct Current", 0); + assertExileCount(playerA, "Direct Current", 1); + + assertLife(playerA, 20); + assertLife(playerB, 20); + + } + + @Test + public void testWithExperimentalFrenzy() { + // Direct Current deals 2 damage to any target. + // Jump-start + addCard(Zone.HAND, playerA, "Direct Current", 1); // Sorcery {1}{R}{R} + // You may look at the top card of your library any time. + // You may play the top card of your library. + // You can't play cards from your hand. + // {3}{R}: Destroy Experimental Frenzy. + addCard(Zone.HAND, playerA, "Experimental Frenzy", 1); // Enchantment {3}{R} + + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 12); + addCard(Zone.HAND, playerA, "Lightning Bolt", 2); + + addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 1); // 2/2 + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Direct Current", "Silvercoat Lion"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Experimental Frenzy"); + + castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Direct Current with jump-start", playerB); + castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Lightning Bolt", playerB); + + setStopAt(1, PhaseStep.END_TURN); + execute(); + + assertPermanentCount(playerA, "Experimental Frenzy", 1); + assertGraveyardCount(playerB, "Silvercoat Lion", 1); + assertGraveyardCount(playerA, "Direct Current", 0); + assertExileCount(playerA, "Direct Current", 1); + + assertHandCount(playerA, "Lightning Bolt", 1); // prevented to cast from hand by Experimental Frenzy + assertGraveyardCount(playerA, "Lightning Bolt", 1); // Discarded by using jump-start + + assertLife(playerA, 20); + assertLife(playerB, 18); + + } + +} diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/asthough/PlayFromNonHandZoneTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/asthough/PlayFromNonHandZoneTest.java index 290abd8c566..e7bab18ce5a 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/asthough/PlayFromNonHandZoneTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/asthough/PlayFromNonHandZoneTest.java @@ -1,4 +1,3 @@ - package org.mage.test.cards.asthough; import mage.constants.PhaseStep; @@ -99,8 +98,9 @@ public class PlayFromNonHandZoneTest extends CardTestPlayerBase { assertExileCount("Silvercoat Lion", 1); assertPermanentCount(playerB, "Abzan Banner", 1); - assertPermanentCount(playerB, "Dragon Grip", 1); assertGraveyardCount(playerB, "Peach Garden Oath", 1); + assertExileCount(playerB, "Dragon Grip", 0); + assertGraveyardCount(playerB, "Dragon Grip", 0); assertPowerToughness(playerB, "Narset, Enlightened Master", 5, 2); @@ -108,6 +108,8 @@ public class PlayFromNonHandZoneTest extends CardTestPlayerBase { assertLife(playerA, 17); assertLife(playerB, 22); + assertPermanentCount(playerB, "Dragon Grip", 1); + } @Test @@ -140,7 +142,6 @@ public class PlayFromNonHandZoneTest extends CardTestPlayerBase { assertExileCount(playerB, "Plains", 3); assertExileCount(playerB, 3); - } } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/dynamicvalue/CryptRatsTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/dynamicvalue/CryptRatsTest.java index fd6064f78a3..b00ae84ebf5 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/dynamicvalue/CryptRatsTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/dynamicvalue/CryptRatsTest.java @@ -10,7 +10,7 @@ public class CryptRatsTest extends CardTestPlayerBase { String cRats = "Crypt Rats"; @Test - public void damageOnlyCreatureAndPlayers(){ + public void damageOnlyCreatureAndPlayers() { addCard(Zone.BATTLEFIELD, playerA, "Swamp", 10); addCard(Zone.BATTLEFIELD, playerA, cRats, 1); addCard(Zone.BATTLEFIELD, playerB, "Shivan Dragon", 1); @@ -20,6 +20,7 @@ public class CryptRatsTest extends CardTestPlayerBase { setChoice(playerA, "X=4"); setStopAt(1, PhaseStep.POSTCOMBAT_MAIN); execute(); + assertLife(playerA, 16); assertLife(playerB, 16); assertGraveyardCount(playerA, cRats, 1); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/planeswalker/LilianaTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/planeswalker/LilianaTest.java index 62fc6ce811b..281f0644b2d 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/planeswalker/LilianaTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/planeswalker/LilianaTest.java @@ -19,8 +19,8 @@ public class LilianaTest extends CardTestPlayerBase { /* Binding Mummy {1}{W} Creature - Zombie 2/2 - Whenever another Zombie enters the battlefield under your control, you may tap target artifact or creature. - */ + Whenever another Zombie enters the battlefield under your control, you may tap target artifact or creature. + */ String bMummy = "Binding Mummy"; /* @@ -29,7 +29,7 @@ public class LilianaTest extends CardTestPlayerBase { [+1] : Create a 2/2 black Zombie creature token. Put the top two cards of your library into your graveyard. [-3] : Return target creature card from your graveyard to the battlefield. That creature is a black Zombie in addition to its other colors and types. [-7] : Destroy all non-Zombie creatures. - */ + */ String liliannaDM = "Liliana, Death's Majesty"; /* @@ -37,7 +37,7 @@ public class LilianaTest extends CardTestPlayerBase { Creature - Angel 3/3 Flying, vigilance Cycling {W} - */ + */ String wShepherd = "Winged Shepherd"; String yOx = "Yoked Ox"; // {W} 0/4 @@ -56,7 +56,7 @@ public class LilianaTest extends CardTestPlayerBase { setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); - + assertPermanentCount(playerA, bMummy, 1); assertPermanentCount(playerA, liliannaDM, 1); assertPermanentCount(playerA, wShepherd, 1); @@ -66,4 +66,44 @@ public class LilianaTest extends CardTestPlayerBase { assertType(wShepherd, CardType.CREATURE, SubType.ANGEL); assertTapped(yOx, true); } + + @Test + public void testCastingCreaturesFromGraveTriggerDesecratedTomb() { + + /* + Liliana, Untouched by Death {2}{B}{B} + Legendary Planeswalker — Liliana + +1: Put the top three cards of your library into your graveyard. If at least one of them is a Zombie card, each opponent loses 2 life and you gain 2 life. + −2: Target creature gets -X/-X until end of turn, where X is the number of Zombies you control. + −3: You may cast Zombie cards from your graveyard this turn. + */ + String liliannaUbD = "Liliana, Untouched by Death"; + + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 5); + addCard(Zone.HAND, playerA, liliannaUbD); + /* + * Carrion Feeder {B} + * Creature — Zombie + * Carrion Feeder can’t block. + * Sacrifice a creature: Put a +1/+1 counter on Carrion Feeder. + */ + addCard(Zone.GRAVEYARD, playerA, "Carrion Feeder"); + + // Whenever one or more creature cards leave your graveyard, create a 1/1 black Bat creature token with flying. + addCard(Zone.BATTLEFIELD, playerA, "Desecrated Tomb", 1); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, liliannaUbD); + + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "-3:"); // Liliana -3 + castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Carrion Feeder"); + + setStopAt(1, PhaseStep.END_TURN); + execute(); + + assertPermanentCount(playerA, liliannaUbD, 1); + assertCounterCount(playerA, liliannaUbD, CounterType.LOYALTY, 1); + assertPermanentCount(playerA, "Carrion Feeder", 1); + + assertPermanentCount(playerA, "Bat", 1); + } } 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 2b952a05c25..0fa4a84a094 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 @@ -1,9 +1,5 @@ package org.mage.test.player; -import java.io.Serializable; -import java.util.*; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import mage.MageObject; import mage.MageObjectReference; import mage.ObjectColor; @@ -52,6 +48,12 @@ import mage.target.*; import mage.target.common.*; import org.junit.Assert; import org.junit.Ignore; + +import java.io.Serializable; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + import static org.mage.test.serverside.base.impl.CardTestPlayerAPIImpl.*; /** @@ -126,7 +128,7 @@ public class TestPlayer implements Player { /** * @param maxCallsWithoutAction max number of priority passes a player may - * have for this test (default = 100) + * have for this test (default = 100) */ public void setMaxCallsWithoutAction(int maxCallsWithoutAction) { this.maxCallsWithoutAction = maxCallsWithoutAction; @@ -771,7 +773,7 @@ public class TestPlayer implements Player { // Loop through players and validate can attack/block this turn UUID defenderId = null; //List - for (Iterator it = actions.iterator(); it.hasNext();) { + for (Iterator it = actions.iterator(); it.hasNext(); ) { PlayerAction action = it.next(); if (action.getTurnNum() == game.getTurnNum() && action.getAction().startsWith("attack:")) { String command = action.getAction(); @@ -1590,6 +1592,11 @@ public class TestPlayer implements Player { return computerPlayer.removeFromGraveyard(card, game); } + @Override + public boolean putCardsOnBottomOfLibrary(Card card, Game game, Ability source, boolean anyOrder) { + return computerPlayer.putCardsOnBottomOfLibrary(card, game, source, anyOrder); + } + @Override public boolean putCardsOnBottomOfLibrary(Cards cards, Game game, Ability source, boolean anyOrder) { return computerPlayer.putCardsOnBottomOfLibrary(cards, game, source, anyOrder); @@ -2454,7 +2461,7 @@ public class TestPlayer implements Player { @Override public boolean choose(Outcome outcome, Target target, - UUID sourceId, Game game + UUID sourceId, Game game ) { // needed to call here the TestPlayer because it's overwitten return choose(outcome, target, sourceId, game, null); @@ -2462,7 +2469,7 @@ public class TestPlayer implements Player { @Override public boolean choose(Outcome outcome, Cards cards, - TargetCard target, Game game + TargetCard target, Game game ) { if (!choices.isEmpty()) { for (String choose2 : choices) { @@ -2494,7 +2501,7 @@ public class TestPlayer implements Player { @Override public boolean chooseTargetAmount(Outcome outcome, TargetAmount target, - Ability source, Game game + Ability source, Game game ) { return computerPlayer.chooseTargetAmount(outcome, target, source, game); } @@ -2507,15 +2514,15 @@ public class TestPlayer implements Player { @Override public boolean choosePile(Outcome outcome, String message, - List pile1, List pile2, - Game game + List pile1, List pile2, + Game game ) { return computerPlayer.choosePile(outcome, message, pile1, pile2, game); } @Override public boolean playMana(Ability ability, ManaCost unpaid, - String promptText, Game game + String promptText, Game game ) { groupsForTargetHandling = null; return computerPlayer.playMana(ability, unpaid, promptText, game); @@ -2529,15 +2536,15 @@ public class TestPlayer implements Player { @Override public UUID chooseBlockerOrder(List blockers, CombatGroup combatGroup, - List blockerOrder, Game game + List blockerOrder, Game game ) { return computerPlayer.chooseBlockerOrder(blockers, combatGroup, blockerOrder, game); } @Override public void assignDamage(int damage, List targets, - String singleTargetName, UUID sourceId, - Game game + String singleTargetName, UUID sourceId, + Game game ) { computerPlayer.assignDamage(damage, targets, singleTargetName, sourceId, game); } @@ -2556,14 +2563,14 @@ public class TestPlayer implements Player { @Override public void pickCard(List cards, Deck deck, - Draft draft + Draft draft ) { computerPlayer.pickCard(cards, deck, draft); } @Override public boolean scry(int value, Ability source, - Game game + Game game ) { // Don't scry at the start of the game. if (game.getTurnNum() == 1 && game.getStep() == null) { @@ -2574,44 +2581,44 @@ public class TestPlayer implements Player { @Override public boolean surveil(int value, Ability source, - Game game + Game game ) { return computerPlayer.surveil(value, source, game); } @Override public boolean moveCards(Card card, Zone toZone, - Ability source, Game game + Ability source, Game game ) { return computerPlayer.moveCards(card, toZone, source, game); } @Override public boolean moveCards(Card card, Zone toZone, - Ability source, Game game, - boolean tapped, boolean faceDown, boolean byOwner, List appliedEffects + Ability source, Game game, + boolean tapped, boolean faceDown, boolean byOwner, List appliedEffects ) { return computerPlayer.moveCards(card, toZone, source, game, tapped, faceDown, byOwner, appliedEffects); } @Override public boolean moveCards(Cards cards, Zone toZone, - Ability source, Game game + Ability source, Game game ) { return computerPlayer.moveCards(cards, toZone, source, game); } @Override public boolean moveCards(Set cards, Zone toZone, - Ability source, Game game + Ability source, Game game ) { return computerPlayer.moveCards(cards, toZone, source, game); } @Override public boolean moveCards(Set cards, Zone toZone, - Ability source, Game game, - boolean tapped, boolean faceDown, boolean byOwner, List appliedEffects + Ability source, Game game, + boolean tapped, boolean faceDown, boolean byOwner, List appliedEffects ) { return computerPlayer.moveCards(cards, toZone, source, game, tapped, faceDown, byOwner, appliedEffects); } diff --git a/Mage.Tests/src/test/java/org/mage/test/serverside/deck/DeckValidatorTest.java b/Mage.Tests/src/test/java/org/mage/test/serverside/deck/DeckValidatorTest.java index e472754c2a9..3feddbd4eba 100644 --- a/Mage.Tests/src/test/java/org/mage/test/serverside/deck/DeckValidatorTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/serverside/deck/DeckValidatorTest.java @@ -59,13 +59,9 @@ public class DeckValidatorTest extends MageTestBase { } @Test - public void testStandardValid() { + public void testStandardDeckCardsAmountValid() { ArrayList deck = new ArrayList<>(); - - deck.add(new CardNameAmount("MPS-AKH", 28, 4)); // Rhonas the Indomitable - deck.add(new CardNameAmount("Built to Smash", 4)); - deck.add(new CardNameAmount("Heroic Intervention", 4)); - deck.add(new CardNameAmount("Mountain", 48)); + deck.add(new CardNameAmount("Mountain", 60)); DeckValidator validator = new Standard(); boolean validationSuccessful = testDeckValid(validator, deck); @@ -73,13 +69,9 @@ public class DeckValidatorTest extends MageTestBase { } @Test - public void testStandardNotValid() { + public void testStandardDeckCardsAmountNotValid() { ArrayList deck = new ArrayList<>(); - - deck.add(new CardNameAmount("MPS-AKH", 28, 4)); // Rhonas the Indomitable - deck.add(new CardNameAmount("Built to Smash", 4)); - deck.add(new CardNameAmount("Heroic Intervention", 4)); - deck.add(new CardNameAmount("Mountain", 47)); + deck.add(new CardNameAmount("Mountain", 59)); ArrayList sideboard = new ArrayList<>(); sideboard.add(new CardNameAmount("Mountain", 16)); diff --git a/Mage.Tests/src/test/java/org/mage/test/sets/BoosterGenerationTest.java b/Mage.Tests/src/test/java/org/mage/test/sets/BoosterGenerationTest.java index d282dbc1a9f..bfae2666eb2 100644 --- a/Mage.Tests/src/test/java/org/mage/test/sets/BoosterGenerationTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/sets/BoosterGenerationTest.java @@ -152,6 +152,30 @@ public class BoosterGenerationTest extends MageTestBase { } } + @Test + public void testColdSnap_BoosterMustHaveOneSnowLand() { + for (int i = 0; i < 10; i++) { + List booster = Coldsnap.getInstance().createBooster(); + assertTrue("coldsnap's booster must contain 1 snow covered land", booster.stream().anyMatch(card -> card.isBasic() && card.getName().startsWith("Snow-Covered "))); + } + } + + @Test + public void testMastersEditionII_BoosterMustHaveOneSnowLand() { + for (int i = 0; i < 10; i++) { + List booster = MastersEditionII.getInstance().createBooster(); + assertTrue("Master Editions II's booster must contain 1 snow covered land", booster.stream().anyMatch(card -> card.isBasic() && card.getName().startsWith("Snow-Covered "))); + } + } + + @Test + public void testBattlebond_BoosterMustHaveOneLand() { + for (int i = 0; i < 10; i++) { + List booster = Coldsnap.getInstance().createBooster(); + assertTrue("battlebond's booster must contain 1 land", booster.stream().anyMatch(card -> card.isBasic() && card.isLand())); + } + } + private static String str(List cards) { StringBuilder sb = new StringBuilder("["); Iterator iterator = cards.iterator(); diff --git a/Mage.Tests/src/test/java/org/mage/test/stub/PlayerStub.java b/Mage.Tests/src/test/java/org/mage/test/stub/PlayerStub.java index 4cdd7e00e6a..810c068ccf6 100644 --- a/Mage.Tests/src/test/java/org/mage/test/stub/PlayerStub.java +++ b/Mage.Tests/src/test/java/org/mage/test/stub/PlayerStub.java @@ -1,7 +1,5 @@ package org.mage.test.stub; -import java.io.Serializable; -import java.util.*; import mage.MageObject; import mage.MageObjectReference; import mage.abilities.*; @@ -40,8 +38,10 @@ import mage.target.TargetAmount; import mage.target.TargetCard; import mage.target.common.TargetCardInLibrary; +import java.io.Serializable; +import java.util.*; + /** - * * @author Quercitron */ public class PlayerStub implements Player { @@ -882,6 +882,11 @@ public class PlayerStub implements Player { return false; } + @Override + public boolean putCardsOnBottomOfLibrary(Card card, Game game, Ability source, boolean anyOrder) { + return false; + } + @Override public boolean putCardsOnBottomOfLibrary(Cards cards, Game game, Ability source, boolean anyOrder) { return false; diff --git a/Mage.Verify/src/main/java/mage/verify/MtgJson.java b/Mage.Verify/src/main/java/mage/verify/MtgJson.java index 287aecef3dd..1919f8db0f8 100644 --- a/Mage.Verify/src/main/java/mage/verify/MtgJson.java +++ b/Mage.Verify/src/main/java/mage/verify/MtgJson.java @@ -27,7 +27,8 @@ public final class MtgJson { mtgJsonToXMageCodes.put("pPRE", "PTC"); mtgJsonToXMageCodes.put("pMPR", "MPRP"); mtgJsonToXMageCodes.put("pMEI", "MBP"); - mtgJsonToXMageCodes.put("pGTW", "GRC"); // pGTW - Gateway = GRC - WPN Gateway ??? + mtgJsonToXMageCodes.put("pGTW", "GRC"); // pGTW - Gateway = GRC (WPN + Gateway in one inner set) + mtgJsonToXMageCodes.put("pWPN", "GRC"); // pWPN - Wizards Play Network = GRC (WPN + Gateway in one inner set) mtgJsonToXMageCodes.put("pGRU", "GUR"); mtgJsonToXMageCodes.put("pGPX", "GPX"); mtgJsonToXMageCodes.put("pFNM", "FNMP"); @@ -41,18 +42,22 @@ public final class MtgJson { mtgJsonToXMageCodes.put("DD3_DVD", "DDC"); mtgJsonToXMageCodes.put("NMS", "NEM"); mtgJsonToXMageCodes.put("MPS_AKH", "MPS-AKH"); + mtgJsonToXMageCodes.put("FRF_UGIN", "UGIN"); + mtgJsonToXMageCodes.put("pCMP", "CP"); // revert search - for(Map.Entry entry: mtgJsonToXMageCodes.entrySet()){ + for (Map.Entry entry : mtgJsonToXMageCodes.entrySet()) { xMageToMtgJsonCodes.put(entry.getValue(), entry.getKey()); } } - private MtgJson() {} + private MtgJson() { + } private static final class CardHolder { private static final Map cards; + static { try { cards = loadAllCards(); @@ -65,6 +70,7 @@ public final class MtgJson { private static final class SetHolder { private static final Map sets; + static { try { sets = loadAllSets(); @@ -75,11 +81,13 @@ public final class MtgJson { } private static Map loadAllCards() throws IOException { - return readFromZip("AllCards.json.zip", new TypeReference>() {}); + return readFromZip("AllCards.json.zip", new TypeReference>() { + }); } private static Map loadAllSets() throws IOException { - return readFromZip("AllSets.json.zip", new TypeReference>() {}); + return readFromZip("AllSets.json.zip", new TypeReference>() { + }); } private static T readFromZip(String filename, TypeReference ref) throws IOException { diff --git a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java index 3882476d582..34869ff85bd 100644 --- a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java +++ b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java @@ -4,10 +4,12 @@ import mage.ObjectColor; import mage.cards.*; import mage.cards.basiclands.BasicLand; import mage.constants.CardType; +import mage.constants.Constants; import mage.constants.Rarity; import mage.constants.SuperType; import mage.game.permanent.token.Token; import mage.game.permanent.token.TokenImpl; +import mage.util.CardUtil; import org.junit.Assert; import org.junit.Ignore; import org.junit.Test; @@ -42,12 +44,12 @@ public class VerifyCardDataTest { skipCheckLists.put(listName, new LinkedHashSet<>()); } - private static void skipListAddName(String listName, String name) { - skipCheckLists.get(listName).add(name); + private static void skipListAddName(String listName, String set, String name) { + skipCheckLists.get(listName).add(set + " - " + name); } - private static boolean skipListHaveName(String listName, String name) { - return skipCheckLists.get(listName).contains(name); + private static boolean skipListHaveName(String listName, String set, String name) { + return skipCheckLists.get(listName).contains(set + " - " + name); } static { @@ -55,8 +57,8 @@ public class VerifyCardDataTest { // power-toughness skipListCreate("PT"); - skipListAddName("PT", "Garbage Elemental"); // UST - skipListAddName("PT", "Infinity Elemental"); // UST + skipListAddName("PT", "UST", "Garbage Elemental"); + skipListAddName("PT", "UST", "Infinity Elemental"); // color skipListCreate("COLOR"); @@ -96,15 +98,16 @@ public class VerifyCardDataTest { } private void warn(Card card, String message) { - System.out.println("Warning: " + message + " for " + card.getName() + " (" + card.getExpansionSetCode() + ")"); + outputMessages.add("Warning: " + message + " for " + card.getExpansionSetCode() + " - " + card.getName() + " - " + card.getCardNumber()); } private void fail(Card card, String category, String message) { failed++; - System.out.println("Error: (" + category + ") " + message + " for " + card.getName() + " (" + card.getExpansionSetCode() + ")"); + outputMessages.add("Error: (" + category + ") " + message + " for " + card.getExpansionSetCode() + " - " + card.getName() + " - " + card.getCardNumber()); } private int failed = 0; + private ArrayList outputMessages = new ArrayList<>(); @Test public void verifyCards() throws IOException { @@ -117,8 +120,10 @@ public class VerifyCardDataTest { check(card, tokens); } } + + printMessages(outputMessages); if (failed > 0) { - Assert.fail(failed + " Errors"); + Assert.fail(failed + " errors in verify"); } } @@ -256,13 +261,23 @@ public class VerifyCardDataTest { } } - private void printMessages(Collection list) { - for (String mes : list) { + private void printMessages(Collection list, boolean sorted) { + + ArrayList sortedList = new ArrayList<>(list); + if (sorted) { + sortedList.sort(String::compareTo); + } + + for (String mes : sortedList) { System.out.println(mes); } } - private String extractShortClass(Class tokenClass) { + private void printMessages(Collection list) { + printMessages(list, true); + } + + private String extractShortClass(Class tokenClass) { String origin = tokenClass.getName(); if (origin.contains("$")) { // inner classes, example: mage.cards.f.FigureOfDestiny$FigureOfDestinyToken3 @@ -273,6 +288,114 @@ public class VerifyCardDataTest { } } + @Test + public void checkMissingSetData() { + Collection errorsList = new ArrayList<>(); + Collection warningsList = new ArrayList<>(); + + Collection sets = Sets.getInstance().values(); + + // 1. wrong set class names + for (ExpansionSet set : sets) { + String className = extractShortClass(set.getClass()); + String needClassName = set.getName() + //.replaceAll("Duel Decks", "") + .replaceAll("&", "And") + .replaceAll(" vs. ", " Vs ") // for more friendly class name generation in logs TODO: replace to CamelCase transform instead custom words + .replaceAll(" the ", " The ") + .replaceAll(" and ", " And ") + .replaceAll(" of ", " Of ") + .replaceAll(" to ", " To ") + .replaceAll(" for ", " For ") + .replaceAll(" into ", " Into ") + .replaceAll(" over ", " Over ") + .replaceAll("[ .+-/:\"']", ""); + + //if (!className.toLowerCase(Locale.ENGLISH).equals(needClassName.toLowerCase(Locale.ENGLISH))) { + if (!className.equals(needClassName)) { + errorsList.add("error, set's class name must be equal to set name: " + + className + " from " + set.getClass().getName() + ", caption: " + set.getName() + ", need name: " + needClassName); + } + } + + // 2. wrong basic lands settings (it's for lands search, not booster construct) + Map skipLandCheck = new HashMap<>(); + for (ExpansionSet set : sets) { + if (skipLandCheck.containsKey(set.getName())) { + continue; + } + + Boolean needLand = set.hasBasicLands(); + Boolean foundedLand = false; + Map foundLandsList = new HashMap<>(); + for (ExpansionSet.SetCardInfo card : set.getSetCardInfo()) { + if (isBasicLandName(card.getName())) { + foundedLand = true; + int count = foundLandsList.getOrDefault(card.getName(), 0); + foundLandsList.put(card.getName(), count + 1); + } + } + + String landNames = foundLandsList.entrySet().stream() + .map(p -> (p.getKey() + " - " + p.getValue().toString())) + .sorted().collect(Collectors.joining(", ")); + + if (needLand && !foundedLand) { + errorsList.add("error, found set with wrong hasBasicLands - it's true, but haven't land cards: " + set.getCode() + " in " + set.getClass().getName()); + } + + if (!needLand && foundedLand) { + errorsList.add("error, found set with wrong hasBasicLands - it's false, but have land cards: " + set.getCode() + " in " + set.getClass().getName() + ", lands: " + landNames); + } + + // TODO: add test to check num cards (hasBasicLands and numLand > 0) + } + + // TODO: add test to check num cards for rarity (rarityStats > 0 and numRarity > 0) + + printMessages(warningsList); + printMessages(errorsList); + if (errorsList.size() > 0) { + Assert.fail("Founded set errors: " + errorsList.size()); + } + } + + @Test + public void checkMissingCardData() { + Collection errorsList = new ArrayList<>(); + Collection warningsList = new ArrayList<>(); + + Collection sets = Sets.getInstance().values(); + + + // 1. wrong UsesVariousArt settings (set have duplicated card name without that setting -- e.g. cards will have same image) + for (ExpansionSet set : sets) { + + // double names + Map doubleNames = new HashMap<>(); + for (ExpansionSet.SetCardInfo card : set.getSetCardInfo()) { + int count = doubleNames.getOrDefault(card.getName(), 0); + doubleNames.put(card.getName(), count + 1); + } + + // check + for (ExpansionSet.SetCardInfo card : set.getSetCardInfo()) { + boolean cardHaveDoubleName = (doubleNames.getOrDefault(card.getName(), 0) > 1); + boolean cardHaveVariousSetting = card.getGraphicInfo() == null ? false : card.getGraphicInfo().getUsesVariousArt(); + + if(cardHaveDoubleName && !cardHaveVariousSetting) { + errorsList.add("error, founded double card names, but UsesVariousArt is not true: " + set.getCode() + " - " + set.getName() + " - " + card.getName() + " - " + card.getCardNumber()); + } + } + } + + printMessages(warningsList); + printMessages(errorsList); + if (errorsList.size() > 0) { + Assert.fail("Founded card errors: " + errorsList.size()); + } + } + @Test @Ignore // TODO: enable test after massive token fixes public void checkMissingTokenData() { @@ -440,7 +563,7 @@ public class VerifyCardDataTest { } private void checkColors(Card card, JsonCard ref) { - if (skipListHaveName("COLOR", card.getName())) { + if (skipListHaveName("COLOR", card.getExpansionSetCode(), card.getName())) { return; } @@ -460,7 +583,7 @@ public class VerifyCardDataTest { } private void checkSubtypes(Card card, JsonCard ref) { - if (skipListHaveName("SUBTYPE", card.getName())) { + if (skipListHaveName("SUBTYPE", card.getExpansionSetCode(), card.getName())) { return; } @@ -469,7 +592,7 @@ public class VerifyCardDataTest { // fix names (e.g. Urza’s to Urza's) if (expected != null && expected.contains("Urza’s")) { expected = new ArrayList<>(expected); - for (ListIterator it = ((List) expected).listIterator(); it.hasNext();) { + for (ListIterator it = ((List) expected).listIterator(); it.hasNext(); ) { if (it.next().equals("Urza’s")) { it.set("Urza's"); } @@ -482,7 +605,7 @@ public class VerifyCardDataTest { } private void checkSupertypes(Card card, JsonCard ref) { - if (skipListHaveName("SUPERTYPE", card.getName())) { + if (skipListHaveName("SUPERTYPE", card.getExpansionSetCode(), card.getName())) { return; } @@ -492,23 +615,8 @@ public class VerifyCardDataTest { } } - private void checkTypes(Card card, JsonCard ref) { - if (skipListHaveName("TYPE", card.getName())) { - return; - } - - Collection expected = ref.types; - List type = new ArrayList<>(); - for (CardType cardType : card.getCardType()) { - type.add(cardType.toString()); - } - if (!eqSet(type, expected)) { - fail(card, "types", type + " != " + expected); - } - } - private void checkMissingAbilities(Card card, JsonCard ref) { - if (skipListHaveName("MISSING_ABILITIES", card.getName())) { + if (skipListHaveName("MISSING_ABILITIES", card.getExpansionSetCode(), card.getName())) { return; } @@ -533,6 +641,21 @@ public class VerifyCardDataTest { } } + private void checkTypes(Card card, JsonCard ref) { + if (skipListHaveName("TYPE", card.getExpansionSetCode(), card.getName())) { + return; + } + + Collection expected = ref.types; + List type = new ArrayList<>(); + for (CardType cardType : card.getCardType()) { + type.add(cardType.toString()); + } + if (!eqSet(type, expected)) { + fail(card, "types", type + " != " + expected); + } + } + private static boolean eqSet(Collection a, Collection b) { if (a == null || a.isEmpty()) { return b == null || b.isEmpty(); @@ -541,7 +664,7 @@ public class VerifyCardDataTest { } private void checkPT(Card card, JsonCard ref) { - if (skipListHaveName("PT", card.getName())) { + if (skipListHaveName("PT", card.getExpansionSetCode(), card.getName())) { return; } @@ -561,7 +684,7 @@ public class VerifyCardDataTest { } private void checkCost(Card card, JsonCard ref) { - if (skipListHaveName("COST", card.getName())) { + if (skipListHaveName("COST", card.getExpansionSetCode(), card.getName())) { return; } @@ -579,7 +702,7 @@ public class VerifyCardDataTest { } private void checkNumbers(Card card, JsonCard ref) { - if (skipListHaveName("NUMBER", card.getName())) { + if (skipListHaveName("NUMBER", card.getExpansionSetCode(), card.getName())) { return; } diff --git a/Mage/src/main/java/mage/MageObjectImpl.java b/Mage/src/main/java/mage/MageObjectImpl.java index be99ef4b1de..051b9584573 100644 --- a/Mage/src/main/java/mage/MageObjectImpl.java +++ b/Mage/src/main/java/mage/MageObjectImpl.java @@ -9,7 +9,7 @@ import java.util.UUID; import mage.abilities.Abilities; import mage.abilities.AbilitiesImpl; import mage.abilities.Ability; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.costs.mana.ManaCost; import mage.abilities.costs.mana.ManaCosts; import mage.abilities.costs.mana.ManaCostsImpl; @@ -158,8 +158,8 @@ public abstract class MageObjectImpl implements MageObject { @Override public int getStartingLoyalty() { for (Ability ab : getAbilities()) { - if (ab instanceof PlanswalkerEntersWithLoyalityCountersAbility) { - return ((PlanswalkerEntersWithLoyalityCountersAbility) ab).getStartingLoyalty(); + if (ab instanceof PlaneswalkerEntersWithLoyaltyCountersAbility) { + return ((PlaneswalkerEntersWithLoyaltyCountersAbility) ab).getStartingLoyalty(); } } return 0; diff --git a/Mage/src/main/java/mage/abilities/Ability.java b/Mage/src/main/java/mage/abilities/Ability.java index 2f5324f120d..9701e1a140a 100644 --- a/Mage/src/main/java/mage/abilities/Ability.java +++ b/Mage/src/main/java/mage/abilities/Ability.java @@ -1,4 +1,3 @@ - package mage.abilities; import java.io.Serializable; @@ -14,7 +13,6 @@ import mage.abilities.effects.Effects; import mage.constants.AbilityType; import mage.constants.AbilityWord; import mage.constants.EffectType; -import mage.constants.TargetAdjustment; import mage.constants.Zone; import mage.game.Controllable; import mage.game.Game; @@ -23,6 +21,7 @@ import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.Target; import mage.target.Targets; +import mage.target.targetadjustment.TargetAdjuster; import mage.watchers.Watcher; /** @@ -527,7 +526,9 @@ public interface Ability extends Controllable, Serializable { boolean canFizzle(); - void setTargetAdjustment(TargetAdjustment targetAdjustment); + void setTargetAdjuster(TargetAdjuster targetAdjuster); - TargetAdjustment getTargetAdjustment(); + TargetAdjuster getTargetAdjuster(); + + void adjustTargets(Game game); } diff --git a/Mage/src/main/java/mage/abilities/AbilityImpl.java b/Mage/src/main/java/mage/abilities/AbilityImpl.java index 800b1242a3c..6047e079694 100644 --- a/Mage/src/main/java/mage/abilities/AbilityImpl.java +++ b/Mage/src/main/java/mage/abilities/AbilityImpl.java @@ -1,4 +1,3 @@ - package mage.abilities; import java.util.ArrayList; @@ -33,6 +32,7 @@ import mage.game.stack.StackAbility; import mage.players.Player; import mage.target.Target; import mage.target.Targets; +import mage.target.targetadjustment.TargetAdjuster; import mage.util.GameLog; import mage.util.ThreadLocalStringBuilder; import mage.watchers.Watcher; @@ -72,7 +72,7 @@ public abstract class AbilityImpl implements Ability { protected List watchers = new ArrayList<>(); protected List subAbilities = null; protected boolean canFizzle = true; - protected TargetAdjustment targetAdjustment = TargetAdjustment.NONE; + protected TargetAdjuster targetAdjuster = null; public AbilityImpl(AbilityType abilityType, Zone zone) { this.id = UUID.randomUUID(); @@ -119,7 +119,7 @@ public abstract class AbilityImpl implements Ability { this.sourceObject = ability.sourceObject; this.sourceObjectZoneChangeCounter = ability.sourceObjectZoneChangeCounter; this.canFizzle = ability.canFizzle; - this.targetAdjustment = ability.targetAdjustment; + this.targetAdjuster = ability.targetAdjuster; } @Override @@ -1225,12 +1225,19 @@ public abstract class AbilityImpl implements Ability { } @Override - public void setTargetAdjustment(TargetAdjustment targetAdjustment) { - this.targetAdjustment = targetAdjustment; + public void setTargetAdjuster(TargetAdjuster targetAdjuster) { + this.targetAdjuster = targetAdjuster; } @Override - public TargetAdjustment getTargetAdjustment() { - return targetAdjustment; + public TargetAdjuster getTargetAdjuster() { + return targetAdjuster; + } + + @Override + public void adjustTargets(Game game) { + if (targetAdjuster != null) { + targetAdjuster.adjustTargets(this, game); + } } } diff --git a/Mage/src/main/java/mage/abilities/DelayedTriggeredAbility.java b/Mage/src/main/java/mage/abilities/DelayedTriggeredAbility.java index 8748e25d3fb..739915cc4c2 100644 --- a/Mage/src/main/java/mage/abilities/DelayedTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/DelayedTriggeredAbility.java @@ -13,7 +13,7 @@ import mage.game.Game; public abstract class DelayedTriggeredAbility extends TriggeredAbilityImpl { private Duration duration; - private boolean triggerOnlyOnce; + protected boolean triggerOnlyOnce; public DelayedTriggeredAbility(Effect effect) { this(effect, Duration.EndOfGame); diff --git a/Mage/src/main/java/mage/abilities/common/ActivateIfConditionActivatedAbility.java b/Mage/src/main/java/mage/abilities/common/ActivateIfConditionActivatedAbility.java index e7d12c05c78..2d6fe3a254e 100644 --- a/Mage/src/main/java/mage/abilities/common/ActivateIfConditionActivatedAbility.java +++ b/Mage/src/main/java/mage/abilities/common/ActivateIfConditionActivatedAbility.java @@ -10,7 +10,6 @@ import mage.constants.Zone; import mage.game.Game; /** - * * @author LevelX2 */ public class ActivateIfConditionActivatedAbility extends ActivatedAbilityImpl { @@ -37,15 +36,12 @@ public class ActivateIfConditionActivatedAbility extends ActivatedAbilityImpl { } else { sb.append(" Activate this ability only "); } - if (condition.toString() != null) { - if (!condition.toString().startsWith("during") - && !condition.toString().startsWith("before")) { - sb.append("if "); - } - sb.append(condition.toString()).append('.'); - } else { - sb.append(" [Condition toString() == null] "); + if (!condition.toString().startsWith("during") + && !condition.toString().startsWith("before")) { + sb.append("if "); } + sb.append(condition.toString()).append('.'); + return sb.toString(); } diff --git a/Mage/src/main/java/mage/abilities/common/BeginningOfEndStepTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/BeginningOfEndStepTriggeredAbility.java index abbebcf05e3..3ece2bd9540 100644 --- a/Mage/src/main/java/mage/abilities/common/BeginningOfEndStepTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/BeginningOfEndStepTriggeredAbility.java @@ -1,4 +1,3 @@ - package mage.abilities.common; import java.util.Locale; @@ -68,6 +67,7 @@ public class BeginningOfEndStepTriggeredAbility extends TriggeredAbilityImpl { } break; case ANY: + case EACH_PLAYER: case NEXT: if (getTargets().isEmpty()) { for (Effect effect : this.getEffects()) { @@ -123,6 +123,8 @@ public class BeginningOfEndStepTriggeredAbility extends TriggeredAbilityImpl { return sb.insert(0, generateConditionString()).insert(0, abilityWordRule + "At the beginning of each opponent's end step, ").toString(); case ANY: return sb.insert(0, generateConditionString()).insert(0, abilityWordRule + "At the beginning of each end step, ").toString(); + case EACH_PLAYER: + return sb.insert(0, generateConditionString()).insert(0, abilityWordRule + "At the beginning of each player's end step, ").toString(); case CONTROLLER_ATTACHED_TO: return sb.insert(0, generateConditionString()).insert(0, abilityWordRule + "At the beginning of the end step of enchanted permanent's controller, ").toString(); } diff --git a/Mage/src/main/java/mage/abilities/common/CreatureEntersBattlefieldTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/CreatureEntersBattlefieldTriggeredAbility.java deleted file mode 100644 index ba3e9555d74..00000000000 --- a/Mage/src/main/java/mage/abilities/common/CreatureEntersBattlefieldTriggeredAbility.java +++ /dev/null @@ -1,123 +0,0 @@ - -package mage.abilities.common; - -import mage.abilities.TriggeredAbilityImpl; -import mage.abilities.effects.Effect; -import mage.constants.Zone; -import mage.filter.common.FilterCreaturePermanent; -import mage.game.Game; -import mage.game.events.EntersTheBattlefieldEvent; -import mage.game.events.GameEvent; -import mage.game.events.GameEvent.EventType; -import mage.game.permanent.Permanent; -import mage.target.Target; -import mage.target.TargetPlayer; -import mage.target.common.TargetCreaturePermanent; - -/** - * - * @author North - */ -public class CreatureEntersBattlefieldTriggeredAbility extends TriggeredAbilityImpl { - - private boolean opponentController; - protected FilterCreaturePermanent filter = new FilterCreaturePermanent(); - - /** - * optional = false
- * opponentController = false - * - * @param effect - */ - public CreatureEntersBattlefieldTriggeredAbility(Effect effect) { - this(effect, false, false); - } - - /** - * opponentController = false - * - * @param effect - * @param optional - */ - public CreatureEntersBattlefieldTriggeredAbility(Effect effect, boolean optional) { - this(effect, optional, false); - } - - /** - * - * @param effect - * @param optional - * @param opponentController - */ - public CreatureEntersBattlefieldTriggeredAbility(Effect effect, boolean optional, boolean opponentController) { - this(Zone.BATTLEFIELD, effect, optional, opponentController); - - } - - /** - * @param zone - * @param effect - * @param optional - * @param opponentController - */ - public CreatureEntersBattlefieldTriggeredAbility(Zone zone, Effect effect, boolean optional, boolean opponentController) { - this(zone, effect, null, optional, opponentController); - } - - /** - * @param zone - * @param effect - * @param filter filter the triggering creatures - * @param optional - * @param opponentController - */ - public CreatureEntersBattlefieldTriggeredAbility(Zone zone, Effect effect, FilterCreaturePermanent filter, boolean optional, boolean opponentController) { - super(zone, effect, optional); - this.opponentController = opponentController; - if (filter != null) { - this.filter = filter; - } - } - - public CreatureEntersBattlefieldTriggeredAbility(CreatureEntersBattlefieldTriggeredAbility ability) { - super(ability); - this.opponentController = ability.opponentController; - this.filter = ability.filter; - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == EventType.ENTERS_THE_BATTLEFIELD; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - Permanent permanent = ((EntersTheBattlefieldEvent) event).getTarget(); - if (filter.match(permanent, sourceId, controllerId, game) - && (permanent.isControlledBy(this.controllerId) ^ opponentController)) { - if (!this.getTargets().isEmpty()) { - Target target = this.getTargets().get(0); - if (target instanceof TargetPlayer) { - target.add(permanent.getControllerId(), game); - } - if (target instanceof TargetCreaturePermanent) { - target.add(event.getTargetId(), game); - } - } - return true; - } - return false; - } - - @Override - public String getRule() { - return "Whenever a " + filter.getMessage() + " enters the battlefield under " - + (opponentController ? "an opponent's control, " : "your control, ") - + super.getRule(); - } - - @Override - public CreatureEntersBattlefieldTriggeredAbility copy() { - return new CreatureEntersBattlefieldTriggeredAbility(this); - } -} diff --git a/Mage/src/main/java/mage/abilities/common/DiesAttachedTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/DiesAttachedTriggeredAbility.java index 3eb151ac1e2..351ba9821e6 100644 --- a/Mage/src/main/java/mage/abilities/common/DiesAttachedTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/DiesAttachedTriggeredAbility.java @@ -62,41 +62,40 @@ public class DiesAttachedTriggeredAbility extends TriggeredAbilityImpl { if (((ZoneChangeEvent) event).isDiesEvent()) { ZoneChangeEvent zEvent = (ZoneChangeEvent) event; boolean triggered = false; - if (zEvent != null) { - if (zEvent.getTarget() != null && zEvent.getTarget().getAttachments() != null && zEvent.getTarget().getAttachments().contains(this.getSourceId())) { - triggered = true; - } else { - // If both (attachment and attached went to graveyard at the same time, the attachemnets can be already removed from the attached object.) - // So check here with the LKI of the enchantment - Permanent attachment = game.getPermanentOrLKIBattlefield(getSourceId()); - if (attachment != null - && zEvent.getTargetId() != null && attachment.getAttachedTo() != null - && zEvent.getTargetId().equals(attachment.getAttachedTo())) { - Permanent attachedTo = game.getPermanentOrLKIBattlefield(attachment.getAttachedTo()); - if (attachedTo != null - && attachment.getAttachedToZoneChangeCounter() == attachedTo.getZoneChangeCounter(game)) { // zoneChangeCounter is stored in Permanent - triggered = true; + if (zEvent.getTarget() != null && zEvent.getTarget().getAttachments() != null && zEvent.getTarget().getAttachments().contains(this.getSourceId())) { + triggered = true; + } else { + // If both (attachment and attached went to graveyard at the same time, the attachemnets can be already removed from the attached object.) + // So check here with the LKI of the enchantment + Permanent attachment = game.getPermanentOrLKIBattlefield(getSourceId()); + if (attachment != null + && zEvent.getTargetId() != null && attachment.getAttachedTo() != null + && zEvent.getTargetId().equals(attachment.getAttachedTo())) { + Permanent attachedTo = game.getPermanentOrLKIBattlefield(attachment.getAttachedTo()); + if (attachedTo != null + && attachment.getAttachedToZoneChangeCounter() == attachedTo.getZoneChangeCounter(game)) { // zoneChangeCounter is stored in Permanent + triggered = true; + } + } + } + if (triggered) { + for (Effect effect : getEffects()) { + if (zEvent.getTarget() != null) { + effect.setValue("attachedTo", zEvent.getTarget()); + if (setTargetPointer == SetTargetPointer.ATTACHED_TO_CONTROLLER) { + Permanent attachment = game.getPermanentOrLKIBattlefield(getSourceId()); + if (attachment != null && attachment.getAttachedTo() != null) { + Permanent attachedTo = (Permanent) game.getLastKnownInformation(attachment.getAttachedTo(), Zone.BATTLEFIELD, attachment.getAttachedToZoneChangeCounter()); + if (attachedTo != null) { + effect.setTargetPointer(new FixedTarget(attachedTo.getControllerId())); + } + } } } } - if (triggered) { - for (Effect effect : getEffects()) { - if (zEvent.getTarget() != null) { - effect.setValue("attachedTo", zEvent.getTarget()); - if (setTargetPointer == SetTargetPointer.ATTACHED_TO_CONTROLLER) { - Permanent attachment = game.getPermanentOrLKIBattlefield(getSourceId()); - if (attachment != null && attachment.getAttachedTo() != null) { - Permanent attachedTo = (Permanent) game.getLastKnownInformation(attachment.getAttachedTo(), Zone.BATTLEFIELD, attachment.getAttachedToZoneChangeCounter()); - if (attachedTo != null) { - effect.setTargetPointer(new FixedTarget(attachedTo.getControllerId())); - } - } - } - } - } - return true; - } + return true; } + } return false; } diff --git a/Mage/src/main/java/mage/abilities/common/PlanswalkerEntersWithLoyalityCountersAbility.java b/Mage/src/main/java/mage/abilities/common/PlaneswalkerEntersWithLoyaltyCountersAbility.java similarity index 67% rename from Mage/src/main/java/mage/abilities/common/PlanswalkerEntersWithLoyalityCountersAbility.java rename to Mage/src/main/java/mage/abilities/common/PlaneswalkerEntersWithLoyaltyCountersAbility.java index d47119c7f89..58cecdbb696 100644 --- a/Mage/src/main/java/mage/abilities/common/PlanswalkerEntersWithLoyalityCountersAbility.java +++ b/Mage/src/main/java/mage/abilities/common/PlaneswalkerEntersWithLoyaltyCountersAbility.java @@ -12,17 +12,17 @@ import mage.counters.CounterType; * * @author LevelX2 */ -public class PlanswalkerEntersWithLoyalityCountersAbility extends EntersBattlefieldAbility { +public class PlaneswalkerEntersWithLoyaltyCountersAbility extends EntersBattlefieldAbility { private final int startingLoyalty; - public PlanswalkerEntersWithLoyalityCountersAbility(int loyalty) { + public PlaneswalkerEntersWithLoyaltyCountersAbility(int loyalty) { super(new AddCountersSourceEffect(CounterType.LOYALTY.createInstance(loyalty))); startingLoyalty = loyalty; setRuleVisible(false); } - public PlanswalkerEntersWithLoyalityCountersAbility(final PlanswalkerEntersWithLoyalityCountersAbility ability) { + public PlaneswalkerEntersWithLoyaltyCountersAbility(final PlaneswalkerEntersWithLoyaltyCountersAbility ability) { super(ability); startingLoyalty = ability.startingLoyalty; } @@ -32,7 +32,7 @@ public class PlanswalkerEntersWithLoyalityCountersAbility extends EntersBattlefi } @Override - public PlanswalkerEntersWithLoyalityCountersAbility copy() { - return new PlanswalkerEntersWithLoyalityCountersAbility(this); + public PlaneswalkerEntersWithLoyaltyCountersAbility copy() { + return new PlaneswalkerEntersWithLoyaltyCountersAbility(this); } } diff --git a/Mage/src/main/java/mage/abilities/dynamicvalue/common/InstantSorceryExileGraveyardCount.java b/Mage/src/main/java/mage/abilities/dynamicvalue/common/InstantSorceryExileGraveyardCount.java index 744ae371f46..accaf56ad6f 100644 --- a/Mage/src/main/java/mage/abilities/dynamicvalue/common/InstantSorceryExileGraveyardCount.java +++ b/Mage/src/main/java/mage/abilities/dynamicvalue/common/InstantSorceryExileGraveyardCount.java @@ -3,8 +3,9 @@ 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.cards.Card; import mage.filter.StaticFilters; +import mage.game.Game; import mage.players.Player; /** @@ -17,11 +18,15 @@ public enum InstantSorceryExileGraveyardCount implements DynamicValue { public int calculate(Game game, Ability sourceAbility, Effect effect) { Player player = game.getPlayer(sourceAbility.getControllerId()); if (player != null) { + int exileCount = 0; + for (Card exiledCard : game.getExile().getAllCards(game)) { + if (exiledCard.getOwnerId().equals(player.getId()) && exiledCard.isInstantOrSorcery()) { + exileCount++; + } + } return player.getGraveyard().count( StaticFilters.FILTER_CARD_INSTANT_OR_SORCERY, game - ) + game.getExile().getExileZone(player.getId()).count( - StaticFilters.FILTER_CARD_INSTANT_OR_SORCERY, game - ); + ) + exileCount; } return 0; } diff --git a/Mage/src/main/java/mage/abilities/effects/AsThoughEffect.java b/Mage/src/main/java/mage/abilities/effects/AsThoughEffect.java index 44c7c14824a..1c58869db36 100644 --- a/Mage/src/main/java/mage/abilities/effects/AsThoughEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/AsThoughEffect.java @@ -12,7 +12,7 @@ import mage.game.Game; */ public interface AsThoughEffect extends ContinuousEffect { - boolean applies(UUID sourceId, Ability affectedAbility, Ability source, Game game); + boolean applies(UUID sourceId, Ability affectedAbility, Ability source, Game game, UUID playerId); boolean applies(UUID sourceId, Ability source, UUID affectedControllerId, Game game); diff --git a/Mage/src/main/java/mage/abilities/effects/AsThoughEffectImpl.java b/Mage/src/main/java/mage/abilities/effects/AsThoughEffectImpl.java index 020d995cce7..03ed5c0b3d9 100644 --- a/Mage/src/main/java/mage/abilities/effects/AsThoughEffectImpl.java +++ b/Mage/src/main/java/mage/abilities/effects/AsThoughEffectImpl.java @@ -1,4 +1,3 @@ - package mage.abilities.effects; import java.util.UUID; @@ -29,8 +28,12 @@ public abstract class AsThoughEffectImpl extends ContinuousEffectImpl implements } @Override - public boolean applies(UUID objectId, Ability affectedAbility, Ability source, Game game) { - return applies(objectId, source, affectedAbility.getControllerId(), game); + public boolean applies(UUID objectId, Ability affectedAbility, Ability source, Game game, UUID playerId) { + if (getAsThoughEffectType().equals(AsThoughEffectType.LOOK_AT_FACE_DOWN)) { + return applies(objectId, source, playerId, game); + } else { + return applies(objectId, source, affectedAbility.getControllerId(), game); + } } @Override diff --git a/Mage/src/main/java/mage/abilities/effects/ContinuousEffects.java b/Mage/src/main/java/mage/abilities/effects/ContinuousEffects.java index 0fd1aee39b3..ce14ca33b45 100644 --- a/Mage/src/main/java/mage/abilities/effects/ContinuousEffects.java +++ b/Mage/src/main/java/mage/abilities/effects/ContinuousEffects.java @@ -1,4 +1,3 @@ - package mage.abilities.effects; import java.io.Serializable; @@ -14,6 +13,7 @@ import mage.abilities.keyword.SpliceOntoArcaneAbility; import mage.cards.Card; import mage.cards.Cards; import mage.cards.CardsImpl; +import mage.cards.SplitCardHalf; import mage.constants.*; import mage.filter.FilterCard; import mage.filter.predicate.Predicate; @@ -489,15 +489,23 @@ public class ContinuousEffects implements Serializable { */ public MageObjectReference asThough(UUID objectId, AsThoughEffectType type, Ability affectedAbility, UUID controllerId, Game game) { List asThoughEffectsList = getApplicableAsThoughEffects(type, game); - for (AsThoughEffect effect : asThoughEffectsList) { - Set abilities = asThoughEffectsMap.get(type).getAbility(effect.getId()); - for (Ability ability : abilities) { - if (affectedAbility == null) { - if (effect.applies(objectId, ability, controllerId, game)) { + if (!asThoughEffectsList.isEmpty()) { + UUID idToCheck; + if (affectedAbility != null && affectedAbility.getSourceObject(game) instanceof SplitCardHalf) { + idToCheck = ((SplitCardHalf) affectedAbility.getSourceObject(game)).getParentCard().getId(); + } else { + idToCheck = objectId; + } + for (AsThoughEffect effect : asThoughEffectsList) { + Set abilities = asThoughEffectsMap.get(type).getAbility(effect.getId()); + for (Ability ability : abilities) { + if (affectedAbility == null) { + if (effect.applies(idToCheck, ability, controllerId, game)) { + return new MageObjectReference(ability.getSourceObject(game), game); + } + } else if (effect.applies(idToCheck, affectedAbility, ability, game, controllerId)) { return new MageObjectReference(ability.getSourceObject(game), game); } - } else if (effect.applies(objectId, affectedAbility, ability, game)) { - return new MageObjectReference(ability.getSourceObject(game), game); } } } @@ -512,7 +520,7 @@ public class ContinuousEffects implements Serializable { Set abilities = asThoughEffectsMap.get(AsThoughEffectType.SPEND_ONLY_MANA).getAbility(effect.getId()); for (Ability ability : abilities) { if ((affectedAbility == null && effect.applies(objectId, ability, controllerId, game)) - || effect.applies(objectId, affectedAbility, ability, game)) { + || effect.applies(objectId, affectedAbility, ability, game, controllerId)) { if (((AsThoughManaEffect) effect).getAsThoughManaType(manaType, mana, controllerId, ability, game) == null) { return null; } @@ -525,7 +533,7 @@ public class ContinuousEffects implements Serializable { Set abilities = asThoughEffectsMap.get(AsThoughEffectType.SPEND_OTHER_MANA).getAbility(effect.getId()); for (Ability ability : abilities) { if ((affectedAbility == null && effect.applies(objectId, ability, controllerId, game)) - || effect.applies(objectId, affectedAbility, ability, game)) { + || effect.applies(objectId, affectedAbility, ability, game, controllerId)) { ManaType usableManaType = ((AsThoughManaEffect) effect).getAsThoughManaType(manaType, mana, controllerId, ability, game); if (usableManaType != null) { return usableManaType; diff --git a/Mage/src/main/java/mage/abilities/effects/common/AttachEffect.java b/Mage/src/main/java/mage/abilities/effects/common/AttachEffect.java index 989a71b1c24..11fae020f2e 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/AttachEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/AttachEffect.java @@ -1,4 +1,3 @@ - package mage.abilities.effects.common; import mage.abilities.Ability; @@ -39,7 +38,9 @@ public class AttachEffect extends OneShotEffect { Permanent sourcePermanent = game.getPermanent(source.getSourceId()); if (sourcePermanent != null) { int zcc = game.getState().getZoneChangeCounter(sourcePermanent.getId()); - if (zcc == source.getSourceObjectZoneChangeCounter() || zcc == source.getSourceObjectZoneChangeCounter() + 1) { + if (zcc == source.getSourceObjectZoneChangeCounter() + || zcc == source.getSourceObjectZoneChangeCounter() + 1 + || zcc == source.getSourceObjectZoneChangeCounter() + 2) { Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source)); if (permanent != null) { return permanent.addAttachment(source.getSourceId(), game); diff --git a/Mage/src/main/java/mage/abilities/effects/common/ChooseACardNameEffect.java b/Mage/src/main/java/mage/abilities/effects/common/ChooseACardNameEffect.java index e8fc6ab1086..86edae8d1f2 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/ChooseACardNameEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/ChooseACardNameEffect.java @@ -18,7 +18,7 @@ import mage.util.CardUtil; */ public class ChooseACardNameEffect extends OneShotEffect { - public static String INFO_KEY = "NAMED_CARD"; + public static final String INFO_KEY = "NAMED_CARD"; public enum TypeOfName { diff --git a/Mage/src/main/java/mage/abilities/effects/common/ChooseBasicLandTypeEffect.java b/Mage/src/main/java/mage/abilities/effects/common/ChooseBasicLandTypeEffect.java index ee844548314..739aaaeca46 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/ChooseBasicLandTypeEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/ChooseBasicLandTypeEffect.java @@ -22,7 +22,7 @@ import mage.util.CardUtil; */ public class ChooseBasicLandTypeEffect extends OneShotEffect { - public static String VALUE_KEY = "BasicLandType"; + public static final String VALUE_KEY = "BasicLandType"; public ChooseBasicLandTypeEffect(Outcome outcome) { super(outcome); diff --git a/Mage/src/main/java/mage/abilities/effects/common/ChooseCreatureTypeEffect.java b/Mage/src/main/java/mage/abilities/effects/common/ChooseCreatureTypeEffect.java index a41257ec935..c1bdd3f9f48 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/ChooseCreatureTypeEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/ChooseCreatureTypeEffect.java @@ -62,7 +62,7 @@ public class ChooseCreatureTypeEffect extends OneShotEffect { * @param game * @return */ - public static SubType getChoosenCreatureType(UUID objectId, Game game) { + public static SubType getChosenCreatureType(UUID objectId, Game game) { SubType creatureType = null; Object savedCreatureType = game.getState().getValue(objectId + "_type"); if (savedCreatureType != null) { diff --git a/Mage/src/main/java/mage/abilities/effects/common/ChooseOpponentEffect.java b/Mage/src/main/java/mage/abilities/effects/common/ChooseOpponentEffect.java index 8b7662df2bb..8c841e907f7 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/ChooseOpponentEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/ChooseOpponentEffect.java @@ -21,7 +21,7 @@ import mage.util.CardUtil; */ public class ChooseOpponentEffect extends OneShotEffect { - public static String VALUE_KEY = "_opponent"; + public static final String VALUE_KEY = "_opponent"; public ChooseOpponentEffect(Outcome outcome) { super(outcome); diff --git a/Mage/src/main/java/mage/abilities/effects/common/EntersBattlefieldWithXCountersEffect.java b/Mage/src/main/java/mage/abilities/effects/common/EntersBattlefieldWithXCountersEffect.java index 306a8e46500..486bbe1296f 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/EntersBattlefieldWithXCountersEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/EntersBattlefieldWithXCountersEffect.java @@ -39,7 +39,7 @@ public class EntersBattlefieldWithXCountersEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Permanent permanent = game.getPermanent(source.getSourceId()); if (permanent == null) { - if (permanent == null && source.getAbilityType() == AbilityType.STATIC) { + if (source.getAbilityType() == AbilityType.STATIC) { permanent = game.getPermanentEntering(source.getSourceId()); } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/PreventAllNonCombatDamageToAllEffect.java b/Mage/src/main/java/mage/abilities/effects/common/PreventAllNonCombatDamageToAllEffect.java index 601f0423c81..5c857c93c28 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/PreventAllNonCombatDamageToAllEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/PreventAllNonCombatDamageToAllEffect.java @@ -6,6 +6,7 @@ import mage.constants.Duration; import mage.abilities.Ability; import mage.abilities.effects.PreventionEffectImpl; import mage.filter.FilterInPlay; +import mage.filter.FilterPermanent; import mage.game.Game; import mage.game.events.DamageEvent; import mage.game.events.GameEvent; @@ -18,9 +19,9 @@ import mage.players.Player; */ public class PreventAllNonCombatDamageToAllEffect extends PreventionEffectImpl { - protected FilterInPlay filter; + protected final FilterPermanent filter; - public PreventAllNonCombatDamageToAllEffect(Duration duration, FilterInPlay filter) { + public PreventAllNonCombatDamageToAllEffect(Duration duration, FilterPermanent filter) { super(duration, Integer.MAX_VALUE, false); this.filter = filter; staticText = "Prevent all non combat damage that would be dealt to " + filter.getMessage() + ' ' + duration.toString(); @@ -42,15 +43,7 @@ public class PreventAllNonCombatDamageToAllEffect extends PreventionEffectImpl { && !((DamageEvent) event).isCombatDamage()) { Permanent permanent = game.getPermanent(event.getTargetId()); if (permanent != null) { - if (filter.match(permanent, source.getSourceId(), source.getControllerId(), game)) { - return true; - } - } - else { - Player player = game.getPlayer(event.getTargetId()); - if (player != null && filter.match(player, source.getSourceId(), source.getControllerId(), game)) { - return true; - } + return filter.match(permanent, source.getSourceId(), source.getControllerId(), game); } } return false; diff --git a/Mage/src/main/java/mage/abilities/effects/common/RollPlanarDieEffect.java b/Mage/src/main/java/mage/abilities/effects/common/RollPlanarDieEffect.java index 8d9d108fad1..8defc46d6b5 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/RollPlanarDieEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/RollPlanarDieEffect.java @@ -76,7 +76,7 @@ public class RollPlanarDieEffect extends OneShotEffect { for (int i = 0; i < chaosEffects.size(); i++) { Effect effect = chaosEffects.get(i); Target target = null; - if (chaosTargets != null && chaosTargets.size() > i) { + if (chaosTargets.size() > i) { target = chaosTargets.get(i); } boolean done = false; diff --git a/Mage/src/main/java/mage/abilities/effects/common/asthought/PlayFromNotOwnHandZoneAllEffect.java b/Mage/src/main/java/mage/abilities/effects/common/asthought/PlayFromNotOwnHandZoneAllEffect.java new file mode 100644 index 00000000000..5b3927f2139 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/effects/common/asthought/PlayFromNotOwnHandZoneAllEffect.java @@ -0,0 +1,74 @@ +package mage.abilities.effects.common.asthought; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.AsThoughEffectImpl; +import mage.cards.Card; +import mage.constants.AsThoughEffectType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.game.Game; + +/** + * + * @author LevelX2 + */ +public class PlayFromNotOwnHandZoneAllEffect extends AsThoughEffectImpl { + + private final FilterCard filter; + private final Zone fromZone; + private final boolean onlyOwnedCards; + private final TargetController allowedCaster; + + public PlayFromNotOwnHandZoneAllEffect(FilterCard filter, Zone fromZone, boolean onlyOwnedCards, TargetController allowedCaster, Duration duration) { + super(AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, duration, Outcome.Benefit); + this.filter = filter; + this.fromZone = fromZone; + this.onlyOwnedCards = onlyOwnedCards; + this.allowedCaster = allowedCaster; + } + + public PlayFromNotOwnHandZoneAllEffect(final PlayFromNotOwnHandZoneAllEffect effect) { + super(effect); + this.filter = effect.filter; + this.fromZone = effect.fromZone; + this.onlyOwnedCards = effect.onlyOwnedCards; + this.allowedCaster = effect.allowedCaster; + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public PlayFromNotOwnHandZoneAllEffect copy() { + return new PlayFromNotOwnHandZoneAllEffect(this); + } + + @Override + public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) { + Card card = game.getCard(objectId); + if (card != null) { + switch (allowedCaster) { + case YOU: + if (affectedControllerId != source.getControllerId()) { + return false; + } + break; + case OPPONENT: + if (!game.getOpponents(source.getControllerId()).contains(affectedControllerId)) { + return false; + } + break; + } + return !onlyOwnedCards || card.getOwnerId().equals(source.getControllerId()) + && filter.match(card, game) + && game.getState().getZone(card.getId()).match(fromZone); + } + return false; + } +} diff --git a/Mage/src/main/java/mage/abilities/effects/common/asthought/PlayFromNotOwnHandZoneTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/asthought/PlayFromNotOwnHandZoneTargetEffect.java new file mode 100644 index 00000000000..ec878eb5b14 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/effects/common/asthought/PlayFromNotOwnHandZoneTargetEffect.java @@ -0,0 +1,82 @@ +package mage.abilities.effects.common.asthought; + +import java.util.List; +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.AsThoughEffectImpl; +import mage.constants.AsThoughEffectType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.game.Game; + +/** + * + * @author LevelX2 + */ +public class PlayFromNotOwnHandZoneTargetEffect extends AsThoughEffectImpl { + + private final Zone fromZone; + private final TargetController allowedCaster; + + public PlayFromNotOwnHandZoneTargetEffect() { + this(Duration.EndOfTurn); + } + + public PlayFromNotOwnHandZoneTargetEffect(Duration duration) { + this(Zone.ALL, TargetController.YOU, duration); + } + + public PlayFromNotOwnHandZoneTargetEffect(Zone fromZone, Duration duration) { + this(fromZone, TargetController.YOU, duration); + } + + public PlayFromNotOwnHandZoneTargetEffect(Zone fromZone, TargetController allowedCaster, Duration duration) { + super(AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, duration, Outcome.Benefit); + this.fromZone = fromZone; + this.allowedCaster = allowedCaster; + } + + public PlayFromNotOwnHandZoneTargetEffect(final PlayFromNotOwnHandZoneTargetEffect effect) { + super(effect); + this.fromZone = effect.fromZone; + this.allowedCaster = effect.allowedCaster; + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public PlayFromNotOwnHandZoneTargetEffect copy() { + return new PlayFromNotOwnHandZoneTargetEffect(this); + } + + @Override + public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) { + switch (allowedCaster) { + case YOU: + if (affectedControllerId != source.getControllerId()) { + return false; + } + break; + case OPPONENT: + if (!game.getOpponents(source.getControllerId()).contains(affectedControllerId)) { + return false; + } + break; + case ANY: + break; + } + List targets = getTargetPointer().getTargets(game, source); + if (targets.isEmpty()) { + this.discard(); + return false; + } + return targets.contains(objectId) + && affectedControllerId.equals(source.getControllerId()) + && game.getState().getZone(objectId).match(fromZone); + } +} diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/ActivateAbilitiesAnyTimeYouCouldCastInstantEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/ActivateAbilitiesAnyTimeYouCouldCastInstantEffect.java index 4f76c81b722..d15adb8048b 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/ActivateAbilitiesAnyTimeYouCouldCastInstantEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/ActivateAbilitiesAnyTimeYouCouldCastInstantEffect.java @@ -43,7 +43,7 @@ public class ActivateAbilitiesAnyTimeYouCouldCastInstantEffect extends AsThoughE } @Override - public boolean applies(UUID objectId, Ability affectedAbility, Ability source, Game game) { + public boolean applies(UUID objectId, Ability affectedAbility, Ability source, Game game, UUID playerId) { return affectedAbility.isControlledBy(source.getControllerId()) && activatedAbility.isInstance(affectedAbility); } diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/AddCardSubtypeAllEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/AddCardSubtypeAllEffect.java index b0123bb40ff..66bfc9bf0ae 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/AddCardSubtypeAllEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/AddCardSubtypeAllEffect.java @@ -15,8 +15,8 @@ import mage.game.permanent.Permanent; public class AddCardSubtypeAllEffect extends ContinuousEffectImpl { - private static FilterPermanent filter; - private static SubType addedSubtype; + private FilterPermanent filter; + private SubType addedSubtype; public AddCardSubtypeAllEffect(FilterPermanent _filter, SubType _addedSubtype, DependencyType _dependency) { super(Duration.WhileOnBattlefield, Layer.TypeChangingEffects_4, SubLayer.NA, Outcome.Benefit); @@ -28,6 +28,8 @@ public class AddCardSubtypeAllEffect extends ContinuousEffectImpl { public AddCardSubtypeAllEffect(final AddCardSubtypeAllEffect effect) { super(effect); + filter = effect.filter.copy(); + addedSubtype = effect.addedSubtype; } @Override diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/AddChosenSubtypeEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/AddChosenSubtypeEffect.java index bb86dce4a5d..cf8c158d7bb 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/AddChosenSubtypeEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/AddChosenSubtypeEffect.java @@ -22,7 +22,7 @@ public class AddChosenSubtypeEffect extends ContinuousEffectImpl { public boolean apply(Game game, Ability source) { Permanent permanent = game.getPermanent(source.getSourceId()); if (permanent != null) { - SubType subType = ChooseCreatureTypeEffect.getChoosenCreatureType(permanent.getId(), game); + SubType subType = ChooseCreatureTypeEffect.getChosenCreatureType(permanent.getId(), game); if (subType != null && !permanent.hasSubtype(subType, game)) { permanent.getSubtype(game).add(subType); } diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/BoostAllOfChosenSubtypeEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/BoostAllOfChosenSubtypeEffect.java index 7ee579c1fb4..cfc1f2a7b57 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/BoostAllOfChosenSubtypeEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/BoostAllOfChosenSubtypeEffect.java @@ -49,7 +49,7 @@ public class BoostAllOfChosenSubtypeEffect extends BoostAllEffect { @Override protected void setRuntimeData(Ability source, Game game) { - SubType subType = ChooseCreatureTypeEffect.getChoosenCreatureType(source.getSourceId(), game); + SubType subType = ChooseCreatureTypeEffect.getChosenCreatureType(source.getSourceId(), game); if (subType != null) { subtype = subType; } else { diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/SwitchPowerToughnessTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/SwitchPowerToughnessTargetEffect.java index bdf7ecbee9b..3eb33e61e49 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/SwitchPowerToughnessTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/SwitchPowerToughnessTargetEffect.java @@ -32,7 +32,7 @@ public class SwitchPowerToughnessTargetEffect extends ContinuousEffectImpl { @Override public boolean apply(Game game, Ability source) { - Permanent target = game.getPermanent(source.getFirstTarget()); + Permanent target = game.getPermanent(this.getTargetPointer().getFirst(game, source)); if (target != null) { int power = target.getPower().getValue(); target.getPower().setValue(target.getToughness().getValue()); diff --git a/Mage/src/main/java/mage/abilities/effects/common/cost/SpellsCostReductionAllOfChosenSubtypeEffect.java b/Mage/src/main/java/mage/abilities/effects/common/cost/SpellsCostReductionAllOfChosenSubtypeEffect.java index 4a8fdf40d0b..76553629060 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/cost/SpellsCostReductionAllOfChosenSubtypeEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/cost/SpellsCostReductionAllOfChosenSubtypeEffect.java @@ -37,7 +37,7 @@ public class SpellsCostReductionAllOfChosenSubtypeEffect extends SpellsCostReduc @Override protected boolean selectedByRuntimeData(Card card, Ability source, Game game) { - SubType subType = ChooseCreatureTypeEffect.getChoosenCreatureType(source.getSourceId(), game); + SubType subType = ChooseCreatureTypeEffect.getChosenCreatureType(source.getSourceId(), game); if (subType != null) { return card.hasSubtype(subType, game); } diff --git a/Mage/src/main/java/mage/abilities/effects/keyword/FatesealEffect.java b/Mage/src/main/java/mage/abilities/effects/keyword/FatesealEffect.java index cf36084701c..264c11484ef 100644 --- a/Mage/src/main/java/mage/abilities/effects/keyword/FatesealEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/keyword/FatesealEffect.java @@ -24,7 +24,7 @@ import mage.util.CardUtil; public class FatesealEffect extends OneShotEffect { - protected static FilterCard filter1 = new FilterCard("card to put on the bottom of opponent's library"); + protected static final FilterCard filter1 = new FilterCard("card to put on the bottom of opponent's library"); protected int fatesealNumber; diff --git a/Mage/src/main/java/mage/abilities/effects/mana/AddManaOfAnyColorEffect.java b/Mage/src/main/java/mage/abilities/effects/mana/AddManaOfAnyColorEffect.java index ae568822690..dc03549ea0f 100644 --- a/Mage/src/main/java/mage/abilities/effects/mana/AddManaOfAnyColorEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/mana/AddManaOfAnyColorEffect.java @@ -16,12 +16,17 @@ public class AddManaOfAnyColorEffect extends BasicManaEffect { protected final int amount; protected final ArrayList netMana = new ArrayList<>(); + protected final boolean setFlag; public AddManaOfAnyColorEffect() { this(1); } public AddManaOfAnyColorEffect(int amount) { + this(amount, false); + } + + public AddManaOfAnyColorEffect(int amount, boolean setFlag) { super(new Mana(0, 0, 0, 0, 0, 0, amount, 0)); this.amount = amount; netMana.add(Mana.GreenMana(amount)); @@ -30,12 +35,14 @@ public class AddManaOfAnyColorEffect extends BasicManaEffect { netMana.add(Mana.WhiteMana(amount)); netMana.add(Mana.RedMana(amount)); this.staticText = "add " + CardUtil.numberToText(amount) + " mana of any " + (amount > 1 ? "one " : "") + "color"; + this.setFlag = setFlag; } public AddManaOfAnyColorEffect(final AddManaOfAnyColorEffect effect) { super(effect); this.amount = effect.amount; this.netMana.addAll(effect.netMana); + this.setFlag = effect.setFlag; } @Override @@ -66,7 +73,9 @@ public class AddManaOfAnyColorEffect extends BasicManaEffect { ChoiceColor choice = new ChoiceColor(true, mes, game.getObject(source.getSourceId())); if (controller.choose(outcome, choice, game)) { if (choice.getColor() != null) { - return choice.getMana(amount); + Mana mana = choice.getMana(amount); + mana.setFlag(setFlag); + return mana; } } } diff --git a/Mage/src/main/java/mage/abilities/keyword/AftermathAbility.java b/Mage/src/main/java/mage/abilities/keyword/AftermathAbility.java index d661dea2150..bb9c97f3ccd 100644 --- a/Mage/src/main/java/mage/abilities/keyword/AftermathAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/AftermathAbility.java @@ -1,4 +1,3 @@ - package mage.abilities.keyword; import java.util.UUID; @@ -68,16 +67,19 @@ class AftermathCastFromGraveyard extends AsThoughEffectImpl { } @Override - public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) { - if (objectId.equals(source.getSourceId()) + public boolean applies(UUID objectId, Ability affectedAbility, Ability source, Game game, UUID affectedControllerId) { + if (affectedAbility != null && affectedAbility.getSourceId().equals(source.getSourceId()) && affectedControllerId.equals(source.getControllerId())) { - Card card = game.getCard(source.getSourceId()); - if (card != null && game.getState().getZone(source.getSourceId()) == Zone.GRAVEYARD) { - return true; - } + return game.getState().getZone(objectId).equals(Zone.GRAVEYARD); } return false; } + + @Override + public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) { + return false; + } + } class AftermathCantCastFromHand extends ContinuousRuleModifyingEffectImpl { @@ -168,17 +170,14 @@ class AftermathExileAsResolvesFromGraveyard extends ReplacementEffectImpl { @Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { - UUID sourceId = source.getSourceId(); Card sourceCard = game.getCard(source.getSourceId()); if (sourceCard instanceof SplitCardHalf) { sourceCard = ((SplitCardHalf) sourceCard).getParentCard(); - sourceId = sourceCard.getId(); } - if (sourceCard != null) { Player player = game.getPlayer(sourceCard.getOwnerId()); if (player != null) { - return player.moveCardToExileWithInfo(sourceCard, null, "", sourceId, game, ((ZoneChangeEvent) event).getFromZone(), true); + return player.moveCards(sourceCard, Zone.EXILED, source, game); } } return false; diff --git a/Mage/src/main/java/mage/abilities/keyword/AscendAbility.java b/Mage/src/main/java/mage/abilities/keyword/AscendAbility.java index 3a0334470f4..2292030e096 100644 --- a/Mage/src/main/java/mage/abilities/keyword/AscendAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/AscendAbility.java @@ -22,7 +22,7 @@ import mage.players.Player; */ public class AscendAbility extends SimpleStaticAbility { - public static String ASCEND_RULE = "Ascend (If you control ten or more permanents, you get the city's blessing for the rest of the game.)"; + public static final String ASCEND_RULE = "Ascend (If you control ten or more permanents, you get the city's blessing for the rest of the game.)"; public AscendAbility() { super(Zone.BATTLEFIELD, new AscendContinuousEffect()); diff --git a/Mage/src/main/java/mage/abilities/keyword/FlashbackAbility.java b/Mage/src/main/java/mage/abilities/keyword/FlashbackAbility.java index 3d48995f486..b07f6dbd32d 100644 --- a/Mage/src/main/java/mage/abilities/keyword/FlashbackAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/FlashbackAbility.java @@ -1,4 +1,3 @@ - package mage.abilities.keyword; import java.util.UUID; @@ -158,7 +157,7 @@ public class FlashbackAbility extends SpellAbility { } /** - * Used for split card sin PlayerImpl method: + * Used for split card in PlayerImpl method: * getOtherUseableActivatedAbilities * * @param abilityName diff --git a/Mage/src/main/java/mage/abilities/keyword/JumpStartAbility.java b/Mage/src/main/java/mage/abilities/keyword/JumpStartAbility.java index c7579727b3c..815f625c75d 100644 --- a/Mage/src/main/java/mage/abilities/keyword/JumpStartAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/JumpStartAbility.java @@ -4,6 +4,7 @@ import mage.abilities.Ability; import mage.abilities.SpellAbility; import mage.abilities.costs.Cost; import mage.abilities.costs.common.DiscardTargetCost; +import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.ReplacementEffectImpl; import mage.cards.Card; import mage.constants.Duration; @@ -18,11 +19,22 @@ import mage.target.common.TargetCardInHand; import mage.target.targetpointer.FixedTarget; /** + * Jump-start is found on instants and sorceries. You can cast a card with + * jump-start from your graveyard by paying all its regular costs and one + * additional cost: discarding a card from your hand. Casting a spell with + * jump-start follows all the normal timing rules, so sorceries with jump-start + * are still limited to your main phases. A spell with jump-start that was cast + * from your graveyard can still be countered, and if it has targets, it won't + * do anything if all its targets disappear or otherwise become illegal. After a + * spell with jump-start cast from your graveyard resolves, is countered, or + * leaves the stack in any way, it's exiled. * * @author TheElk801 */ public class JumpStartAbility extends SpellAbility { + private boolean replacementEffectAdded = false; + public JumpStartAbility(Card card) { super(card.getManaCost(), card.getName() + " with jump-start", Zone.GRAVEYARD, SpellAbilityType.BASE_ALTERNATE); this.getCosts().addAll(card.getSpellAbility().getCosts().copy()); @@ -30,7 +42,6 @@ public class JumpStartAbility extends SpellAbility { cost.setText(""); this.addCost(cost); this.getEffects().addAll(card.getSpellAbility().getEffects().copy()); - this.addEffect(new JumpStartReplacementEffect()); this.getTargets().addAll(card.getSpellAbility().getTargets().copy()); this.spellAbilityType = SpellAbilityType.BASE_ALTERNATE; this.timing = card.getSpellAbility().getTiming(); @@ -39,6 +50,21 @@ public class JumpStartAbility extends SpellAbility { public JumpStartAbility(final JumpStartAbility ability) { super(ability); + this.replacementEffectAdded = ability.replacementEffectAdded; + } + + @Override + public SpellAbility getSpellAbilityToResolve(Game game) { + Card card = game.getCard(getSourceId()); + if (card != null) { + if (!replacementEffectAdded) { + replacementEffectAdded = true; + ContinuousEffect effect = new JumpStartReplacementEffect(); + effect.setTargetPointer(new FixedTarget(getSourceId(), game.getState().getZoneChangeCounter(getSourceId()))); + game.addEffect(effect, this); + } + } + return this; } @Override @@ -106,9 +132,7 @@ class JumpStartReplacementEffect extends ReplacementEffectImpl { if (event.getTargetId().equals(source.getSourceId()) && ((ZoneChangeEvent) event).getFromZone() == Zone.STACK && ((ZoneChangeEvent) event).getToZone() != Zone.EXILED) { - - int zcc = game.getState().getZoneChangeCounter(source.getSourceId()); - if (((FixedTarget) getTargetPointer()).getZoneChangeCounter() + 1 == zcc) { + if (game.getState().getZoneChangeCounter(source.getSourceId()) == source.getSourceObjectZoneChangeCounter() + 1) { return true; } diff --git a/Mage/src/main/java/mage/abilities/keyword/MadnessAbility.java b/Mage/src/main/java/mage/abilities/keyword/MadnessAbility.java index b07de0e0b0e..9918789ed29 100644 --- a/Mage/src/main/java/mage/abilities/keyword/MadnessAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/MadnessAbility.java @@ -71,7 +71,7 @@ public class MadnessAbility extends StaticAbility { return new MadnessAbility(this); } - public static Condition GetCondition() { + public static Condition getCondition() { return MadnessCondition.instance; } diff --git a/Mage/src/main/java/mage/abilities/keyword/OfferingAbility.java b/Mage/src/main/java/mage/abilities/keyword/OfferingAbility.java index 9a1de9fd982..6ce501563f3 100644 --- a/Mage/src/main/java/mage/abilities/keyword/OfferingAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/OfferingAbility.java @@ -104,7 +104,7 @@ class OfferingAsThoughEffect extends AsThoughEffectImpl { } @Override - public boolean applies(UUID sourceId, Ability affectedAbility, Ability source, Game game) { + public boolean applies(UUID sourceId, Ability affectedAbility, Ability source, Game game, UUID playerId) { if (sourceId.equals(source.getSourceId())) { Card card = game.getCard(sourceId); if (!card.isOwnedBy(source.getControllerId())) { diff --git a/Mage/src/main/java/mage/abilities/mana/AnyColorManaAbility.java b/Mage/src/main/java/mage/abilities/mana/AnyColorManaAbility.java index 8e0720750a2..e22d6b79a4f 100644 --- a/Mage/src/main/java/mage/abilities/mana/AnyColorManaAbility.java +++ b/Mage/src/main/java/mage/abilities/mana/AnyColorManaAbility.java @@ -1,4 +1,3 @@ - package mage.abilities.mana; import mage.Mana; @@ -8,13 +7,18 @@ import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.constants.Zone; public class AnyColorManaAbility extends ActivatedManaAbilityImpl { + public AnyColorManaAbility() { this(new TapSourceCost()); } public AnyColorManaAbility(Cost cost) { - super(Zone.BATTLEFIELD, new AddManaOfAnyColorEffect(), cost); - this.netMana.add(new Mana(0,0,0,0,0,0,1, 0)); + this(cost, false); + } + + public AnyColorManaAbility(Cost cost, boolean setFlag) { + super(Zone.BATTLEFIELD, new AddManaOfAnyColorEffect(1, setFlag), cost); + this.netMana.add(new Mana(0, 0, 0, 0, 0, 0, 1, 0)); } public AnyColorManaAbility(final AnyColorManaAbility ability) { diff --git a/Mage/src/main/java/mage/cards/CardGraphicInfo.java b/Mage/src/main/java/mage/cards/CardGraphicInfo.java index 40d67a23c29..ae9aee3dbb9 100644 --- a/Mage/src/main/java/mage/cards/CardGraphicInfo.java +++ b/Mage/src/main/java/mage/cards/CardGraphicInfo.java @@ -6,7 +6,7 @@ public final class CardGraphicInfo { private final ObjectColor frameColor; private final FrameStyle frameStyle; - private final boolean useVariousArt; + private final boolean useVariousArt; // card in set have multiple images (use to store images files) public CardGraphicInfo(FrameStyle frameStyle, boolean useVariousArt) { this(null, frameStyle, useVariousArt); diff --git a/Mage/src/main/java/mage/cards/CardImpl.java b/Mage/src/main/java/mage/cards/CardImpl.java index 158a7dfa538..8b19cf5d3f8 100644 --- a/Mage/src/main/java/mage/cards/CardImpl.java +++ b/Mage/src/main/java/mage/cards/CardImpl.java @@ -5,27 +5,12 @@ import mage.MageObjectImpl; import mage.Mana; import mage.ObjectColor; import mage.abilities.*; -import mage.abilities.costs.Cost; -import mage.abilities.costs.VariableCost; -import mage.abilities.costs.common.RemoveVariableCountersTargetCost; -import mage.abilities.effects.common.ChooseACardNameEffect; import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.cards.repository.PluginClassloaderRegistery; import mage.constants.*; import mage.counters.Counter; -import mage.counters.CounterType; import mage.counters.Counters; -import mage.filter.FilterCard; import mage.filter.FilterMana; -import mage.filter.FilterPermanent; -import mage.filter.FilterSpell; -import mage.filter.common.FilterCreaturePermanent; -import mage.filter.common.FilterInstantOrSorcerySpell; -import mage.filter.predicate.permanent.ControllerPredicate; -import mage.filter.predicate.mageobject.ColorPredicate; -import mage.filter.predicate.mageobject.ConvertedManaCostPredicate; -import mage.filter.predicate.mageobject.NamePredicate; -import mage.filter.predicate.mageobject.PowerPredicate; import mage.game.*; import mage.game.command.CommandObject; import mage.game.events.GameEvent; @@ -33,10 +18,6 @@ import mage.game.events.ZoneChangeEvent; import mage.game.permanent.Permanent; import mage.game.stack.Spell; import mage.game.stack.StackObject; -import mage.target.TargetCard; -import mage.target.TargetPermanent; -import mage.target.TargetSpell; -import mage.target.common.TargetCreaturePermanent; import mage.util.GameLog; import mage.util.SubTypeList; import mage.watchers.Watcher; @@ -48,7 +29,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.UUID; -import mage.target.common.TargetCardInGraveyard; public abstract class CardImpl extends MageObjectImpl implements Card { @@ -352,118 +332,7 @@ public abstract class CardImpl extends MageObjectImpl implements Card { // } @Override public void adjustTargets(Ability ability, Game game) { - int xValue; - TargetPermanent oldTargetPermanent; - FilterPermanent permanentFilter; - int minTargets; - int maxTargets; - switch (ability.getTargetAdjustment()) { - case NONE: - break; - case X_CMC_EQUAL_PERM: - xValue = ability.getManaCostsToPay().getX(); - oldTargetPermanent = (TargetPermanent) ability.getTargets().get(0); - minTargets = oldTargetPermanent.getMinNumberOfTargets(); - maxTargets = oldTargetPermanent.getMaxNumberOfTargets(); - permanentFilter = oldTargetPermanent.getFilter().copy(); - permanentFilter.add(new ConvertedManaCostPredicate(ComparisonType.EQUAL_TO, xValue)); - ability.getTargets().clear(); - ability.getTargets().add(new TargetPermanent(minTargets, maxTargets, permanentFilter, false)); - break; - case X_TARGETS: - xValue = ability.getManaCostsToPay().getX(); - permanentFilter = ((TargetPermanent) ability.getTargets().get(0)).getFilter(); - ability.getTargets().clear(); - ability.addTarget(new TargetPermanent(xValue, permanentFilter)); - break; - case X_POWER_LEQ:// Minamo Sightbender only - xValue = ability.getManaCostsToPay().getX(); - oldTargetPermanent = (TargetPermanent) ability.getTargets().get(0); - minTargets = oldTargetPermanent.getMinNumberOfTargets(); - maxTargets = oldTargetPermanent.getMaxNumberOfTargets(); - permanentFilter = oldTargetPermanent.getFilter().copy(); - permanentFilter.add(new PowerPredicate(ComparisonType.FEWER_THAN, xValue + 1)); - ability.getTargets().clear(); - ability.getTargets().add(new TargetPermanent(minTargets, maxTargets, permanentFilter, false)); - break; - case VERSE_COUNTER_TARGETS: - Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(ability.getSourceId()); - if (sourcePermanent != null) { - xValue = sourcePermanent.getCounters(game).getCount(CounterType.VERSE); - permanentFilter = ((TargetPermanent) ability.getTargets().get(0)).getFilter(); - ability.getTargets().clear(); - ability.addTarget(new TargetPermanent(0, xValue, permanentFilter, false)); - } - break; - case X_CMC_EQUAL_GY_CARD: - xValue = ability.getManaCostsToPay().getX(); - FilterCard filterCard = ((TargetCard) ability.getTargets().get(0)).getFilter().copy(); - filterCard.add(new ConvertedManaCostPredicate(ComparisonType.EQUAL_TO, xValue)); - filterCard.setMessage(filterCard.getMessage().replace('X', (char) xValue)); - ability.getTargets().clear(); - ability.getTargets().add(new TargetCardInGraveyard(filterCard)); - break; - case CHOSEN_NAME: //Declaration of Naught only - ability.getTargets().clear(); - FilterSpell filterSpell = new FilterSpell("spell with the chosen name"); - filterSpell.add(new NamePredicate((String) game.getState().getValue(ability.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY))); - TargetSpell target = new TargetSpell(1, filterSpell); - ability.addTarget(target); - break; - case CHOSEN_COLOR: //Pentarch Paladin only - ObjectColor chosenColor = (ObjectColor) game.getState().getValue(ability.getSourceId() + "_color"); - ability.getTargets().clear(); - FilterPermanent filter = new FilterPermanent("permanent of the chosen color."); - if (chosenColor != null) { - filter.add(new ColorPredicate(chosenColor)); - } else { - filter.add(new ConvertedManaCostPredicate(ComparisonType.FEWER_THAN, -5));// Pretty sure this is always false - } - oldTargetPermanent = new TargetPermanent(filter); - ability.addTarget(oldTargetPermanent); - break; - case TREASURE_COUNTER_POWER: //Legacy's Allure only - sourcePermanent = game.getPermanentOrLKIBattlefield(ability.getSourceId()); - if (sourcePermanent != null) { - xValue = sourcePermanent.getCounters(game).getCount(CounterType.TREASURE); - FilterCreaturePermanent filter2 = new FilterCreaturePermanent("creature with power less than or equal to the number of treasure counters on {this}"); - filter2.add(new PowerPredicate(ComparisonType.FEWER_THAN, xValue + 1)); - ability.getTargets().clear(); - ability.getTargets().add(new TargetCreaturePermanent(filter2)); - } - break; - case SIMIC_MANIPULATOR: //Simic Manipulator only - xValue = 0; - for (Cost cost : ability.getCosts()) { - if (cost instanceof RemoveVariableCountersTargetCost) { - xValue = ((RemoveVariableCountersTargetCost) cost).getAmount(); - break; - } - } - ability.getTargets().clear(); - FilterCreaturePermanent newFilter = new FilterCreaturePermanent("creature with power less than or equal to " + xValue); - newFilter.add(new PowerPredicate(ComparisonType.FEWER_THAN, xValue + 1)); - ability.addTarget(new TargetCreaturePermanent(newFilter)); - break; - case CREATURE_POWER_X_OR_LESS: // Aryel, Knight of Windgrace - int value = 0; - for (VariableCost cost : ability.getCosts().getVariableCosts()) { - value = cost.getAmount(); - } - FilterCreaturePermanent filterCreaturePermanent = new FilterCreaturePermanent("creature with power " + value + " or less"); - filterCreaturePermanent.add(new PowerPredicate(ComparisonType.FEWER_THAN, value + 1)); - ability.getTargets().clear(); - ability.addTarget(new TargetCreaturePermanent(filterCreaturePermanent)); - break; - case X_CMC_EQUAL_SPELL_CONTROLLED: // League Guildmage - xValue = ability.getManaCostsToPay().getX(); - FilterSpell spellFilter = new FilterInstantOrSorcerySpell("instant or sorcery you control with converted mana cost " + xValue); - spellFilter.add(new ControllerPredicate(TargetController.YOU)); - spellFilter.add(new ConvertedManaCostPredicate(ComparisonType.EQUAL_TO, xValue)); - ability.getTargets().clear(); - ability.addTarget(new TargetSpell(spellFilter)); - break; - } + ability.adjustTargets(game); } @Override diff --git a/Mage/src/main/java/mage/cards/CardSetInfo.java b/Mage/src/main/java/mage/cards/CardSetInfo.java index 70cf685c051..c6a8ee07e41 100644 --- a/Mage/src/main/java/mage/cards/CardSetInfo.java +++ b/Mage/src/main/java/mage/cards/CardSetInfo.java @@ -21,12 +21,7 @@ public final class CardSetInfo implements Serializable { this.expansionSetCode = expansionSetCode; this.cardNumber = cardNumber; this.rarity = rarity; - if (graphicInfo == null && Rarity.LAND == rarity) { - // Workaround to get images of basic land permanents loaded - this.graphicInfo = ExpansionSet.NON_FULL_USE_VARIOUS; - } else { - this.graphicInfo = graphicInfo; - } + this.graphicInfo = graphicInfo; } public String getName() { diff --git a/Mage/src/main/java/mage/cards/ExpansionSet.java b/Mage/src/main/java/mage/cards/ExpansionSet.java index 15e4b052d3b..488b32b0441 100644 --- a/Mage/src/main/java/mage/cards/ExpansionSet.java +++ b/Mage/src/main/java/mage/cards/ExpansionSet.java @@ -88,6 +88,8 @@ public abstract class ExpansionSet implements Serializable { protected Date releaseDate; protected ExpansionSet parentSet; protected SetType setType; + + // TODO: 03.10.2018, hasBasicLands can be removed someday -- it's uses to optimize lands search in deck generation and lands adding (search all available lands from sets) protected boolean hasBasicLands = true; protected String blockName; @@ -185,7 +187,7 @@ public abstract class ExpansionSet implements Serializable { return theBooster; } - protected int AddMissingPartner(List booster, boolean partnerAllowed, int max, int i) { + protected int addMissingPartner(List booster, boolean partnerAllowed, int max, int i) { for (Ability ability : booster.get(booster.size() - 1).getAbilities()) { //Check if fetched card has the PartnerWithAbility @@ -328,7 +330,7 @@ public abstract class ExpansionSet implements Serializable { for (int i = 0; i < numBoosterUncommon; i++) { while (true) { addToBooster(booster, uncommons); - int check = AddMissingPartner(booster, partnerAllowed, numBoosterUncommon - 1, i); + int check = addMissingPartner(booster, partnerAllowed, numBoosterUncommon - 1, i); if (check == 1) { break; } @@ -358,7 +360,7 @@ public abstract class ExpansionSet implements Serializable { if (ratioBoosterMythic > 0 && RandomUtil.nextInt(ratioBoosterMythic) == 0) { while (true) { addToBooster(booster, mythics); - int check = AddMissingPartner(booster, partnerAllowed, -1, 1); + int check = addMissingPartner(booster, partnerAllowed, -1, 1); if (check == 1) { break; } @@ -370,7 +372,7 @@ public abstract class ExpansionSet implements Serializable { } else { while (true) { addToBooster(booster, rares); - int check = AddMissingPartner(booster, partnerAllowed, -1, 1); + int check = addMissingPartner(booster, partnerAllowed, -1, 1); if (check == 1) { break; } @@ -559,6 +561,7 @@ public abstract class ExpansionSet implements Serializable { if (savedCardsInfos == null) { CardCriteria criteria = new CardCriteria(); if (rarity == Rarity.LAND) { + // get basic lands from parent set if current haven't it criteria.setCodes(!hasBasicLands && parentSet != null ? parentSet.code : this.code); } else { criteria.setCodes(this.code); diff --git a/Mage/src/main/java/mage/cards/Sets.java b/Mage/src/main/java/mage/cards/Sets.java index 3f11abff3b8..f68db60abe7 100644 --- a/Mage/src/main/java/mage/cards/Sets.java +++ b/Mage/src/main/java/mage/cards/Sets.java @@ -135,7 +135,7 @@ public class Sets extends HashMap { if (onlyBasicLands) { // lands is colorless // discard not needed color by mana produce - Assert.assertEquals("only basic lands allow", 1, card.getMana().size()); + Assert.assertEquals("only basic lands allow, but found " + card.getName(), 1, card.getMana().size()); for (Mana manaLand : card.getMana()) { if (manaLand.getWhite() > 0 && !manaNeed.isWhite()) { cardManaOK = false; } if (manaLand.getBlue() > 0 && !manaNeed.isBlue()) { cardManaOK = false; } diff --git a/Mage/src/main/java/mage/cards/decks/Constructed.java b/Mage/src/main/java/mage/cards/decks/Constructed.java index ba744471853..23410c32b5d 100644 --- a/Mage/src/main/java/mage/cards/decks/Constructed.java +++ b/Mage/src/main/java/mage/cards/decks/Constructed.java @@ -17,8 +17,8 @@ public class Constructed extends DeckValidator { private static final Logger logger = Logger.getLogger(DeckValidator.class); - protected static List anyNumberCardsAllowed = new ArrayList<>(Arrays.asList("Relentless Rats", "Shadowborn Apostle", "Rat Colony")); - protected static List basicLandNames = new ArrayList<>( + protected static final List anyNumberCardsAllowed = new ArrayList<>(Arrays.asList("Relentless Rats", "Shadowborn Apostle", "Rat Colony")); + protected static final List basicLandNames = new ArrayList<>( Arrays.asList("Forest", "Island", "Mountain", "Swamp", "Plains", "Wastes", "Snow-Covered Forest", "Snow-Covered Island", "Snow-Covered Mountain", "Snow-Covered Swamp", "Snow-Covered Plains")); protected List banned = new ArrayList<>(); diff --git a/Mage/src/main/java/mage/cards/decks/importer/DeckImporterUtil.java b/Mage/src/main/java/mage/cards/decks/importer/DeckImporterUtil.java index 2912dafd7e7..a0e90dc5261 100644 --- a/Mage/src/main/java/mage/cards/decks/importer/DeckImporterUtil.java +++ b/Mage/src/main/java/mage/cards/decks/importer/DeckImporterUtil.java @@ -12,7 +12,7 @@ import mage.cards.decks.DeckCardLists; */ public final class DeckImporterUtil { - public static final String[] SIDEBOARD_MARKS = new String[]{"//sideboard", "sb: "}; + private static final String[] SIDEBOARD_MARKS = new String[]{"//sideboard", "sb: "}; public static boolean haveSideboardSection(String file) { // search for sideboard section: diff --git a/Mage/src/main/java/mage/cards/decks/importer/TxtDeckImporter.java b/Mage/src/main/java/mage/cards/decks/importer/TxtDeckImporter.java index 14d2b31f570..4d593610ff5 100644 --- a/Mage/src/main/java/mage/cards/decks/importer/TxtDeckImporter.java +++ b/Mage/src/main/java/mage/cards/decks/importer/TxtDeckImporter.java @@ -16,9 +16,9 @@ import mage.cards.repository.CardRepository; */ public class TxtDeckImporter extends DeckImporter { - public static final String[] SET_VALUES = new String[]{"lands", "creatures", "planeswalkers", "other spells", "sideboard cards", + private 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 static final Set IGNORE_NAMES = new HashSet<>(Arrays.asList(SET_VALUES)); private boolean sideboard = false; private boolean switchSideboardByEmptyLine = true; // all cards after first empty line will be sideboard (like mtgo format) diff --git a/Mage/src/main/java/mage/cards/repository/CardInfo.java b/Mage/src/main/java/mage/cards/repository/CardInfo.java index cc5caa7c981..2563d4e3077 100644 --- a/Mage/src/main/java/mage/cards/repository/CardInfo.java +++ b/Mage/src/main/java/mage/cards/repository/CardInfo.java @@ -9,7 +9,7 @@ import java.util.stream.Collectors; import mage.ObjectColor; import mage.abilities.Ability; import mage.abilities.SpellAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.cards.*; import mage.cards.mock.MockCard; import mage.cards.mock.MockSplitCard; @@ -181,8 +181,8 @@ public class CardInfo { // Starting loyalty if (card.isPlaneswalker()) { for (Ability ab : card.getAbilities()) { - if (ab instanceof PlanswalkerEntersWithLoyalityCountersAbility) { - this.startingLoyalty = "" + ((PlanswalkerEntersWithLoyalityCountersAbility) ab).getStartingLoyalty(); + if (ab instanceof PlaneswalkerEntersWithLoyaltyCountersAbility) { + this.startingLoyalty = "" + ((PlaneswalkerEntersWithLoyaltyCountersAbility) ab).getStartingLoyalty(); } } if (this.startingLoyalty == null) { diff --git a/Mage/src/main/java/mage/cards/repository/CardRepository.java b/Mage/src/main/java/mage/cards/repository/CardRepository.java index adbd4d05c5b..229b6351a23 100644 --- a/Mage/src/main/java/mage/cards/repository/CardRepository.java +++ b/Mage/src/main/java/mage/cards/repository/CardRepository.java @@ -32,7 +32,7 @@ public enum CardRepository { // raise this if db structure was changed private static final long CARD_DB_VERSION = 51; // raise this if new cards were added to the server - private static final long CARD_CONTENT_VERSION = 118; + private static final long CARD_CONTENT_VERSION = 122; private Dao cardDao; private Set classNames; diff --git a/Mage/src/main/java/mage/cards/repository/ExpansionRepository.java b/Mage/src/main/java/mage/cards/repository/ExpansionRepository.java index 7bdb97e5ce4..4ed44d2966a 100644 --- a/Mage/src/main/java/mage/cards/repository/ExpansionRepository.java +++ b/Mage/src/main/java/mage/cards/repository/ExpansionRepository.java @@ -29,7 +29,7 @@ public enum ExpansionRepository { private static final String JDBC_URL = "jdbc:h2:file:./db/cards.h2;AUTO_SERVER=TRUE"; private static final String VERSION_ENTITY_NAME = "expansion"; private static final long EXPANSION_DB_VERSION = 5; - private static final long EXPANSION_CONTENT_VERSION = 16; + private static final long EXPANSION_CONTENT_VERSION = 17; private Dao expansionDao; diff --git a/Mage/src/main/java/mage/constants/Rarity.java b/Mage/src/main/java/mage/constants/Rarity.java index b8fbf3259e2..2a79d5f3689 100644 --- a/Mage/src/main/java/mage/constants/Rarity.java +++ b/Mage/src/main/java/mage/constants/Rarity.java @@ -1,29 +1,30 @@ package mage.constants; /** - * * @author North */ public enum Rarity { - LAND ("Land", "common", "C", 1), - COMMON ("Common", "common", "C", 1), - UNCOMMON ("Uncommon", "uncommon", "U", 2), - RARE ("Rare", "rare", "R", 3), - MYTHIC ("Mythic", "mythic", "M", 3), - SPECIAL ("Special", "special", "Special", 3), - BONUS ("Bonus", "bonus", "Bonus", 3); + LAND("Land", "common", "C", 1, 1), + COMMON("Common", "common", "C", 1, 2), + UNCOMMON("Uncommon", "uncommon", "U", 2, 3), + RARE("Rare", "rare", "R", 3, 4), + MYTHIC("Mythic", "mythic", "M", 3, 5), + SPECIAL("Special", "special", "Special", 3, 6), + BONUS("Bonus", "bonus", "Bonus", 3, 7); private final String text; private final String symbolCode; private final String code; private final int rating; + private final int sorting; - Rarity(String text, String symbolCode, String code, int rating) { + Rarity(String text, String symbolCode, String code, int rating, int sorting) { this.text = text; this.symbolCode = symbolCode; this.code = code; this.rating = rating; + this.sorting = sorting; } @Override @@ -42,4 +43,8 @@ public enum Rarity { public int getRating() { return rating; } + + public int getSorting() { + return sorting; + } } diff --git a/Mage/src/main/java/mage/constants/SubType.java b/Mage/src/main/java/mage/constants/SubType.java index fef2c75e130..5f61eef8ec2 100644 --- a/Mage/src/main/java/mage/constants/SubType.java +++ b/Mage/src/main/java/mage/constants/SubType.java @@ -93,6 +93,7 @@ public enum SubType { CHIMERA("Chimera", SubTypeSet.CreatureType), CHISS("Chiss", SubTypeSet.CreatureType, true), CITIZEN("Citizen", SubTypeSet.CreatureType), + CLAMFOLK("Clamfolk", SubTypeSet.CreatureType, true), // Unglued CLERIC("Cleric", SubTypeSet.CreatureType), COCKATRICE("Cockatrice", SubTypeSet.CreatureType), CONSTRUCT("Construct", SubTypeSet.CreatureType), @@ -131,6 +132,7 @@ public enum SubType { ELK("Elk", SubTypeSet.CreatureType), EYE("Eye", SubTypeSet.CreatureType), EWOK("Ewok", SubTypeSet.CreatureType, true), // Star Wars + EXPANSION_SYMBOL("Expansion-Symbol", SubTypeSet.CreatureType, true), // Unhinged // F FAERIE("Faerie", SubTypeSet.CreatureType), FERRET("Ferret", SubTypeSet.CreatureType), diff --git a/Mage/src/main/java/mage/constants/TargetAdjustment.java b/Mage/src/main/java/mage/constants/TargetAdjustment.java deleted file mode 100644 index 675b2fed05e..00000000000 --- a/Mage/src/main/java/mage/constants/TargetAdjustment.java +++ /dev/null @@ -1,20 +0,0 @@ -package mage.constants; - -/** - * - * @author TheElk801 - */ -public enum TargetAdjustment { - NONE, - X_TARGETS, - X_CMC_EQUAL_PERM, - X_CMC_EQUAL_GY_CARD, - X_POWER_LEQ, - CHOSEN_NAME, - CHOSEN_COLOR, - VERSE_COUNTER_TARGETS, - TREASURE_COUNTER_POWER, - SIMIC_MANIPULATOR, - CREATURE_POWER_X_OR_LESS, - X_CMC_EQUAL_SPELL_CONTROLLED -} diff --git a/Mage/src/main/java/mage/constants/TargetController.java b/Mage/src/main/java/mage/constants/TargetController.java index 2236ebe4649..f1dd2e1b607 100644 --- a/Mage/src/main/java/mage/constants/TargetController.java +++ b/Mage/src/main/java/mage/constants/TargetController.java @@ -6,5 +6,5 @@ package mage.constants; */ public enum TargetController { - ACTIVE, ANY, YOU, NOT_YOU, OPPONENT, TEAM, OWNER, CONTROLLER_ATTACHED_TO, NEXT + ACTIVE, ANY, YOU, NOT_YOU, OPPONENT, TEAM, OWNER, CONTROLLER_ATTACHED_TO, NEXT, EACH_PLAYER } diff --git a/Mage/src/main/java/mage/counters/CounterType.java b/Mage/src/main/java/mage/counters/CounterType.java index 865cab23a53..fd2eb779126 100644 --- a/Mage/src/main/java/mage/counters/CounterType.java +++ b/Mage/src/main/java/mage/counters/CounterType.java @@ -19,6 +19,7 @@ public enum CounterType { CAGE("cage"), CARRION("carrion"), CHARGE("charge"), + CHIP("chip"), CORPSE("corpse"), CREDIT("credit"), CRYSTAL("crystal"), @@ -44,6 +45,7 @@ public enum CounterType { FEATHER("feather"), FILIBUSTER("filibuster"), FLOOD("flood"), + FUNK("funk"), FURY("fury"), FUNGUS("fungus"), FUSE("fuse"), diff --git a/Mage/src/main/java/mage/filter/StaticFilters.java b/Mage/src/main/java/mage/filter/StaticFilters.java index 0fcf903c4c3..4226afe8767 100644 --- a/Mage/src/main/java/mage/filter/StaticFilters.java +++ b/Mage/src/main/java/mage/filter/StaticFilters.java @@ -23,7 +23,7 @@ import mage.filter.predicate.permanent.TokenPredicate; /** * A class that holds Filter objects that may not be modified without copying * before. This prevents the creation of thousands of filter objects. - * + *

* Because the filters are used application wide they may not be modified. * NEVER!!!!! But it's possible, so be careful! * @@ -42,6 +42,7 @@ public final class StaticFilters { static { FILTER_ENCHANTMENT_PERMANENT.setLockedFilter(true); } + public static final FilterCard FILTER_CARD = new FilterCard("card"); static { @@ -119,6 +120,7 @@ public final class StaticFilters { static { FILTER_CARD_NON_LAND.setLockedFilter(true); } + public static final FilterNonlandCard FILTER_CARD_A_NON_LAND = new FilterNonlandCard("a nonland card"); static { @@ -154,11 +156,13 @@ public final class StaticFilters { static { FILTER_PERMANENT_ARTIFACT_OR_ENCHANTMENT.setLockedFilter(true); } + public static final FilterCreaturePermanent FILTER_ARTIFACT_CREATURE_PERMANENT = new FilterArtifactCreaturePermanent(); static { FILTER_ARTIFACT_CREATURE_PERMANENT.setLockedFilter(true); } + public static final FilterPermanent FILTER_PERMANENT_ARTIFACT_OR_CREATURE = new FilterPermanent("artifact or creature"); static { @@ -168,6 +172,7 @@ public final class StaticFilters { )); FILTER_PERMANENT_ARTIFACT_OR_CREATURE.setLockedFilter(true); } + public static final FilterPermanent FILTER_PERMANENT_ARTIFACT_CREATURE_OR_ENCHANTMENT = new FilterPermanent("artifact, creature, or enchantment"); static { @@ -178,6 +183,7 @@ public final class StaticFilters { )); FILTER_PERMANENT_ARTIFACT_CREATURE_OR_ENCHANTMENT.setLockedFilter(true); } + public static final FilterPermanent FILTER_PERMANENT_ARTIFACT_CREATURE_ENCHANTMENT_OR_LAND = new FilterPermanent("artifact, creature, enchantment, or land"); static { @@ -195,16 +201,19 @@ public final class StaticFilters { static { FILTER_CONTROLLED_PERMANENT.setLockedFilter(true); } + public static final FilterControlledPermanent FILTER_CONTROLLED_PERMANENT_ARTIFACT = new FilterControlledArtifactPermanent(); static { FILTER_CONTROLLED_PERMANENT_ARTIFACT.setLockedFilter(true); } + public static final FilterControlledPermanent FILTER_CONTROLLED_PERMANENT_ARTIFACT_AN = new FilterControlledArtifactPermanent("an artifact"); static { FILTER_CONTROLLED_PERMANENT_ARTIFACT_AN.setLockedFilter(true); } + public static final FilterControlledPermanent FILTER_CONTROLLED_PERMANENT_ARTIFACT_OR_CREATURE = new FilterControlledPermanent("artifact or creature you control"); static { @@ -214,6 +223,7 @@ public final class StaticFilters { )); FILTER_CONTROLLED_PERMANENT_ARTIFACT_OR_CREATURE.setLockedFilter(true); } + public static final FilterControlledPermanent FILTER_CONTROLLED_PERMANENT_LAND = new FilterControlledLandPermanent(); static { @@ -232,12 +242,14 @@ public final class StaticFilters { FILTER_OPPONENTS_PERMANENT.add(new ControllerPredicate(TargetController.OPPONENT)); FILTER_OPPONENTS_PERMANENT.setLockedFilter(true); } + public static final FilterCreaturePermanent FILTER_OPPONENTS_PERMANENT_CREATURE = new FilterCreaturePermanent("creature an opponent controls"); static { FILTER_OPPONENTS_PERMANENT_CREATURE.add(new ControllerPredicate(TargetController.OPPONENT)); FILTER_OPPONENTS_PERMANENT_CREATURE.setLockedFilter(true); } + public static final FilterPermanent FILTER_OPPONENTS_PERMANENT_ARTIFACT = new FilterPermanent("artifact an opponent controls"); static { @@ -245,6 +257,7 @@ public final class StaticFilters { FILTER_OPPONENTS_PERMANENT_ARTIFACT.add(new CardTypePredicate(CardType.ARTIFACT)); FILTER_OPPONENTS_PERMANENT_ARTIFACT.setLockedFilter(true); } + public static final FilterPermanent FILTER_OPPONENTS_PERMANENT_ARTIFACT_OR_CREATURE = new FilterPermanent("artifact or creature an opponent controls"); static { @@ -280,12 +293,14 @@ public final class StaticFilters { static { FILTER_CONTROLLED_A_CREATURE.setLockedFilter(true); } + public static final FilterControlledCreaturePermanent FILTER_CONTROLLED_ANOTHER_CREATURE = new FilterControlledCreaturePermanent("another creature"); static { FILTER_CONTROLLED_ANOTHER_CREATURE.add(new AnotherPredicate()); FILTER_CONTROLLED_ANOTHER_CREATURE.setLockedFilter(true); } + public static final FilterControlledPermanent FILTER_CONTROLLED_PERMANENT_NON_LAND = new FilterControlledPermanent("nonland permanent"); static { @@ -294,6 +309,7 @@ public final class StaticFilters { ); FILTER_CONTROLLED_PERMANENT_NON_LAND.setLockedFilter(true); } + public static final FilterLandPermanent FILTER_LAND = new FilterLandPermanent(); static { @@ -331,6 +347,12 @@ public final class StaticFilters { FILTER_PERMANENT_CREATURE.setLockedFilter(true); } + public static final FilterCreaturePermanent FILTER_PERMANENT_CREATURE_A = new FilterCreaturePermanent("a creature"); + + static { + FILTER_PERMANENT_CREATURE_A.setLockedFilter(true); + } + public static final FilterPermanent FILTER_PERMANENT_CREATURE_OR_PLANESWALKER_A = new FilterPermanent("a creature or planeswalker"); static { @@ -344,33 +366,39 @@ public final class StaticFilters { static { FILTER_PERMANENT_A_CREATURE.setLockedFilter(true); } + public static final FilterCreaturePermanent FILTER_PERMANENT_CREATURE_CONTROLLED = new FilterCreaturePermanent("creature you control"); static { FILTER_PERMANENT_CREATURE_CONTROLLED.add(new ControllerPredicate(TargetController.YOU)); FILTER_PERMANENT_CREATURE_CONTROLLED.setLockedFilter(true); } + public static final FilterCreaturePermanent FILTER_PERMANENT_CREATURES = new FilterCreaturePermanent("creatures"); static { FILTER_PERMANENT_CREATURES.setLockedFilter(true); } + public static final FilterCreaturePermanent FILTER_PERMANENT_CREATURES_CONTROLLED = new FilterCreaturePermanent("creatures you control"); static { FILTER_PERMANENT_CREATURES_CONTROLLED.add(new ControllerPredicate(TargetController.YOU)); FILTER_PERMANENT_CREATURES_CONTROLLED.setLockedFilter(true); } + public static final FilterCreaturePermanent FILTER_PERMANENT_CREATURE_GOBLINS = new FilterCreaturePermanent(SubType.GOBLIN, "Goblin creatures"); static { FILTER_PERMANENT_CREATURE_GOBLINS.setLockedFilter(true); } + public static final FilterCreaturePermanent FILTER_PERMANENT_CREATURE_SLIVERS = new FilterCreaturePermanent(SubType.SLIVER, "all Sliver creatures"); static { FILTER_PERMANENT_CREATURE_SLIVERS.setLockedFilter(true); } + public static final FilterPlaneswalkerPermanent FILTER_PERMANENT_PLANESWALKER = new FilterPlaneswalkerPermanent(); static { @@ -388,12 +416,14 @@ public final class StaticFilters { static { FILTER_PERMANENTS_NON_LAND.setLockedFilter(true); } + public static final FilterStackObject FILTER_SPELL_OR_ABILITY_OPPONENTS = new FilterStackObject("spell or ability and opponent controls"); static { FILTER_SPELL_OR_ABILITY_OPPONENTS.add(new ControllerPredicate(TargetController.OPPONENT)); FILTER_SPELL_OR_ABILITY_OPPONENTS.setLockedFilter(true); } + public static final FilterStackObject FILTER_SPELL_OR_ABILITY = new FilterStackObject(); static { @@ -405,11 +435,13 @@ public final class StaticFilters { static { FILTER_SPELL_A_CREATURE.setLockedFilter(true); } + public static final FilterCreatureSpell FILTER_SPELL_CREATURE = new FilterCreatureSpell("creature spell"); static { FILTER_SPELL_CREATURE.setLockedFilter(true); } + public static final FilterSpell FILTER_SPELL_NON_CREATURE = (FilterSpell) new FilterSpell("noncreature spell").add(Predicates.not(new CardTypePredicate(CardType.CREATURE))); static { @@ -444,6 +476,7 @@ public final class StaticFilters { )); FILTER_SPELL_AN_INSTANT_OR_SORCERY.setLockedFilter(true); } + public static final FilterSpell FILTER_SPELL_INSTANT_OR_SORCERY = new FilterSpell("instant or sorcery spell"); static { @@ -463,6 +496,7 @@ public final class StaticFilters { )); FILTER_SPELLS_INSTANT_OR_SORCERY.setLockedFilter(true); } + public static final FilterCreaturePermanent FILTER_CREATURE_TOKENS = new FilterCreaturePermanent("creature tokens"); static { @@ -484,6 +518,7 @@ public final class StaticFilters { FILTER_PERMANENT_AURA.add(new SubtypePredicate(SubType.AURA)); FILTER_PERMANENT_AURA.setLockedFilter(true); } + public static final FilterPermanent FILTER_PERMANENT_EQUIPMENT = new FilterPermanent(); static { @@ -491,6 +526,7 @@ public final class StaticFilters { FILTER_PERMANENT_EQUIPMENT.add(new SubtypePredicate(SubType.EQUIPMENT)); FILTER_PERMANENT_EQUIPMENT.setLockedFilter(true); } + public static final FilterPermanent FILTER_PERMANENT_FORTIFICATION = new FilterPermanent(); static { @@ -498,6 +534,7 @@ public final class StaticFilters { FILTER_PERMANENT_FORTIFICATION.add(new SubtypePredicate(SubType.FORTIFICATION)); FILTER_PERMANENT_FORTIFICATION.setLockedFilter(true); } + public static final FilterPermanent FILTER_PERMANENT_LEGENDARY = new FilterPermanent(); static { diff --git a/Mage/src/main/java/mage/filter/predicate/mageobject/ChosenSubtypePredicate.java b/Mage/src/main/java/mage/filter/predicate/mageobject/ChosenSubtypePredicate.java index 21a8c11bf8b..576783bdc7a 100644 --- a/Mage/src/main/java/mage/filter/predicate/mageobject/ChosenSubtypePredicate.java +++ b/Mage/src/main/java/mage/filter/predicate/mageobject/ChosenSubtypePredicate.java @@ -19,7 +19,7 @@ public class ChosenSubtypePredicate implements ObjectPlayerPredicate input, Game game) { - SubType subType = ChooseCreatureTypeEffect.getChoosenCreatureType(input.getSourceId(), game); + SubType subType = ChooseCreatureTypeEffect.getChosenCreatureType(input.getSourceId(), game); return input.getObject().hasSubtype(subType, game); } diff --git a/Mage/src/main/java/mage/game/GameImpl.java b/Mage/src/main/java/mage/game/GameImpl.java index 1d73eb4ca42..e745c75e129 100644 --- a/Mage/src/main/java/mage/game/GameImpl.java +++ b/Mage/src/main/java/mage/game/GameImpl.java @@ -1191,7 +1191,7 @@ public abstract class GameImpl implements Game, Serializable { player.shuffleLibrary(null, this); int deduction = 1; if (freeMulligans > 0) { - if (usedFreeMulligans != null && usedFreeMulligans.containsKey(player.getId())) { + if (usedFreeMulligans.containsKey(player.getId())) { int used = usedFreeMulligans.get(player.getId()); if (used < freeMulligans) { deduction = 0; @@ -1424,7 +1424,7 @@ public abstract class GameImpl implements Game, Serializable { } else { spellControllerId = spell.getControllerId(); // i.e. resolved spell is the target opponent's spell } - if (commandedBy != null && spellControllerId != null) { + if (spellControllerId != null) { Player turnController = getPlayer(commandedBy); if (turnController != null) { Player targetPlayer = getPlayer(spellControllerId); diff --git a/Mage/src/main/java/mage/game/ZonesHandler.java b/Mage/src/main/java/mage/game/ZonesHandler.java index c14b2da8842..c6eeff31423 100644 --- a/Mage/src/main/java/mage/game/ZonesHandler.java +++ b/Mage/src/main/java/mage/game/ZonesHandler.java @@ -10,6 +10,7 @@ import mage.constants.Zone; import mage.filter.FilterCard; import mage.game.command.Commander; import mage.game.events.ZoneChangeEvent; +import mage.game.events.ZoneChangeGroupEvent; import mage.game.permanent.Permanent; import mage.game.permanent.PermanentCard; import mage.game.permanent.PermanentMeld; @@ -25,6 +26,12 @@ public final class ZonesHandler { public static boolean cast(ZoneChangeInfo info, Game game) { if (maybeRemoveFromSourceZone(info, game)) { placeInDestinationZone(info, game); + // create a group zone change event if a card is moved to stack for casting (it's always only one card, but some effects check for group events (one or more xxx)) + Set cards = new HashSet<>(); + Card targetCard = getTargetCard(game, info.event.getTargetId()); + cards.add(targetCard); + game.fireEvent(new ZoneChangeGroupEvent(cards, info.event.getSourceId(), info.event.getPlayerId(), info.event.getFromZone(), info.event.getToZone())); + // normal movement game.fireEvent(info.event); return true; } diff --git a/Mage/src/main/java/mage/game/command/emblems/AjaniAdversaryOfTyrantsEmblem.java b/Mage/src/main/java/mage/game/command/emblems/AjaniAdversaryOfTyrantsEmblem.java index 3a74eac9dd7..cdb80518c7c 100644 --- a/Mage/src/main/java/mage/game/command/emblems/AjaniAdversaryOfTyrantsEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/AjaniAdversaryOfTyrantsEmblem.java @@ -11,7 +11,7 @@ import mage.game.permanent.token.CatToken2; * * @author TheElk801 */ -public class AjaniAdversaryOfTyrantsEmblem extends Emblem { +public final class AjaniAdversaryOfTyrantsEmblem extends Emblem { // −7: You get an emblem with "At the beginning of your end step, create three 1/1 white Cat creature tokens with lifelink." public AjaniAdversaryOfTyrantsEmblem() { diff --git a/Mage/src/main/java/mage/game/command/emblems/AjaniSteadfastEmblem.java b/Mage/src/main/java/mage/game/command/emblems/AjaniSteadfastEmblem.java index 755291e0392..ce2123de098 100644 --- a/Mage/src/main/java/mage/game/command/emblems/AjaniSteadfastEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/AjaniSteadfastEmblem.java @@ -15,7 +15,7 @@ import mage.game.permanent.Permanent; * * @author spjspj */ -public class AjaniSteadfastEmblem extends Emblem { +public final class AjaniSteadfastEmblem extends Emblem { public AjaniSteadfastEmblem() { setName("Emblem Ajani"); diff --git a/Mage/src/main/java/mage/game/command/emblems/ArlinnEmbracedByTheMoonEmblem.java b/Mage/src/main/java/mage/game/command/emblems/ArlinnEmbracedByTheMoonEmblem.java index fb9926cc7bf..008e205f36d 100644 --- a/Mage/src/main/java/mage/game/command/emblems/ArlinnEmbracedByTheMoonEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/ArlinnEmbracedByTheMoonEmblem.java @@ -21,7 +21,7 @@ import mage.target.common.TargetAnyTarget; * * @author spjspj */ -public class ArlinnEmbracedByTheMoonEmblem extends Emblem { +public final class ArlinnEmbracedByTheMoonEmblem extends Emblem { // "Creatures you control have haste and '{T}: This creature deals damage equal to its power to any target.'" public ArlinnEmbracedByTheMoonEmblem() { diff --git a/Mage/src/main/java/mage/game/command/emblems/AurraSingBaneOfJediEmblem.java b/Mage/src/main/java/mage/game/command/emblems/AurraSingBaneOfJediEmblem.java index f227d4429df..8917e9a01f0 100644 --- a/Mage/src/main/java/mage/game/command/emblems/AurraSingBaneOfJediEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/AurraSingBaneOfJediEmblem.java @@ -13,7 +13,7 @@ import mage.game.command.Emblem; * * @author spjspj */ -public class AurraSingBaneOfJediEmblem extends Emblem { +public final class AurraSingBaneOfJediEmblem extends Emblem { private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("a nontoken creature you control"); diff --git a/Mage/src/main/java/mage/game/command/emblems/ChandraRoaringFlameEmblem.java b/Mage/src/main/java/mage/game/command/emblems/ChandraRoaringFlameEmblem.java index 463695800e2..3d263f9fbcb 100644 --- a/Mage/src/main/java/mage/game/command/emblems/ChandraRoaringFlameEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/ChandraRoaringFlameEmblem.java @@ -12,7 +12,7 @@ import mage.game.command.Emblem; * * @author spjspj */ -public class ChandraRoaringFlameEmblem extends Emblem { +public final class ChandraRoaringFlameEmblem extends Emblem { /** * Emblem with "At the beginning of your upkeep, this emblem deals 3 damage diff --git a/Mage/src/main/java/mage/game/command/emblems/ChandraTorchOfDefianceEmblem.java b/Mage/src/main/java/mage/game/command/emblems/ChandraTorchOfDefianceEmblem.java index a47118ccd69..33a9673b992 100644 --- a/Mage/src/main/java/mage/game/command/emblems/ChandraTorchOfDefianceEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/ChandraTorchOfDefianceEmblem.java @@ -14,7 +14,7 @@ import mage.target.common.TargetAnyTarget; * * @author spjspj */ -public class ChandraTorchOfDefianceEmblem extends Emblem { +public final class ChandraTorchOfDefianceEmblem extends Emblem { // You get an emblem with "Whenever you cast a spell, this emblem deals 5 damage to any target." public ChandraTorchOfDefianceEmblem() { diff --git a/Mage/src/main/java/mage/game/command/emblems/DackFaydenEmblem.java b/Mage/src/main/java/mage/game/command/emblems/DackFaydenEmblem.java index 9771492ba2d..25f7674a4e6 100644 --- a/Mage/src/main/java/mage/game/command/emblems/DackFaydenEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/DackFaydenEmblem.java @@ -29,7 +29,7 @@ import mage.target.targetpointer.FixedTargets; * * @author spjspj */ -public class DackFaydenEmblem extends Emblem { +public final class DackFaydenEmblem extends Emblem { public DackFaydenEmblem() { this.setName("Emblem Dack"); diff --git a/Mage/src/main/java/mage/game/command/emblems/DarettiScrapSavantEmblem.java b/Mage/src/main/java/mage/game/command/emblems/DarettiScrapSavantEmblem.java index 246f783855c..85a51c0e9af 100644 --- a/Mage/src/main/java/mage/game/command/emblems/DarettiScrapSavantEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/DarettiScrapSavantEmblem.java @@ -22,7 +22,7 @@ import mage.target.targetpointer.FixedTarget; * * @author spjspj */ -public class DarettiScrapSavantEmblem extends Emblem { +public final 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() { diff --git a/Mage/src/main/java/mage/game/command/emblems/DomriRadeEmblem.java b/Mage/src/main/java/mage/game/command/emblems/DomriRadeEmblem.java index 11231f2d23e..d71bb577c14 100644 --- a/Mage/src/main/java/mage/game/command/emblems/DomriRadeEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/DomriRadeEmblem.java @@ -18,7 +18,7 @@ import mage.game.command.Emblem; * * @author spjspj */ -public class DomriRadeEmblem extends Emblem { +public final class DomriRadeEmblem extends Emblem { // "Creatures you control have double strike, trample, hexproof and haste." public DomriRadeEmblem() { diff --git a/Mage/src/main/java/mage/game/command/emblems/DovinBaanEmblem.java b/Mage/src/main/java/mage/game/command/emblems/DovinBaanEmblem.java index 4deb79b50b9..3935f32b8d3 100644 --- a/Mage/src/main/java/mage/game/command/emblems/DovinBaanEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/DovinBaanEmblem.java @@ -15,7 +15,7 @@ import mage.players.Player; * * @author spjspj */ -public class DovinBaanEmblem extends Emblem { +public final class DovinBaanEmblem extends Emblem { public DovinBaanEmblem() { this.setName("Emblem Dovin"); diff --git a/Mage/src/main/java/mage/game/command/emblems/ElspethKnightErrantEmblem.java b/Mage/src/main/java/mage/game/command/emblems/ElspethKnightErrantEmblem.java index 6067faaeedc..17899691812 100644 --- a/Mage/src/main/java/mage/game/command/emblems/ElspethKnightErrantEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/ElspethKnightErrantEmblem.java @@ -17,7 +17,7 @@ import mage.game.command.Emblem; * * @author spjspj */ -public class ElspethKnightErrantEmblem extends Emblem { +public final class ElspethKnightErrantEmblem extends Emblem { public ElspethKnightErrantEmblem() { this.setName("Emblem Elspeth"); diff --git a/Mage/src/main/java/mage/game/command/emblems/ElspethSunsChampionEmblem.java b/Mage/src/main/java/mage/game/command/emblems/ElspethSunsChampionEmblem.java index 72e045663eb..9a2f6021465 100644 --- a/Mage/src/main/java/mage/game/command/emblems/ElspethSunsChampionEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/ElspethSunsChampionEmblem.java @@ -14,7 +14,7 @@ import mage.game.command.Emblem; * * @author spjspj */ -public class ElspethSunsChampionEmblem extends Emblem { +public final class ElspethSunsChampionEmblem extends Emblem { // -7: You get an emblem with "Creatures you control get +2/+2 and have flying." public ElspethSunsChampionEmblem() { diff --git a/Mage/src/main/java/mage/game/command/emblems/GarrukApexPredatorEmblem.java b/Mage/src/main/java/mage/game/command/emblems/GarrukApexPredatorEmblem.java index 6450b060ea6..63bae300ec3 100644 --- a/Mage/src/main/java/mage/game/command/emblems/GarrukApexPredatorEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/GarrukApexPredatorEmblem.java @@ -16,7 +16,7 @@ import mage.game.command.Emblem; * * @author spjspj */ -public class GarrukApexPredatorEmblem extends Emblem { +public final class GarrukApexPredatorEmblem extends Emblem { /** * Emblem with "Whenever a creature attacks you, it gets +5/+5 and gains diff --git a/Mage/src/main/java/mage/game/command/emblems/GarrukCallerOfBeastsEmblem.java b/Mage/src/main/java/mage/game/command/emblems/GarrukCallerOfBeastsEmblem.java index cf77fef925d..f0a8f56760b 100644 --- a/Mage/src/main/java/mage/game/command/emblems/GarrukCallerOfBeastsEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/GarrukCallerOfBeastsEmblem.java @@ -16,7 +16,7 @@ import mage.target.common.TargetCardInLibrary; * * @author spjspj */ -public class GarrukCallerOfBeastsEmblem extends Emblem { +public final class GarrukCallerOfBeastsEmblem extends Emblem { /** * Emblem: "Whenever you cast a creature spell, you may search your library diff --git a/Mage/src/main/java/mage/game/command/emblems/GideonAllyOfZendikarEmblem.java b/Mage/src/main/java/mage/game/command/emblems/GideonAllyOfZendikarEmblem.java index 05af49a7e46..cb0390ca082 100644 --- a/Mage/src/main/java/mage/game/command/emblems/GideonAllyOfZendikarEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/GideonAllyOfZendikarEmblem.java @@ -12,7 +12,7 @@ import mage.game.command.Emblem; * * @author spjspj */ -public class GideonAllyOfZendikarEmblem extends Emblem { +public final class GideonAllyOfZendikarEmblem extends Emblem { public GideonAllyOfZendikarEmblem() { this.setName("Emblem Gideon"); diff --git a/Mage/src/main/java/mage/game/command/emblems/GideonOfTheTrialsEmblem.java b/Mage/src/main/java/mage/game/command/emblems/GideonOfTheTrialsEmblem.java index 83173169fad..60a9820f357 100644 --- a/Mage/src/main/java/mage/game/command/emblems/GideonOfTheTrialsEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/GideonOfTheTrialsEmblem.java @@ -18,7 +18,7 @@ import mage.game.events.GameEvent; * * @author spjspj */ -public class GideonOfTheTrialsEmblem extends Emblem { +public final class GideonOfTheTrialsEmblem extends Emblem { public GideonOfTheTrialsEmblem() { this.setName("Emblem - Gideon"); diff --git a/Mage/src/main/java/mage/game/command/emblems/HuatliRadiantChampionEmblem.java b/Mage/src/main/java/mage/game/command/emblems/HuatliRadiantChampionEmblem.java index 6b68b18a1e7..cc9dc6967c7 100644 --- a/Mage/src/main/java/mage/game/command/emblems/HuatliRadiantChampionEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/HuatliRadiantChampionEmblem.java @@ -12,7 +12,7 @@ import mage.game.command.Emblem; * * @author LevelX2 */ -public class HuatliRadiantChampionEmblem extends Emblem { +public final class HuatliRadiantChampionEmblem extends Emblem { public HuatliRadiantChampionEmblem() { this.setName("Emblem Huatli"); diff --git a/Mage/src/main/java/mage/game/command/emblems/JaceTelepathUnboundEmblem.java b/Mage/src/main/java/mage/game/command/emblems/JaceTelepathUnboundEmblem.java index 064ce91bc76..6891d99b3ea 100644 --- a/Mage/src/main/java/mage/game/command/emblems/JaceTelepathUnboundEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/JaceTelepathUnboundEmblem.java @@ -14,7 +14,7 @@ import mage.target.common.TargetOpponent; * * @author spjspj */ -public class JaceTelepathUnboundEmblem extends Emblem { +public final class JaceTelepathUnboundEmblem extends Emblem { // You get an emblem with "Whenever you cast a spell, target opponent puts the top five cards of their library into their graveyard". public JaceTelepathUnboundEmblem() { diff --git a/Mage/src/main/java/mage/game/command/emblems/JaceUnravelerOfSecretsEmblem.java b/Mage/src/main/java/mage/game/command/emblems/JaceUnravelerOfSecretsEmblem.java index 19b3c6d091a..0ae65c40435 100644 --- a/Mage/src/main/java/mage/game/command/emblems/JaceUnravelerOfSecretsEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/JaceUnravelerOfSecretsEmblem.java @@ -18,7 +18,7 @@ import mage.watchers.common.SpellsCastWatcher; * * @author spjspj */ -public class JaceUnravelerOfSecretsEmblem extends Emblem { +public final class JaceUnravelerOfSecretsEmblem extends Emblem { /** * Emblem: "Whenever an opponent casts their first spell each turn, diff --git a/Mage/src/main/java/mage/game/command/emblems/JayaBallardEmblem.java b/Mage/src/main/java/mage/game/command/emblems/JayaBallardEmblem.java index f7b4621238f..45f0b291d7b 100644 --- a/Mage/src/main/java/mage/game/command/emblems/JayaBallardEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/JayaBallardEmblem.java @@ -28,7 +28,7 @@ import mage.watchers.common.CastFromGraveyardWatcher; * * @author LevelX2 */ -public class JayaBallardEmblem extends Emblem { +public final class JayaBallardEmblem extends Emblem { // You get an emblem with "You may cast instant and sorcery cards from your graveyard. If a card cast this way would be put into your graveyard, exile it instead." public JayaBallardEmblem() { diff --git a/Mage/src/main/java/mage/game/command/emblems/KioraEmblem.java b/Mage/src/main/java/mage/game/command/emblems/KioraEmblem.java index 844c1116ca1..9b730e2c9c7 100644 --- a/Mage/src/main/java/mage/game/command/emblems/KioraEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/KioraEmblem.java @@ -13,7 +13,7 @@ import mage.game.permanent.token.KioraKrakenToken; * * @author spjspj */ -public class KioraEmblem extends Emblem { +public final class KioraEmblem extends Emblem { /** * Emblem: "At the beginning of your end step, create a 9/9 blue Kraken diff --git a/Mage/src/main/java/mage/game/command/emblems/KioraMasterOfTheDepthsEmblem.java b/Mage/src/main/java/mage/game/command/emblems/KioraMasterOfTheDepthsEmblem.java index 9c662b55401..41bf5b2db7c 100644 --- a/Mage/src/main/java/mage/game/command/emblems/KioraMasterOfTheDepthsEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/KioraMasterOfTheDepthsEmblem.java @@ -17,7 +17,7 @@ import mage.target.common.TargetCreaturePermanent; * * @author spjspj */ -public class KioraMasterOfTheDepthsEmblem extends Emblem { +public final class KioraMasterOfTheDepthsEmblem extends Emblem { private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Creatures"); diff --git a/Mage/src/main/java/mage/game/command/emblems/KothOfTheHammerEmblem.java b/Mage/src/main/java/mage/game/command/emblems/KothOfTheHammerEmblem.java index de13fbeaed2..e11abefd720 100644 --- a/Mage/src/main/java/mage/game/command/emblems/KothOfTheHammerEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/KothOfTheHammerEmblem.java @@ -23,7 +23,7 @@ import mage.target.common.TargetAnyTarget; * * @author spjspj */ -public class KothOfTheHammerEmblem extends Emblem { +public final class KothOfTheHammerEmblem extends Emblem { // "Mountains you control have '{T}: This land deals 1 damage to any target.'" public KothOfTheHammerEmblem() { diff --git a/Mage/src/main/java/mage/game/command/emblems/LilianaDefiantNecromancerEmblem.java b/Mage/src/main/java/mage/game/command/emblems/LilianaDefiantNecromancerEmblem.java index 7a4711e8231..de57aa1f3c2 100644 --- a/Mage/src/main/java/mage/game/command/emblems/LilianaDefiantNecromancerEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/LilianaDefiantNecromancerEmblem.java @@ -20,7 +20,7 @@ import mage.target.targetpointer.FixedTarget; * * @author spjspj */ -public class LilianaDefiantNecromancerEmblem extends Emblem { +public final 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." private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("a creature"); diff --git a/Mage/src/main/java/mage/game/command/emblems/LilianaOfTheDarkRealmsEmblem.java b/Mage/src/main/java/mage/game/command/emblems/LilianaOfTheDarkRealmsEmblem.java index c6687fa973c..5acaa3281ef 100644 --- a/Mage/src/main/java/mage/game/command/emblems/LilianaOfTheDarkRealmsEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/LilianaOfTheDarkRealmsEmblem.java @@ -18,7 +18,7 @@ import mage.game.command.Emblem; * * @author spjspj */ -public class LilianaOfTheDarkRealmsEmblem extends Emblem { +public final class LilianaOfTheDarkRealmsEmblem extends Emblem { private static final FilterLandPermanent filter = new FilterLandPermanent("Swamps"); diff --git a/Mage/src/main/java/mage/game/command/emblems/LilianaTheLastHopeEmblem.java b/Mage/src/main/java/mage/game/command/emblems/LilianaTheLastHopeEmblem.java index 6c111af4305..4c867957ff6 100644 --- a/Mage/src/main/java/mage/game/command/emblems/LilianaTheLastHopeEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/LilianaTheLastHopeEmblem.java @@ -19,7 +19,7 @@ import mage.game.permanent.token.ZombieToken; * * @author spjspj */ -public class LilianaTheLastHopeEmblem extends Emblem { +public final class LilianaTheLastHopeEmblem extends Emblem { // "At the beginning of your end step, create X 2/2 black Zombie creature tokens, where X is two plus the number of Zombies you control." public LilianaTheLastHopeEmblem() { diff --git a/Mage/src/main/java/mage/game/command/emblems/LukeSkywalkerEmblem.java b/Mage/src/main/java/mage/game/command/emblems/LukeSkywalkerEmblem.java index 037d7c0cdfd..32a2fb8daf5 100644 --- a/Mage/src/main/java/mage/game/command/emblems/LukeSkywalkerEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/LukeSkywalkerEmblem.java @@ -20,7 +20,7 @@ import mage.players.Player; * * @author NinthWorld */ -public class LukeSkywalkerEmblem extends Emblem { +public final class LukeSkywalkerEmblem extends Emblem { // -6: You get an emblem with "Prevent all damage that would be dealt to you during combat." Exile Luke Skywalker, the Last Jedi. public LukeSkywalkerEmblem() { diff --git a/Mage/src/main/java/mage/game/command/emblems/MomirEmblem.java b/Mage/src/main/java/mage/game/command/emblems/MomirEmblem.java index 67eb74bfabe..272a96ba410 100644 --- a/Mage/src/main/java/mage/game/command/emblems/MomirEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/MomirEmblem.java @@ -28,7 +28,7 @@ import mage.util.RandomUtil; * * @author spjspj */ -public class MomirEmblem extends Emblem { +public final class MomirEmblem extends Emblem { // Faking Vanguard as an Emblem; need to come back to this and add a new type of CommandObject public MomirEmblem() { diff --git a/Mage/src/main/java/mage/game/command/emblems/NarsetTranscendentEmblem.java b/Mage/src/main/java/mage/game/command/emblems/NarsetTranscendentEmblem.java index cd063a31255..e21d2d81415 100644 --- a/Mage/src/main/java/mage/game/command/emblems/NarsetTranscendentEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/NarsetTranscendentEmblem.java @@ -18,7 +18,7 @@ import mage.players.Player; * * @author spjspj */ -public class NarsetTranscendentEmblem extends Emblem { +public final class NarsetTranscendentEmblem extends Emblem { // "Your opponents can't cast noncreature spells. public NarsetTranscendentEmblem() { diff --git a/Mage/src/main/java/mage/game/command/emblems/NissaVitalForceEmblem.java b/Mage/src/main/java/mage/game/command/emblems/NissaVitalForceEmblem.java index 9df9cc2d4a1..7aadb4e560a 100644 --- a/Mage/src/main/java/mage/game/command/emblems/NissaVitalForceEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/NissaVitalForceEmblem.java @@ -12,7 +12,7 @@ import mage.game.command.Emblem; * * @author spjspj */ -public class NissaVitalForceEmblem extends Emblem { +public final class NissaVitalForceEmblem extends Emblem { // You get an emblem with "Whenever a land enters the battlefield under your control, you may draw a card." public NissaVitalForceEmblem() { diff --git a/Mage/src/main/java/mage/game/command/emblems/ObNixilisOfTheBlackOathEmblem.java b/Mage/src/main/java/mage/game/command/emblems/ObNixilisOfTheBlackOathEmblem.java index 2d73617feb1..c324972d068 100644 --- a/Mage/src/main/java/mage/game/command/emblems/ObNixilisOfTheBlackOathEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/ObNixilisOfTheBlackOathEmblem.java @@ -19,7 +19,7 @@ import mage.target.common.TargetControlledCreaturePermanent; * * @author spjspj */ -public class ObNixilisOfTheBlackOathEmblem extends Emblem { +public final class ObNixilisOfTheBlackOathEmblem extends Emblem { // You get an emblem with "{1}{B}, Sacrifice a creature: You gain X life and draw X cards, where X is the sacrificed creature's power." public ObNixilisOfTheBlackOathEmblem() { diff --git a/Mage/src/main/java/mage/game/command/emblems/ObNixilisReignitedEmblem.java b/Mage/src/main/java/mage/game/command/emblems/ObNixilisReignitedEmblem.java index 2211886250c..6535e7f3bb2 100644 --- a/Mage/src/main/java/mage/game/command/emblems/ObNixilisReignitedEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/ObNixilisReignitedEmblem.java @@ -14,7 +14,7 @@ import mage.game.events.GameEvent.EventType; * * @author spjspj */ -public class ObNixilisReignitedEmblem extends Emblem { +public final class ObNixilisReignitedEmblem extends Emblem { public ObNixilisReignitedEmblem() { setName("Emblem Nixilis"); diff --git a/Mage/src/main/java/mage/game/command/emblems/ObiWanKenobiEmblem.java b/Mage/src/main/java/mage/game/command/emblems/ObiWanKenobiEmblem.java index 59031387333..19cb1182025 100644 --- a/Mage/src/main/java/mage/game/command/emblems/ObiWanKenobiEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/ObiWanKenobiEmblem.java @@ -17,7 +17,7 @@ import mage.game.command.Emblem; * * @author spjspj */ -public class ObiWanKenobiEmblem extends Emblem { +public final class ObiWanKenobiEmblem extends Emblem { // Creatures you control get +1/+1 and have vigilance, first strike, and lifelink public ObiWanKenobiEmblem() { diff --git a/Mage/src/main/java/mage/game/command/emblems/RalIzzetViceroyEmblem.java b/Mage/src/main/java/mage/game/command/emblems/RalIzzetViceroyEmblem.java index 4c2eac1842c..18328ce6334 100644 --- a/Mage/src/main/java/mage/game/command/emblems/RalIzzetViceroyEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/RalIzzetViceroyEmblem.java @@ -13,7 +13,7 @@ import mage.target.common.TargetAnyTarget; * * @author TheElk801 */ -public class RalIzzetViceroyEmblem extends Emblem { +public final class RalIzzetViceroyEmblem extends Emblem { // You get an emblem with "Whenever you cast an instant or sorcery spell, this emblem deals 4 damage to any target and you draw two cards." public RalIzzetViceroyEmblem() { diff --git a/Mage/src/main/java/mage/game/command/emblems/RowanKenrithEmblem.java b/Mage/src/main/java/mage/game/command/emblems/RowanKenrithEmblem.java index 46ecdbb4e68..c3f33d114be 100644 --- a/Mage/src/main/java/mage/game/command/emblems/RowanKenrithEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/RowanKenrithEmblem.java @@ -18,7 +18,7 @@ import mage.players.Player; * * @author TheElk801 */ -public class RowanKenrithEmblem extends Emblem { +public final class RowanKenrithEmblem extends Emblem { // Target player gets an emblem with "Whenever you activate an ability that isn't a mana ability, copy it. You may choose new targets for the copy." public RowanKenrithEmblem() { diff --git a/Mage/src/main/java/mage/game/command/emblems/SarkhanTheDragonspeakerEmblem.java b/Mage/src/main/java/mage/game/command/emblems/SarkhanTheDragonspeakerEmblem.java index 9ec91355f4b..814514d2c27 100644 --- a/Mage/src/main/java/mage/game/command/emblems/SarkhanTheDragonspeakerEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/SarkhanTheDragonspeakerEmblem.java @@ -13,7 +13,7 @@ import mage.game.command.Emblem; * * @author spjspj */ -public class SarkhanTheDragonspeakerEmblem extends Emblem { +public final class SarkhanTheDragonspeakerEmblem extends Emblem { public SarkhanTheDragonspeakerEmblem() { setName("Emblem Sarkhan"); diff --git a/Mage/src/main/java/mage/game/command/emblems/SorinLordOfInnistradEmblem.java b/Mage/src/main/java/mage/game/command/emblems/SorinLordOfInnistradEmblem.java index 5034a0583c9..5c340dface0 100644 --- a/Mage/src/main/java/mage/game/command/emblems/SorinLordOfInnistradEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/SorinLordOfInnistradEmblem.java @@ -12,7 +12,7 @@ import mage.game.command.Emblem; * * @author spjspj */ -public class SorinLordOfInnistradEmblem extends Emblem { +public final class SorinLordOfInnistradEmblem extends Emblem { public SorinLordOfInnistradEmblem() { this.setName("Emblem Sorin"); diff --git a/Mage/src/main/java/mage/game/command/emblems/SorinSolemnVisitorEmblem.java b/Mage/src/main/java/mage/game/command/emblems/SorinSolemnVisitorEmblem.java index cd0f7eb0d4e..eedc5bf4a75 100644 --- a/Mage/src/main/java/mage/game/command/emblems/SorinSolemnVisitorEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/SorinSolemnVisitorEmblem.java @@ -13,7 +13,7 @@ import mage.game.command.Emblem; * * @author spjspj */ -public class SorinSolemnVisitorEmblem extends Emblem { +public final class SorinSolemnVisitorEmblem extends Emblem { /** * Emblem: "At the beginning of each opponent's upkeep, that player diff --git a/Mage/src/main/java/mage/game/command/emblems/TamiyoFieldResearcherEmblem.java b/Mage/src/main/java/mage/game/command/emblems/TamiyoFieldResearcherEmblem.java index d6febe73ff7..14b91f6c471 100644 --- a/Mage/src/main/java/mage/game/command/emblems/TamiyoFieldResearcherEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/TamiyoFieldResearcherEmblem.java @@ -10,7 +10,7 @@ import mage.game.command.Emblem; * * Author: spjspj */ -public class TamiyoFieldResearcherEmblem extends Emblem { +public final class TamiyoFieldResearcherEmblem extends Emblem { // You may cast nonland cards from your hand without paying their mana costs. public TamiyoFieldResearcherEmblem() { diff --git a/Mage/src/main/java/mage/game/command/emblems/TamiyoTheMoonSageEmblem.java b/Mage/src/main/java/mage/game/command/emblems/TamiyoTheMoonSageEmblem.java index 0ea5a615753..6034f77158f 100644 --- a/Mage/src/main/java/mage/game/command/emblems/TamiyoTheMoonSageEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/TamiyoTheMoonSageEmblem.java @@ -19,7 +19,7 @@ import mage.game.command.Emblem; * * @author spjspj */ -public class TamiyoTheMoonSageEmblem extends Emblem { +public final class TamiyoTheMoonSageEmblem extends Emblem { /** * Emblem with "You have no maximum hand size" and "Whenever a card is put diff --git a/Mage/src/main/java/mage/game/command/emblems/TeferiHeroOfDominariaEmblem.java b/Mage/src/main/java/mage/game/command/emblems/TeferiHeroOfDominariaEmblem.java index 7c9447c049d..baee186e0a7 100644 --- a/Mage/src/main/java/mage/game/command/emblems/TeferiHeroOfDominariaEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/TeferiHeroOfDominariaEmblem.java @@ -19,7 +19,7 @@ import mage.target.TargetPermanent; * * @author LevelX2 */ -public class TeferiHeroOfDominariaEmblem extends Emblem { +public final class TeferiHeroOfDominariaEmblem extends Emblem { // Whenever you draw a card, exile target permanent an opponent controls. public TeferiHeroOfDominariaEmblem() { diff --git a/Mage/src/main/java/mage/game/command/emblems/TeferiTemporalArchmageEmblem.java b/Mage/src/main/java/mage/game/command/emblems/TeferiTemporalArchmageEmblem.java index 5a90eca9943..0ea3da58598 100644 --- a/Mage/src/main/java/mage/game/command/emblems/TeferiTemporalArchmageEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/TeferiTemporalArchmageEmblem.java @@ -11,7 +11,7 @@ import mage.game.command.Emblem; * * @author spjspj */ -public class TeferiTemporalArchmageEmblem extends Emblem { +public final class TeferiTemporalArchmageEmblem extends Emblem { // "You may activate loyalty abilities of planeswalkers you control on any player's turn any time you could cast an instant." public TeferiTemporalArchmageEmblem() { diff --git a/Mage/src/main/java/mage/game/command/emblems/TezzeretArtificeMasterEmblem.java b/Mage/src/main/java/mage/game/command/emblems/TezzeretArtificeMasterEmblem.java index 397aac8c660..7b4dd91633a 100644 --- a/Mage/src/main/java/mage/game/command/emblems/TezzeretArtificeMasterEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/TezzeretArtificeMasterEmblem.java @@ -12,7 +12,7 @@ import mage.target.common.TargetCardInLibrary; * * @author TheElk801 */ -public class TezzeretArtificeMasterEmblem extends Emblem { +public final class TezzeretArtificeMasterEmblem extends Emblem { // −9: You get an emblem with "At the beginning of your end step, search your library for a permanent card, put it into the battlefield, then shuffle your library." public TezzeretArtificeMasterEmblem() { diff --git a/Mage/src/main/java/mage/game/command/emblems/TezzeretTheSchemerEmblem.java b/Mage/src/main/java/mage/game/command/emblems/TezzeretTheSchemerEmblem.java index 8ccc7d4632b..f730fc2d4b1 100644 --- a/Mage/src/main/java/mage/game/command/emblems/TezzeretTheSchemerEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/TezzeretTheSchemerEmblem.java @@ -18,7 +18,7 @@ import mage.target.TargetPermanent; * * @author spjspj */ -public class TezzeretTheSchemerEmblem extends Emblem { +public final class TezzeretTheSchemerEmblem extends Emblem { public TezzeretTheSchemerEmblem() { this.setName("Emblem Tezzeret"); diff --git a/Mage/src/main/java/mage/game/command/emblems/VenserTheSojournerEmblem.java b/Mage/src/main/java/mage/game/command/emblems/VenserTheSojournerEmblem.java index ada5b37e9d3..127efd8d934 100644 --- a/Mage/src/main/java/mage/game/command/emblems/VenserTheSojournerEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/VenserTheSojournerEmblem.java @@ -20,7 +20,7 @@ import mage.target.targetpointer.FixedTarget; * * @author spjspj */ -public class VenserTheSojournerEmblem extends Emblem { +public final class VenserTheSojournerEmblem extends Emblem { /** * Emblem: "Whenever you cast a spell, exile target permanent." diff --git a/Mage/src/main/java/mage/game/command/emblems/VivienReidEmblem.java b/Mage/src/main/java/mage/game/command/emblems/VivienReidEmblem.java index c411e581dfd..f63da5fa041 100644 --- a/Mage/src/main/java/mage/game/command/emblems/VivienReidEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/VivienReidEmblem.java @@ -16,7 +16,7 @@ import mage.game.command.Emblem; * * @author spjspj */ -public class VivienReidEmblem extends Emblem { +public final class VivienReidEmblem extends Emblem { // -8: You get an emblem with "Creatures you control get +2/+2 and have vigilance, trample, and indestructible. public VivienReidEmblem() { diff --git a/Mage/src/main/java/mage/game/command/emblems/VraskaGolgariQueenEmblem.java b/Mage/src/main/java/mage/game/command/emblems/VraskaGolgariQueenEmblem.java index 5e97b8c7453..f7c2fac333c 100644 --- a/Mage/src/main/java/mage/game/command/emblems/VraskaGolgariQueenEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/VraskaGolgariQueenEmblem.java @@ -10,7 +10,7 @@ import mage.game.command.Emblem; * * @author TheElk801 */ -public class VraskaGolgariQueenEmblem extends Emblem { +public final class VraskaGolgariQueenEmblem extends Emblem { // -9: You get an emblem with "Whenever a creature you control deals combat damage to a player, that player loses the game." public VraskaGolgariQueenEmblem() { @@ -19,7 +19,7 @@ public class VraskaGolgariQueenEmblem extends Emblem { this.getAbilities().add(new DealsDamageToAPlayerAllTriggeredAbility( new LoseGameTargetPlayerEffect(), StaticFilters.FILTER_CONTROLLED_A_CREATURE, - false, SetTargetPointer.NONE, true + false, SetTargetPointer.PLAYER, true )); } } diff --git a/Mage/src/main/java/mage/game/command/emblems/WillKenrithEmblem.java b/Mage/src/main/java/mage/game/command/emblems/WillKenrithEmblem.java index 0574973f5c8..9a0f1bbbe68 100644 --- a/Mage/src/main/java/mage/game/command/emblems/WillKenrithEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/WillKenrithEmblem.java @@ -11,7 +11,7 @@ import mage.game.command.Emblem; * * @author TheElk801 */ -public class WillKenrithEmblem extends Emblem { +public final class WillKenrithEmblem extends Emblem { // Target player gets an emblem with "Whenever you cast an instant or sorcery spell, copy it. You may choose new targets for the copy." public WillKenrithEmblem() { diff --git a/Mage/src/main/java/mage/game/command/emblems/YodaEmblem.java b/Mage/src/main/java/mage/game/command/emblems/YodaEmblem.java index 39145754e6c..9c7d02276b0 100644 --- a/Mage/src/main/java/mage/game/command/emblems/YodaEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/YodaEmblem.java @@ -16,7 +16,7 @@ import mage.game.command.Emblem; * * @author spjspj */ -public class YodaEmblem extends Emblem { +public final class YodaEmblem extends Emblem { // You get an emblem with "Hexproof, you and your creatures have." public YodaEmblem() { diff --git a/Mage/src/main/java/mage/game/command/planes/AcademyAtTolariaWestPlane.java b/Mage/src/main/java/mage/game/command/planes/AcademyAtTolariaWestPlane.java index 4f52246b021..58b485755b0 100644 --- a/Mage/src/main/java/mage/game/command/planes/AcademyAtTolariaWestPlane.java +++ b/Mage/src/main/java/mage/game/command/planes/AcademyAtTolariaWestPlane.java @@ -88,10 +88,8 @@ class DrawCardsActivePlayerEffect extends OneShotEffect { if (cPlane == null) { return false; } - if (cPlane != null) { - if (!cPlane.getName().equalsIgnoreCase("Plane - Academy at Tolaria West")) { - return false; - } + if (!cPlane.getName().equalsIgnoreCase("Plane - Academy at Tolaria West")) { + return false; } Player player = game.getPlayer(game.getActivePlayerId()); if (player != null) { diff --git a/Mage/src/main/java/mage/game/command/planes/AstralArenaPlane.java b/Mage/src/main/java/mage/game/command/planes/AstralArenaPlane.java index 0034e82a924..7c7bf12635a 100644 --- a/Mage/src/main/java/mage/game/command/planes/AstralArenaPlane.java +++ b/Mage/src/main/java/mage/game/command/planes/AstralArenaPlane.java @@ -81,10 +81,8 @@ class AstralArenaAttackRestrictionEffect extends RestrictionEffect { if (cPlane == null) { return false; } - if (cPlane != null) { - if (!cPlane.getName().equalsIgnoreCase("Plane - Astral Arena")) { - return false; - } + if (!cPlane.getName().equalsIgnoreCase("Plane - Astral Arena")) { + return false; } return true; @@ -118,10 +116,8 @@ class AstralArenaBlockRestrictionEffect extends RestrictionEffect { if (cPlane == null) { return false; } - if (cPlane != null) { - if (!cPlane.getName().equalsIgnoreCase("Plane - Astral Arena")) { - return false; - } + if (!cPlane.getName().equalsIgnoreCase("Plane - Astral Arena")) { + return false; } return true; } diff --git a/Mage/src/main/java/mage/game/command/planes/EdgeOfMalacolPlane.java b/Mage/src/main/java/mage/game/command/planes/EdgeOfMalacolPlane.java index 553994511f1..4a29f9fd16d 100644 --- a/Mage/src/main/java/mage/game/command/planes/EdgeOfMalacolPlane.java +++ b/Mage/src/main/java/mage/game/command/planes/EdgeOfMalacolPlane.java @@ -101,10 +101,8 @@ class EdgeOfMalacolEffect extends ContinuousRuleModifyingEffectImpl { if (cPlane == null) { return false; } - if (cPlane != null) { - if (!cPlane.getName().equalsIgnoreCase("Plane - Edge of Malacol")) { - return false; - } + if (!cPlane.getName().equalsIgnoreCase("Plane - Edge of Malacol")) { + return false; } Permanent permanent = game.getPermanent(event.getTargetId()); if (permanent != null && filter.match(permanent, game) && Objects.equals(permanent.getControllerId(), game.getActivePlayerId())) { diff --git a/Mage/src/main/java/mage/game/command/planes/FeedingGroundsPlane.java b/Mage/src/main/java/mage/game/command/planes/FeedingGroundsPlane.java index c23922c7734..bf125dadf41 100644 --- a/Mage/src/main/java/mage/game/command/planes/FeedingGroundsPlane.java +++ b/Mage/src/main/java/mage/game/command/planes/FeedingGroundsPlane.java @@ -79,7 +79,7 @@ class FeedingGroundsEffect extends CostModificationEffectImpl { new ColorPredicate(ObjectColor.GREEN))); } - private static final String rule = "Red spells cost {1} less to cast. Green spells cost {1} less to cast."; + private static final String rule = "Red spells cost {1} less to cast. Green spells cost {1} less to cast."; private int amount = 1; public FeedingGroundsEffect() { @@ -133,19 +133,17 @@ class FeedingGroundsEffect extends CostModificationEffectImpl { if (cPlane == null) { return false; } - if (cPlane != null) { - if (!cPlane.getName().equalsIgnoreCase("Plane - Feeding Grounds")) { - return false; - } + if (!cPlane.getName().equalsIgnoreCase("Plane - Feeding Grounds")) { + return false; } Spell spell = (Spell) game.getStack().getStackObject(abilityToModify.getId()); if (spell != null) { - return this.filter.match(spell, game) && selectedByRuntimeData(spell, source, game); + return filter.match(spell, game) && selectedByRuntimeData(spell, source, game); } else { // used at least for flashback ability because Flashback ability doesn't use stack Card sourceCard = game.getCard(abilityToModify.getSourceId()); - return sourceCard != null && this.filter.match(sourceCard, game) && selectedByRuntimeData(sourceCard, source, game); + return sourceCard != null && filter.match(sourceCard, game) && selectedByRuntimeData(sourceCard, source, game); } } return false; diff --git a/Mage/src/main/java/mage/game/command/planes/HedronFieldsOfAgadeemPlane.java b/Mage/src/main/java/mage/game/command/planes/HedronFieldsOfAgadeemPlane.java index 5b5ab8bbb71..abb010d4dc1 100644 --- a/Mage/src/main/java/mage/game/command/planes/HedronFieldsOfAgadeemPlane.java +++ b/Mage/src/main/java/mage/game/command/planes/HedronFieldsOfAgadeemPlane.java @@ -95,10 +95,8 @@ class HedronFieldsOfAgadeemRestrictionEffect extends RestrictionEffect { if (cPlane == null) { return false; } - if (cPlane != null) { - if (!cPlane.getName().equalsIgnoreCase("Plane - Hedron Fields of Agadeem")) { - return false; - } + if (!cPlane.getName().equalsIgnoreCase("Plane - Hedron Fields of Agadeem")) { + return false; } return filter.match(permanent, source.getSourceId(), source.getControllerId(), game); } diff --git a/Mage/src/main/java/mage/game/command/planes/TazeemPlane.java b/Mage/src/main/java/mage/game/command/planes/TazeemPlane.java index 65d66d0a5b9..a1bdad2eec1 100644 --- a/Mage/src/main/java/mage/game/command/planes/TazeemPlane.java +++ b/Mage/src/main/java/mage/game/command/planes/TazeemPlane.java @@ -65,7 +65,6 @@ class TazeemCantBlockAllEffect extends RestrictionEffect { public TazeemCantBlockAllEffect() { super(Duration.Custom); - this.filter = filter; } public TazeemCantBlockAllEffect(final TazeemCantBlockAllEffect effect) { diff --git a/Mage/src/main/java/mage/game/command/planes/TheEonFogPlane.java b/Mage/src/main/java/mage/game/command/planes/TheEonFogPlane.java index f0a458626f1..75592637a0b 100644 --- a/Mage/src/main/java/mage/game/command/planes/TheEonFogPlane.java +++ b/Mage/src/main/java/mage/game/command/planes/TheEonFogPlane.java @@ -87,10 +87,8 @@ class TheEonFogSkipUntapStepEffect extends ContinuousRuleModifyingEffectImpl { if (cPlane == null) { return false; } - if (cPlane != null) { - if (!cPlane.getName().equalsIgnoreCase("Plane - The Eon Fog")) { - return false; - } + if (!cPlane.getName().equalsIgnoreCase("Plane - The Eon Fog")) { + return false; } return event.getType() == GameEvent.EventType.UNTAP_STEP; } diff --git a/Mage/src/main/java/mage/game/command/planes/TheGreatForestPlane.java b/Mage/src/main/java/mage/game/command/planes/TheGreatForestPlane.java index 56e7f1e2c64..329a91b5e81 100644 --- a/Mage/src/main/java/mage/game/command/planes/TheGreatForestPlane.java +++ b/Mage/src/main/java/mage/game/command/planes/TheGreatForestPlane.java @@ -86,10 +86,8 @@ class TheGreatForestCombatDamageRuleEffect extends ContinuousEffectImpl { if (cPlane == null) { return false; } - if (cPlane != null) { - if (!cPlane.getName().equalsIgnoreCase("Plane - The Great Forest")) { - return false; - } + if (!cPlane.getName().equalsIgnoreCase("Plane - The Great Forest")) { + return false; } // Change the rule diff --git a/Mage/src/main/java/mage/game/command/planes/TrailOfTheMageRingsPlane.java b/Mage/src/main/java/mage/game/command/planes/TrailOfTheMageRingsPlane.java index 1af66697987..7b13f11c208 100644 --- a/Mage/src/main/java/mage/game/command/planes/TrailOfTheMageRingsPlane.java +++ b/Mage/src/main/java/mage/game/command/planes/TrailOfTheMageRingsPlane.java @@ -101,10 +101,8 @@ class TrailOfTheMageRingsReboundEffect extends ContinuousEffectImpl { if (cPlane == null) { return false; } - if (cPlane != null) { - if (!cPlane.getName().equalsIgnoreCase("Plane - Trail of the Mage-Rings")) { - return false; - } + if (!cPlane.getName().equalsIgnoreCase("Plane - Trail of the Mage-Rings")) { + return false; } for (UUID playerId : game.getPlayers().keySet()) { diff --git a/Mage/src/main/java/mage/game/command/planes/TurriIslandPlane.java b/Mage/src/main/java/mage/game/command/planes/TurriIslandPlane.java index c18e2dc83ab..29dc7e71f83 100644 --- a/Mage/src/main/java/mage/game/command/planes/TurriIslandPlane.java +++ b/Mage/src/main/java/mage/game/command/planes/TurriIslandPlane.java @@ -114,19 +114,17 @@ class TurriIslandEffect extends CostModificationEffectImpl { if (cPlane == null) { return false; } - if (cPlane != null) { - if (!cPlane.getName().equalsIgnoreCase("Plane - Turri Island")) { - return false; - } + if (!cPlane.getName().equalsIgnoreCase("Plane - Turri Island")) { + return false; } - + Spell spell = (Spell) game.getStack().getStackObject(abilityToModify.getId()); if (spell != null) { - return this.filter.match(spell, game) && selectedByRuntimeData(spell, source, game); + return filter.match(spell, game) && selectedByRuntimeData(spell, source, game); } else { // used at least for flashback ability because Flashback ability doesn't use stack Card sourceCard = game.getCard(abilityToModify.getSourceId()); - return sourceCard != null && this.filter.match(sourceCard, game) && selectedByRuntimeData(sourceCard, source, game); + return sourceCard != null && filter.match(sourceCard, game) && selectedByRuntimeData(sourceCard, source, game); } } return false; diff --git a/Mage/src/main/java/mage/game/command/planes/UndercityReachesPlane.java b/Mage/src/main/java/mage/game/command/planes/UndercityReachesPlane.java index 75196fbfda1..9677f180852 100644 --- a/Mage/src/main/java/mage/game/command/planes/UndercityReachesPlane.java +++ b/Mage/src/main/java/mage/game/command/planes/UndercityReachesPlane.java @@ -96,10 +96,8 @@ class UndercityReachesTriggeredAbility extends TriggeredAbilityImpl { if (cPlane == null) { return false; } - if (cPlane != null) { - if (!cPlane.getName().equalsIgnoreCase("Plane - Undercity Reaches")) { - return false; - } + if (!cPlane.getName().equalsIgnoreCase("Plane - Undercity Reaches")) { + return false; } if (((DamagedPlayerEvent) event).isCombatDamage()) { diff --git a/Mage/src/main/java/mage/game/permanent/token/ElfKnightToken.java b/Mage/src/main/java/mage/game/permanent/token/ElfKnightToken.java index ecb2764cdaa..b2483d23fb5 100644 --- a/Mage/src/main/java/mage/game/permanent/token/ElfKnightToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/ElfKnightToken.java @@ -1,18 +1,17 @@ package mage.game.permanent.token; -import mage.constants.CardType; -import mage.constants.SubType; import mage.MageInt; import mage.abilities.keyword.VigilanceAbility; +import mage.constants.CardType; +import mage.constants.SubType; /** - * * @author TheElk801 */ public final class ElfKnightToken extends TokenImpl { public ElfKnightToken() { - super("Knight Ally", "2/2 green and white Elf Knight creature token with vigilance"); + super("Elf Knight", "2/2 green and white Elf Knight creature token with vigilance"); this.setExpansionSetCodeForImage("GRN"); cardType.add(CardType.CREATURE); color.setGreen(true); diff --git a/Mage/src/main/java/mage/game/permanent/token/ExpansionSymbolToken.java b/Mage/src/main/java/mage/game/permanent/token/ExpansionSymbolToken.java new file mode 100644 index 00000000000..1f608901ce2 --- /dev/null +++ b/Mage/src/main/java/mage/game/permanent/token/ExpansionSymbolToken.java @@ -0,0 +1,29 @@ + +package mage.game.permanent.token; + +import mage.constants.CardType; +import mage.constants.SubType; +import mage.MageInt; + +/** + * + * @author L_J + */ +public final class ExpansionSymbolToken extends TokenImpl { + + public ExpansionSymbolToken() { + super("Expansion-Symbol", "1/1 colorless Expansion-Symbol creature token"); + cardType.add(CardType.CREATURE); + subtype.add(SubType.EXPANSION_SYMBOL); + power = new MageInt(1); + toughness = new MageInt(1); + } + + public ExpansionSymbolToken(final ExpansionSymbolToken token) { + super(token); + } + + public ExpansionSymbolToken copy() { + return new ExpansionSymbolToken(this); + } +} diff --git a/Mage/src/main/java/mage/game/permanent/token/GoblinToken.java b/Mage/src/main/java/mage/game/permanent/token/GoblinToken.java index e59b7f70df4..79a3a2236db 100644 --- a/Mage/src/main/java/mage/game/permanent/token/GoblinToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/GoblinToken.java @@ -20,7 +20,7 @@ public final class GoblinToken extends TokenImpl { static { tokenImageSets.addAll(Arrays.asList("10E", "ALA", "SOM", "M10", "NPH", "M13", "RTR", "MMA", "M15", "C14", "KTK", "EVG", "DTK", "ORI", "DDG", "DDN", "DD3EVG", "MM2", - "MM3", "EMA", "C16", "DOM")); + "MM3", "EMA", "C16", "DOM", "ANA")); } public GoblinToken(boolean withHaste) { diff --git a/Mage/src/main/java/mage/game/permanent/token/MaskToken.java b/Mage/src/main/java/mage/game/permanent/token/MaskToken.java index 662ee9e0603..fd1619f9955 100644 --- a/Mage/src/main/java/mage/game/permanent/token/MaskToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/MaskToken.java @@ -10,7 +10,6 @@ import mage.constants.SubType; import mage.target.TargetPermanent; /** - * * @author TheElk801 */ public final class MaskToken extends TokenImpl { @@ -18,8 +17,8 @@ public final class MaskToken extends TokenImpl { public MaskToken() { super( "Mask", "white Aura enchantment token named Mask " - + "attached to another target permanent. " - + "The token has enchant permanent and totem armor." + + "attached to another target permanent. " + + "The token has enchant permanent and totem armor." ); cardType.add(CardType.ENCHANTMENT); color.setWhite(true); @@ -31,6 +30,7 @@ public final class MaskToken extends TokenImpl { ability.addEffect(new AttachEffect(Outcome.BoostCreature)); this.addAbility(ability); + // Totem armor this.addAbility(new TotemArmorAbility()); } diff --git a/Mage/src/main/java/mage/game/permanent/token/RabidSheepToken.java b/Mage/src/main/java/mage/game/permanent/token/RabidSheepToken.java new file mode 100644 index 00000000000..e3912f9f2b1 --- /dev/null +++ b/Mage/src/main/java/mage/game/permanent/token/RabidSheepToken.java @@ -0,0 +1,30 @@ + +package mage.game.permanent.token; + +import mage.constants.CardType; +import mage.constants.SubType; +import mage.MageInt; + +/** + * + * @author L_J + */ +public final class RabidSheepToken extends TokenImpl { + + public RabidSheepToken() { + super("Rabid Sheep", "2/2 green Sheep creature token named Rabid Sheep"); + cardType.add(CardType.CREATURE); + subtype.add(SubType.SHEEP); + color.setGreen(true); + power = new MageInt(2); + toughness = new MageInt(2); + } + + public RabidSheepToken(final RabidSheepToken token) { + super(token); + } + + public RabidSheepToken copy() { + return new RabidSheepToken(this); + } +} diff --git a/Mage/src/main/java/mage/game/permanent/token/SpiritWhiteToken.java b/Mage/src/main/java/mage/game/permanent/token/SpiritWhiteToken.java index 5b856ddedad..64668eb42a2 100644 --- a/Mage/src/main/java/mage/game/permanent/token/SpiritWhiteToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/SpiritWhiteToken.java @@ -17,7 +17,7 @@ public final class SpiritWhiteToken extends TokenImpl { final static private List tokenImageSets = new ArrayList<>(); static { - tokenImageSets.addAll(Arrays.asList("AVR", "C14", "CNS", "DDC", "DDK", "FRF", "ISD", "KTK", "M15", "MM2", "SHM", "SOI", "EMA", "C16", "MM3", "CMA", "E01")); + tokenImageSets.addAll(Arrays.asList("AVR", "C14", "CNS", "DDC", "DDK", "FRF", "ISD", "KTK", "M15", "MM2", "SHM", "SOI", "EMA", "C16", "MM3", "CMA", "E01", "ANA")); } public SpiritWhiteToken() { diff --git a/Mage/src/main/java/mage/game/permanent/token/UktabiKongApeToken.java b/Mage/src/main/java/mage/game/permanent/token/UktabiKongApeToken.java new file mode 100644 index 00000000000..8fb6538aaf0 --- /dev/null +++ b/Mage/src/main/java/mage/game/permanent/token/UktabiKongApeToken.java @@ -0,0 +1,30 @@ + +package mage.game.permanent.token; + +import mage.constants.CardType; +import mage.constants.SubType; +import mage.MageInt; + +/** + * + * @author L_J + */ +public final class UktabiKongApeToken extends TokenImpl { + + public UktabiKongApeToken() { + super("Ape", "1/1 green Ape creature token"); + cardType.add(CardType.CREATURE); + subtype.add(SubType.APE); + color.setGreen(true); + power = new MageInt(1); + toughness = new MageInt(1); + } + + public UktabiKongApeToken(final UktabiKongApeToken token) { + super(token); + } + + public UktabiKongApeToken copy() { + return new UktabiKongApeToken(this); + } +} diff --git a/Mage/src/main/java/mage/game/stack/StackAbility.java b/Mage/src/main/java/mage/game/stack/StackAbility.java index a9d8707f094..4c7259ed7d8 100644 --- a/Mage/src/main/java/mage/game/stack/StackAbility.java +++ b/Mage/src/main/java/mage/game/stack/StackAbility.java @@ -1,4 +1,3 @@ - package mage.game.stack; import java.util.ArrayList; @@ -28,6 +27,7 @@ import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.Target; import mage.target.Targets; +import mage.target.targetadjustment.TargetAdjuster; import mage.util.GameLog; import mage.util.SubTypeList; import mage.watchers.Watcher; @@ -49,7 +49,7 @@ public class StackAbility extends StackObjImpl implements Ability { private UUID controllerId; private String name; private String expansionSetCode; - private TargetAdjustment targetAdjustment = TargetAdjustment.NONE; + private TargetAdjuster targetAdjuster = null; public StackAbility(Ability ability, UUID controllerId) { this.ability = ability; @@ -62,7 +62,7 @@ public class StackAbility extends StackObjImpl implements Ability { this.controllerId = stackAbility.controllerId; this.name = stackAbility.name; this.expansionSetCode = stackAbility.expansionSetCode; - this.targetAdjustment = stackAbility.targetAdjustment; + this.targetAdjuster = stackAbility.targetAdjuster; this.targetChanged = stackAbility.targetChanged; } @@ -596,12 +596,19 @@ public class StackAbility extends StackObjImpl implements Ability { } @Override - public void setTargetAdjustment(TargetAdjustment targetAdjustment) { - this.targetAdjustment = targetAdjustment; + public void setTargetAdjuster(TargetAdjuster targetAdjuster) { + this.targetAdjuster = targetAdjuster; } @Override - public TargetAdjustment getTargetAdjustment() { - return targetAdjustment; + public TargetAdjuster getTargetAdjuster() { + return targetAdjuster; + } + + @Override + public void adjustTargets(Game game) { + if (targetAdjuster != null) { + targetAdjuster.adjustTargets(this, game); + } } } diff --git a/Mage/src/main/java/mage/game/tournament/TournamentImpl.java b/Mage/src/main/java/mage/game/tournament/TournamentImpl.java index 071b14bda7f..b1fd8ea51f5 100644 --- a/Mage/src/main/java/mage/game/tournament/TournamentImpl.java +++ b/Mage/src/main/java/mage/game/tournament/TournamentImpl.java @@ -476,7 +476,7 @@ public abstract class TournamentImpl implements Tournament { @Override public void cleanUpOnTournamentEnd() { for (TournamentPlayer tournamentPlayer : players.values()) { - tournamentPlayer.CleanUpOnTournamentEnd(); + tournamentPlayer.cleanUpOnTournamentEnd(); } } diff --git a/Mage/src/main/java/mage/game/tournament/TournamentPlayer.java b/Mage/src/main/java/mage/game/tournament/TournamentPlayer.java index 6d01e42e083..6072015d4d9 100644 --- a/Mage/src/main/java/mage/game/tournament/TournamentPlayer.java +++ b/Mage/src/main/java/mage/game/tournament/TournamentPlayer.java @@ -179,7 +179,7 @@ public class TournamentPlayer { * Free resources no longer needed if tournament has ended * */ - public void CleanUpOnTournamentEnd() { + public void cleanUpOnTournamentEnd() { this.deck = null; } diff --git a/Mage/src/main/java/mage/players/Player.java b/Mage/src/main/java/mage/players/Player.java index 0c8ea5bc355..a730164f736 100644 --- a/Mage/src/main/java/mage/players/Player.java +++ b/Mage/src/main/java/mage/players/Player.java @@ -1,22 +1,9 @@ package mage.players; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.UUID; import mage.MageItem; import mage.MageObject; import mage.MageObjectReference; -import mage.abilities.Abilities; -import mage.abilities.Ability; -import mage.abilities.ActivatedAbility; -import mage.abilities.Mode; -import mage.abilities.Modes; -import mage.abilities.SpellAbility; -import mage.abilities.TriggeredAbility; +import mage.abilities.*; import mage.abilities.costs.AlternativeSourceCosts; import mage.abilities.costs.Cost; import mage.abilities.costs.Costs; @@ -28,13 +15,7 @@ import mage.cards.Card; import mage.cards.Cards; import mage.cards.decks.Deck; import mage.choices.Choice; -import mage.constants.AbilityType; -import mage.constants.ManaType; -import mage.constants.Outcome; -import mage.constants.PlanarDieRoll; -import mage.constants.PlayerAction; -import mage.constants.RangeOfInfluence; -import mage.constants.Zone; +import mage.constants.*; import mage.counters.Counter; import mage.counters.Counters; import mage.designations.Designation; @@ -56,8 +37,10 @@ import mage.target.TargetCard; import mage.target.common.TargetCardInLibrary; import mage.util.Copyable; +import java.io.Serializable; +import java.util.*; + /** - * * @author BetaSteward_at_googlemail.com */ public interface Player extends MageItem, Copyable { @@ -91,8 +74,7 @@ public interface Player extends MageItem, Copyable { void setLife(int life, Game game, UUID sourceId); /** - * - * @param amount amount of life loss + * @param amount amount of life loss * @param game * @param atCombat was the source combat damage * @return @@ -289,7 +271,7 @@ public interface Player extends MageItem, Copyable { /** * Returns false in case player don't control the game. - * + *

* Note: For effects like "You control target player during that player's * next turn". * @@ -299,7 +281,7 @@ public interface Player extends MageItem, Copyable { /** * Returns false in case you don't control the game. - * + *

* Note: For effects like "You control target player during that player's * next turn". * @@ -360,11 +342,10 @@ public interface Player extends MageItem, Copyable { boolean searchLibrary(TargetCardInLibrary target, Game game, UUID targetPlayerId); /** - * * @param target * @param game * @param targetPlayerId player whose library will be searched - * @param triggerEvents whether searching will trigger any game events + * @param triggerEvents whether searching will trigger any game events * @return true if search was successful */ boolean searchLibrary(TargetCardInLibrary target, Game game, UUID targetPlayerId, boolean triggerEvents); @@ -374,23 +355,22 @@ public interface Player extends MageItem, Copyable { /** * Plays a card if possible * - * @param card the card that can be cast + * @param card the card that can be cast * @param game - * @param noMana if it's a spell i can be cast without paying mana + * @param noMana if it's a spell i can be cast without paying mana * @param ignoreTiming if it's cast during the resolution of another spell - * no sorcery or play land timing restriction are checked. For a land it has - * to be the turn of the player playing that card. + * no sorcery or play land timing restriction are checked. For a land it has + * to be the turn of the player playing that card. * @return */ boolean playCard(Card card, Game game, boolean noMana, boolean ignoreTiming, MageObjectReference reference); /** - * - * @param card the land card to play + * @param card the land card to play * @param game * @param ignoreTiming false - it won't be checked if the stack is empty and - * you are able to play a Sorcery. It's still checked, if you are able to - * play a land concerning the numner of lands you already played. + * you are able to play a Sorcery. It's still checked, if you are able to + * play a land concerning the numner of lands you already played. * @return */ boolean playLand(Card card, Game game, boolean ignoreTiming); @@ -536,15 +516,17 @@ public interface Player extends MageItem, Copyable { /** * Moves the cards from cards to the bottom of the players library. * - * @param cards - list of cards that have to be moved - * @param game - game + * @param cards - list of cards that have to be moved + * @param game - game * @param anyOrder - true if player can determine the order of the cards - * else random order - * @param source - source ability + * else random order + * @param source - source ability * @return */ boolean putCardsOnBottomOfLibrary(Cards cards, Game game, Ability source, boolean anyOrder); + boolean putCardsOnBottomOfLibrary(Card card, Game game, Ability source, boolean anyOrder); + /** * Moves the card to the top x position of the library * @@ -559,10 +541,10 @@ public interface Player extends MageItem, Copyable { /** * Moves the cards from cards to the top of players library. * - * @param cards - list of cards that have to be moved - * @param game - game + * @param cards - list of cards that have to be moved + * @param game - game * @param anyOrder - true if player can determine the order of the cards - * @param source - source ability + * @param source - source ability * @return */ boolean putCardsOnTopOfLibrary(Cards cards, Game game, Ability source, boolean anyOrder); @@ -588,8 +570,8 @@ public interface Player extends MageItem, Copyable { /** * Choose the order in which blockers get damage assigned to * - * @param blockers list of blockers where to choose the next one from - * @param combatGroup the concerning combat group + * @param blockers list of blockers where to choose the next one from + * @param combatGroup the concerning combat group * @param blockerOrder the already set order of blockers * @param game * @return blocker next to add to the blocker order @@ -728,11 +710,11 @@ public interface Player extends MageItem, Copyable { * @param toZone * @param source * @param game - * @param tapped the cards are tapped on the battlefield - * @param faceDown the cards are face down in the to zone - * @param byOwner the card is moved (or put onto battlefield) by the owner - * of the card and if target zone is battlefield controls the permanent - * (instead of the controller of the source) + * @param tapped the cards are tapped on the battlefield + * @param faceDown the cards are face down in the to zone + * @param byOwner the card is moved (or put onto battlefield) by the owner + * of the card and if target zone is battlefield controls the permanent + * (instead of the controller of the source) * @param appliedEffects * @return */ @@ -759,7 +741,6 @@ public interface Player extends MageItem, Copyable { * @param game * @param withName show the card name in the log * @return - * */ boolean moveCardToHandWithInfo(Card card, UUID sourceId, Game game, boolean withName); @@ -769,7 +750,7 @@ public interface Player extends MageItem, Copyable { * list of applied effects is not saved * * @param card - * @param exileId exile zone id (optional) + * @param exileId exile zone id (optional) * @param exileName name of exile zone (optional) * @param sourceId * @param game @@ -811,7 +792,7 @@ public interface Player extends MageItem, Copyable { * @param sourceId * @param game * @param fromZone if null, this info isn't postet - * @param toTop to the top of the library else to the bottom + * @param toTop to the top of the library else to the bottom * @param withName show the card name in the log * @return */ @@ -836,10 +817,10 @@ public interface Player extends MageItem, Copyable { * without mana (null) or the mana set to manaCosts instead of its normal * mana costs. * - * @param sourceId the source that can be cast without mana + * @param sourceId the source that can be cast without mana * @param manaCosts alternate ManaCost, null if it can be cast without mana - * cost - * @param costs alternate other costs you need to pay + * cost + * @param costs alternate other costs you need to pay */ void setCastSourceIdWithAlternateMana(UUID sourceId, ManaCosts manaCosts, Costs costs); diff --git a/Mage/src/main/java/mage/players/PlayerImpl.java b/Mage/src/main/java/mage/players/PlayerImpl.java index bfc87919f69..2659dfd1450 100644 --- a/Mage/src/main/java/mage/players/PlayerImpl.java +++ b/Mage/src/main/java/mage/players/PlayerImpl.java @@ -31,11 +31,6 @@ import mage.cards.SplitCard; import mage.cards.decks.Deck; import mage.choices.ChoiceImpl; import mage.constants.*; -import static mage.constants.Zone.BATTLEFIELD; -import static mage.constants.Zone.EXILED; -import static mage.constants.Zone.GRAVEYARD; -import static mage.constants.Zone.HAND; -import static mage.constants.Zone.LIBRARY; import mage.counters.Counter; import mage.counters.CounterType; import mage.counters.Counters; @@ -878,6 +873,11 @@ public abstract class PlayerImpl implements Player, Serializable { return true; } + @Override + public boolean putCardsOnBottomOfLibrary(Card card, Game game, Ability source, boolean anyOrder) { + return putCardsOnBottomOfLibrary(new CardsImpl(card), game, source, anyOrder); + } + @Override public boolean putCardsOnBottomOfLibrary(Cards cardsToLibrary, Game game, Ability source, boolean anyOrder) { if (!cardsToLibrary.isEmpty()) { @@ -2926,7 +2926,7 @@ public abstract class PlayerImpl implements Player, Serializable { } private void getPlayableFromGraveyardCard(Game game, Card card, Abilities candidateAbilities, ManaOptions availableMana, List output) { - MageObjectReference permittingObject = game.getContinuousEffects().asThough(card.getId(), AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, null, this.getId(), game); + MageObjectReference permittingObject = game.getContinuousEffects().asThough(card.getId(), AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, card.getSpellAbility(), this.getId(), game); for (ActivatedAbility ability : candidateAbilities.getActivatedAbilities(Zone.ALL)) { boolean possible = false; if (ability.getZone().match(Zone.GRAVEYARD)) { @@ -3032,7 +3032,7 @@ public abstract class PlayerImpl implements Player, Serializable { if (player != null) { if (/*player.isTopCardRevealed() &&*/player.getLibrary().hasCards()) { Card card = player.getLibrary().getFromTop(game); - if (null != game.getContinuousEffects().asThough(card.getId(), AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, null, getId(), game)) { + if (null != game.getContinuousEffects().asThough(card.getId(), AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, card.getSpellAbility(), getId(), game)) { for (ActivatedAbility ability : card.getAbilities().getActivatedAbilities(Zone.HAND)) { if (ability instanceof SpellAbility || ability instanceof PlayLandAbility) { playable.add(ability); diff --git a/Mage/src/main/java/mage/target/TargetPlayer.java b/Mage/src/main/java/mage/target/TargetPlayer.java index 53a33ab2a93..7b2d0bdf775 100644 --- a/Mage/src/main/java/mage/target/TargetPlayer.java +++ b/Mage/src/main/java/mage/target/TargetPlayer.java @@ -1,16 +1,14 @@ - package mage.target; +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; import mage.filter.FilterPlayer; import mage.game.Game; import mage.players.Player; -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; - /** * * @author BetaSteward_at_googlemail.com diff --git a/Mage/src/main/java/mage/target/targetadjustment/TargetAdjuster.java b/Mage/src/main/java/mage/target/targetadjustment/TargetAdjuster.java new file mode 100644 index 00000000000..d3e84a8e9f0 --- /dev/null +++ b/Mage/src/main/java/mage/target/targetadjustment/TargetAdjuster.java @@ -0,0 +1,13 @@ +package mage.target.targetadjustment; + +import mage.abilities.Ability; +import mage.game.Game; + +/** + * + * @author TheElk801 + */ +public interface TargetAdjuster { + + void adjustTargets(Ability ability, Game game); +} diff --git a/Mage/src/main/java/mage/target/targetadjustment/VerseCounterAdjuster.java b/Mage/src/main/java/mage/target/targetadjustment/VerseCounterAdjuster.java new file mode 100644 index 00000000000..35d14577853 --- /dev/null +++ b/Mage/src/main/java/mage/target/targetadjustment/VerseCounterAdjuster.java @@ -0,0 +1,27 @@ +package mage.target.targetadjustment; + +import mage.abilities.Ability; +import mage.counters.CounterType; +import mage.filter.FilterPermanent; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.TargetPermanent; + +/** + * + * @author TheElk801 + */ +public enum VerseCounterAdjuster implements TargetAdjuster { + instance; + + @Override + public void adjustTargets(Ability ability, Game game) { + Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(ability.getSourceId()); + if (sourcePermanent != null) { + int xValue = sourcePermanent.getCounters(game).getCount(CounterType.VERSE); + FilterPermanent permanentFilter = ((TargetPermanent) ability.getTargets().get(0)).getFilter(); + ability.getTargets().clear(); + ability.addTarget(new TargetPermanent(0, xValue, permanentFilter, false)); + } + } +} diff --git a/Mage/src/main/java/mage/target/targetadjustment/XCMCGraveyardAdjuster.java b/Mage/src/main/java/mage/target/targetadjustment/XCMCGraveyardAdjuster.java new file mode 100644 index 00000000000..617da884a1c --- /dev/null +++ b/Mage/src/main/java/mage/target/targetadjustment/XCMCGraveyardAdjuster.java @@ -0,0 +1,27 @@ +package mage.target.targetadjustment; + +import mage.abilities.Ability; +import mage.constants.ComparisonType; +import mage.filter.FilterCard; +import mage.filter.predicate.mageobject.ConvertedManaCostPredicate; +import mage.game.Game; +import mage.target.TargetCard; +import mage.target.common.TargetCardInGraveyard; + +/** + * + * @author TheElk801 + */ +public enum XCMCGraveyardAdjuster implements TargetAdjuster { + instance; + + @Override + public void adjustTargets(Ability ability, Game game) { + int xValue = ability.getManaCostsToPay().getX(); + FilterCard filterCard = ((TargetCard) ability.getTargets().get(0)).getFilter().copy(); + filterCard.add(new ConvertedManaCostPredicate(ComparisonType.EQUAL_TO, xValue)); + filterCard.setMessage(filterCard.getMessage().replace('X', (char) xValue)); + ability.getTargets().clear(); + ability.getTargets().add(new TargetCardInGraveyard(filterCard)); + } +} diff --git a/Mage/src/main/java/mage/target/targetadjustment/XCMCPermanentAdjuster.java b/Mage/src/main/java/mage/target/targetadjustment/XCMCPermanentAdjuster.java new file mode 100644 index 00000000000..bc6b2b57717 --- /dev/null +++ b/Mage/src/main/java/mage/target/targetadjustment/XCMCPermanentAdjuster.java @@ -0,0 +1,28 @@ +package mage.target.targetadjustment; + +import mage.abilities.Ability; +import mage.constants.ComparisonType; +import mage.filter.FilterPermanent; +import mage.filter.predicate.mageobject.ConvertedManaCostPredicate; +import mage.game.Game; +import mage.target.TargetPermanent; + +/** + * + * @author TheElk801 + */ +public enum XCMCPermanentAdjuster implements TargetAdjuster { + instance; + + @Override + public void adjustTargets(Ability ability, Game game) { + int xValue = ability.getManaCostsToPay().getX(); + TargetPermanent oldTargetPermanent = (TargetPermanent) ability.getTargets().get(0); + int minTargets = oldTargetPermanent.getMinNumberOfTargets(); + int maxTargets = oldTargetPermanent.getMaxNumberOfTargets(); + FilterPermanent permanentFilter = oldTargetPermanent.getFilter().copy(); + permanentFilter.add(new ConvertedManaCostPredicate(ComparisonType.EQUAL_TO, xValue)); + ability.getTargets().clear(); + ability.getTargets().add(new TargetPermanent(minTargets, maxTargets, permanentFilter, false)); + } +} diff --git a/Mage/src/main/java/mage/target/targetadjustment/XTargetsAdjuster.java b/Mage/src/main/java/mage/target/targetadjustment/XTargetsAdjuster.java new file mode 100644 index 00000000000..c95f3fbbe22 --- /dev/null +++ b/Mage/src/main/java/mage/target/targetadjustment/XTargetsAdjuster.java @@ -0,0 +1,22 @@ +package mage.target.targetadjustment; + +import mage.abilities.Ability; +import mage.filter.FilterPermanent; +import mage.game.Game; +import mage.target.TargetPermanent; + +/** + * + * @author TheElk801 + */ +public enum XTargetsAdjuster implements TargetAdjuster { + instance; + + @Override + public void adjustTargets(Ability ability, Game game) { + int xValue = ability.getManaCostsToPay().getX(); + FilterPermanent permanentFilter = ((TargetPermanent) ability.getTargets().get(0)).getFilter(); + ability.getTargets().clear(); + ability.addTarget(new TargetPermanent(xValue, permanentFilter)); + } +} diff --git a/Mage/src/main/java/mage/target/targetpointer/FixedTarget.java b/Mage/src/main/java/mage/target/targetpointer/FixedTarget.java index c931962322d..c8a14e5c270 100644 --- a/Mage/src/main/java/mage/target/targetpointer/FixedTarget.java +++ b/Mage/src/main/java/mage/target/targetpointer/FixedTarget.java @@ -21,6 +21,12 @@ public class FixedTarget implements TargetPointer { this.initialized = false; } + public FixedTarget(Card card, Game game) { + this.targetId = card.getId(); + this.zoneChangeCounter = card.getZoneChangeCounter(game); + this.initialized = true; + } + public FixedTarget(Permanent permanent, Game game) { this.targetId = permanent.getId(); this.zoneChangeCounter = permanent.getZoneChangeCounter(game); diff --git a/Mage/src/main/java/mage/watchers/common/PermanentsEnteredBattlefieldWatcher.java b/Mage/src/main/java/mage/watchers/common/PermanentsEnteredBattlefieldWatcher.java index 7fdefbe7cba..870daa230fa 100644 --- a/Mage/src/main/java/mage/watchers/common/PermanentsEnteredBattlefieldWatcher.java +++ b/Mage/src/main/java/mage/watchers/common/PermanentsEnteredBattlefieldWatcher.java @@ -71,7 +71,7 @@ public class PermanentsEnteredBattlefieldWatcher extends Watcher { return enteringBattlefield.get(playerId); } - public boolean AnotherCreatureEnteredBattlefieldUnderPlayersControlLastTurn(Permanent sourcePermanent, Game game) { + public boolean anotherCreatureEnteredBattlefieldUnderPlayersControlLastTurn(Permanent sourcePermanent, Game game) { if (enteringBattlefieldLastTurn.containsKey(sourcePermanent.getControllerId())) { for (Permanent permanent : enteringBattlefieldLastTurn.get(sourcePermanent.getControllerId())) { if (!permanent.getId().equals(sourcePermanent.getId()) diff --git a/Utils/cardClass.tmpl b/Utils/cardClass.tmpl index d7351b9c033..cfad53cb344 100644 --- a/Utils/cardClass.tmpl +++ b/Utils/cardClass.tmpl @@ -3,7 +3,7 @@ package mage.cards.[=$cardNameFirstLetter=]; import java.util.UUID;[= if ($power || $power eq 0) { if ($planeswalker eq 'true') { - $OUT .= "\nimport mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility;" + $OUT .= "\nimport mage.abilities.common.PlaneswalkerEntersWithLoyalityCountersAbility;" }else { $OUT .= "\nimport mage.MageInt;" } diff --git a/Utils/known-sets.txt b/Utils/known-sets.txt index 91756f8ea8b..8930efa5479 100644 --- a/Utils/known-sets.txt +++ b/Utils/known-sets.txt @@ -20,12 +20,12 @@ Chronicles|Chronicles| Clash Pack|ClashPack| Classic Sixth Edition|ClassicSixthEdition| Coldsnap|Coldsnap| -Commander 2013 Edition|Commander2013| -Commander 2014 Edition|Commander2014| -Commander 2015 Edition|Commander2015| -Commander 2016 Edition|Commander2016| -Commander 2017 Edition|Commander2017| -Commander 2018|Commander2018| +Commander 2013 Edition|Commander2013Edition| +Commander 2014 Edition|Commander2014Edition| +Commander 2015 Edition|Commander2015Edition| +Commander 2016 Edition|Commander2016Edition| +Commander 2017 Edition|Commander2017Edition| +Commander 2018|Commander2018Edition| Commander Anthology|CommanderAnthology| Commander Anthology 2018|CommanderAnthology2018| Commander's Arsenal|CommandersArsenal| @@ -38,30 +38,30 @@ Dissension|Dissension| Dominaria|Dominaria| Dragon's Maze|DragonsMaze| Dragons of Tarkir|DragonsOfTarkir| -Duel Decks: Ajani vs. Nicol Bolas|AjaniVsNicolBolas| -Duel Decks: Anthology, Divine vs. Demonic|AnthologyDivineVsDemonic| -Duel Decks: Anthology, Elves vs. Goblins|AnthologyElvesVsGoblins| -Duel Decks: Anthology, Garruk vs. Liliana|AnthologyGarrukVsLiliana| -Duel Decks: Anthology, Jace vs. Chandra|AnthologyJaceVsChandra| -Duel Decks: Blessed vs. Cursed|BlessedVsCursed| -Duel Decks: Divine vs. Demonic|DivineVsDemonic| -Duel Decks: Elspeth vs. Kiora|ElspethVsKiora| -Duel Decks: Elspeth vs. Tezzeret|ElspethVsTezzeret| -Duel Decks: Elves vs. Goblins|ElvesVsGoblins| -Duel Decks: Garruk vs. Liliana|GarrukVsLiliana| -Duel Decks: Heroes vs. Monsters|HeroesVsMonsters| -Duel Decks: Izzet vs. Golgari|IzzetVsGolgari| -Duel Decks: Jace vs. Chandra|JaceVsChandra| -Duel Decks: Jace vs. Vraska|JaceVsVraska| -Duel Decks: Knights vs. Dragons|KnightsVsDragons| -Duel Decks: Merfolk vs. Goblins|MerfolkVsGoblins| -Duel Decks: Mind vs. Might|MindVsMight| -Duel Decks: Nissa vs. Ob Nixilis|NissaVsObNixilis| -Duel Decks: Phyrexia vs. the Coalition|PhyrexiaVsTheCoalition| -Duel Decks: Sorin vs. Tibalt|SorinVsTibalt| -Duel Decks: Speed vs. Cunning|SpeedVsCunning| -Duel Decks: Venser vs. Koth|VenserVsKoth| -Duel Decks: Zendikar vs. Eldrazi|ZendikarVsEldrazi| +Duel Decks: Ajani vs. Nicol Bolas|DuelDecksAjaniVsNicolBolas| +Duel Decks: Anthology, Divine vs. Demonic|DuelDecksAnthologyDivineVsDemonic| +Duel Decks: Anthology, Elves vs. Goblins|DuelDecksAnthologyElvesVsGoblins| +Duel Decks: Anthology, Garruk vs. Liliana|DuelDecksAnthologyGarrukVsLiliana| +Duel Decks: Anthology, Jace vs. Chandra|DuelDecksAnthologyJaceVsChandra| +Duel Decks: Blessed vs. Cursed|DuelDecksBlessedVsCursed| +Duel Decks: Divine vs. Demonic|DuelDecksDivineVsDemonic| +Duel Decks: Elspeth vs. Kiora|DuelDecksElspethVsKiora| +Duel Decks: Elspeth vs. Tezzeret|DuelDecksElspethVsTezzeret| +Duel Decks: Elves vs. Goblins|DuelDecksElvesVsGoblins| +Duel Decks: Garruk vs. Liliana|DuelDecksGarrukVsLiliana| +Duel Decks: Heroes vs. Monsters|DuelDecksHeroesVsMonsters| +Duel Decks: Izzet vs. Golgari|DuelDecksIzzetVsGolgari| +Duel Decks: Jace vs. Chandra|DuelDecksJaceVsChandra| +Duel Decks: Jace vs. Vraska|DuelDecksJaceVsVraska| +Duel Decks: Knights vs. Dragons|DuelDecksKnightsVsDragons| +Duel Decks: Merfolk vs. Goblins|DuelDecksMerfolkVsGoblins| +Duel Decks: Mind vs. Might|DuelDecksMindVsMight| +Duel Decks: Nissa vs. Ob Nixilis|DuelDecksNissaVsObNixilis| +Duel Decks: Phyrexia vs. the Coalition|DuelDecksPhyrexiaVsTheCoalition| +Duel Decks: Sorin vs. Tibalt|DuelDecksSorinVsTibalt| +Duel Decks: Speed vs. Cunning|DuelDecksSpeedVsCunning| +Duel Decks: Venser vs. Koth|DuelDecksVenserVsKoth| +Duel Decks: Zendikar vs. Eldrazi|DuelDecksZendikarVsEldrazi| Duels of the Planeswalkers|DuelsOfThePlaneswalkers| Eighth Edition|EighthEdition| Eldritch Moon|EldritchMoon| @@ -76,26 +76,26 @@ Fifth Dawn|FifthDawn| Fifth Edition|FifthEdition| Fourth Edition|FourthEdition| Friday Night Magic|FridayNightMagic| -From the Vault: Angels|FTVAngels| -From the Vault: Annihilation|FTVAnnihilation| -From the Vault: Dragons|FTVDragons| -From the Vault: Exiled|FTVExiled| -From the Vault: Legends|FTVLegends| -From the Vault: Lore|FTVLore| -From the Vault: Realms|FTVRealms| -From the Vault: Relics|FTVRelics| -From the Vault: Transform|FTVTransform| -From the Vault: Twenty|FTVTwenty| +From the Vault: Angels|FromTheVaultAngels| +From the Vault: Annihilation|FromTheVaultAnnihilation| +From the Vault: Dragons|FromTheVaultDragons| +From the Vault: Exiled|FromTheVaultExiled| +From the Vault: Legends|FromTheVaultLegends| +From the Vault: Lore|FromTheVaultLore| +From the Vault: Realms|FromTheVaultRealms| +From the Vault: Relics|FromTheVaultRelics| +From the Vault: Transform|FromTheVaultTransform| +From the Vault: Twenty|FromTheVaultTwenty| Future Sight|FutureSight| Game Day|GameDay| Gatecrash|Gatecrash| -Global Series: Jiang Yanggu & Mu Yanling|JiangYangguMuYanling| -Grand Prix|GrandPrix| +Global Series: Jiang Yanggu & Mu Yanling|GlobalSeriesJiangYangguAndMuYanling| +Grand Prix|GrandPrixPromos| Guildpact|Guildpact| Guilds of Ravnica|GuildsOfRavnica| Guru|Guru| Happy Holidays|HappyHolidays| -HASCON Promo 2017|HasconPromo2017| +HASCON Promo 2017|HASCONPromo2017| Heroes of the Realm|HeroesOfTheRealm| Homelands|Homelands| Hour of Devastation|HourOfDevastation| @@ -149,15 +149,15 @@ Odyssey|Odyssey| Onslaught|Onslaught| Planar Chaos|PlanarChaos| Planechase|Planechase| -Planechase 2012 Edition|Planechase2012| +Planechase 2012 Edition|Planechase2012Edition| Planechase Anthology|PlanechaseAnthology| Planeshift|Planeshift| Portal|Portal| Portal Second Age|PortalSecondAge| Portal Three Kingdoms|PortalThreeKingdoms| -Premium Deck Series: Graveborn|PDSGraveborn| -Premium Deck Series: Fire and Lightning|PDSFireAndLightning| -Premium Deck Series: Slivers|PDSSlivers| +Premium Deck Series: Graveborn|PremiumDeckSeriesGraveborn| +Premium Deck Series: Fire and Lightning|PremiumDeckSeriesFireAndLightning| +Premium Deck Series: Slivers|PremiumDeckSeriesSlivers| Prerelease Events|PrereleaseEvents| Prophecy|Prophecy| Ravnica: City of Guilds|RavnicaCityOfGuilds| @@ -200,6 +200,6 @@ Welcome Deck 2016|WelcomeDeck2016| Welcome Deck 2017|WelcomeDeck2017| World Magic Cup Qualifier|WorldMagicCupQualifier| Worldwake|Worldwake| -WPN Gateway|WPNGateway| +WPN Gateway|WPNAndGatewayPromos| Zendikar|Zendikar| -Zendikar Expeditions|ZendikarExpeditions| +Zendikar Expeditions|ZendikarExpeditions| \ No newline at end of file diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index baaac838bf9..4859b6ceed0 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -34324,7 +34324,7 @@ Righteous Blow|Guilds of Ravnica|23|C|{W}|Instant|||Righteous Blow deals 2 damag Roc Charger|Guilds of Ravnica|24|U|{2}{W}|Creature - Bird|1|3|Flying$Whenever Roc Charger attacks, target attacking creature without flying gains flying until end of turn.| Skyline Scout|Guilds of Ravnica|25|C|{1}{W}|Creature - Human Scout|2|1|Whenever Skyline Scout attacks, you may pay {1}{W}. If you do, it gains flying until end of turn.| Sunhome Stalwart|Guilds of Ravnica|26|U|{1}{W}|Creature - Human Soldier|2|2|First strike$Mentor| -Sworn Companions|Guilds of Ravnica|27|C|{2}{W}|Sorcery|||Creature two 1/1 white Soldier creature tokens with lifelink.| +Sworn Companions|Guilds of Ravnica|27|C|{2}{W}|Sorcery|||Create two 1/1 white Soldier creature tokens with lifelink.| Take Heart|Guilds of Ravnica|28|C|{W}|Instant|||Target creature gets +2/+2 until end of turn. You gain 1 life for each attacking creature you control.| Tenth District Guard|Guilds of Ravnica|29|C|{1}{W}|Creature - Human Soldier|2|2|When Tenth District Guard enters the battlefield, target creature gets +0/+1 until end of turn.| Venerated Loxodon|Guilds of Ravnica|30|R|{4}{W}|Creature - Elephant Cleric|4|4|Convoke$When Venerated Loxodon enters the battlefield, put a +1/+1 counter on each creature that convoked it.| @@ -34336,10 +34336,10 @@ Devious Cover-up|Guilds of Ravnica|35|C|{2}{U}{U}|Instant|||Counter target spell Dimir Informant|Guilds of Ravnica|36|C|{2}{U}|Creature - Human Rogue|1|4|When Dimir Informant enters the battlefield, surveil 2.| Disdainful Stroke|Guilds of Ravnica|37|C|{1}{U}|Instant|||Counter target spell with converted mana cost 4 or greater.| Dream Eater|Guilds of Ravnica|38|M|{4}{U}{U}|Creature - Nightmare Sphinx|4|3|Flash$Flying$When Dream Eater enters the battlefield, surveil 4. When you do, you may return target nonland permanent an opponent controls to its owner's hand.| -Drowned Secrets|Guilds of Ravnica|39|R|{1}{U}|Enchantment|||Whenever you cast a blue spell, target player puts the top two cards if their library into their graveyard.| +Drowned Secrets|Guilds of Ravnica|39|R|{1}{U}|Enchantment|||Whenever you cast a blue spell, target player puts the top two cards of their library into their graveyard.| Enhanced Surveillance|Guilds of Ravnica|40|U|{1}{U}|Enchantment|||You may look at an additional two cards each time you surveil.$Exile Enhanced Surveillance: Shuffle your graveyard into your library.| Guild Summit|Guilds of Ravnica|41|U|{2}{U}|Enchantment|||When Guild Summit enters the battlefield, you may tap any number of untapped Gates you control. Draw a card for each Gate tapped this way.$Whenever a Gate enters the battlefield under your control, draw a card.| -Leapfrog|Guilds of Ravnica|42|C|{2}{U}|Creature - Frog|3|1|Leapfrog has flying as long as you've cast and instant or sorcery spell this turn.| +Leapfrog|Guilds of Ravnica|42|C|{2}{U}|Creature - Frog|3|1|Leapfrog has flying as long as you've cast an instant or sorcery spell this turn.| Maximize Altitude|Guilds of Ravnica|43|C|{U}|Sorcery|||Target creature gets +1/+1 and gains flying until end of turn.$Jump-start| Mission Briefing|Guilds of Ravnica|44|R|{U}{U}|Instant|||Surveil 2, then choose an instant or sorcery card in your graveyard. You may cast that card this turn. If that card would be put into your graveyard this turn, exile it instead.| Murmuring Mystic|Guilds of Ravnica|45|U|{3}{U}|Creature - Human Wizard|1|5|Whenever you cast an instant or sorcery spell, create a 1/1 blue Bird Illusion creature token with flying.| @@ -34378,21 +34378,21 @@ Midnight Reaper|Guilds of Ravnica|77|R|{2}{B}|Creature - Zombie Knight|3|2|Whene Moodmark Painter|Guilds of Ravnica|78|C|{2}{B}{B}|Creature - Human Shaman|2|3|Undergrowth — When Moodmark Painter enters the battlefield, target creature gains menace and gets +X/+0 until end of turn, where X is the number of creature cards in your graveyard.| Necrotic Wound|Guilds of Ravnica|79|U|{B}|Instant|||Undergrowth — Target creature gets -X/-X until end of turn, where X is the number of creature cards in your graveyard. If that creature would die this turn, exile it instead.| Never Happened|Guilds of Ravnica|80|C|{2}{B}|Sorcery|||Target opponent reveals their hand. You choose a nonland card from that player's graveyard or hand and exile it.| -Pilfering Imp|Guilds of Ravnica|81|U|{B}|Creature - Imp|||Flying${1}{B}, {T}, Sacrifice Pilfering Imp: Target opponent reveals their hand| +Pilfering Imp|Guilds of Ravnica|81|U|{B}|Creature - Imp|1|1|Flying${1}{B}, {T}, Sacrifice Pilfering Imp: Target opponent reveals their hand. You choose a nonland card from it. That player discards that card. Activate this ability only any time you could cast a sorcery.| Plaguecrafter|Guilds of Ravnica|82|U|{2}{B}|Creature - Human Shaman|3|2|When Plaguecrafter enters the battlefield, each player sacrifices a creature or planeswalker. Each player who can't discards a card.| Price of Fame|Guilds of Ravnica|83|U|{3}{B}|Instant|||This spell costs {2} less to cast if it targets a legendary creature.$Destroy target creature.$Surveil 2.| Ritual of Soot|Guilds of Ravnica|84|R|{2}{B}{B}|Sorcery|||Destroy all creatures with converted mana cost 3 or less.| -Severed Strands|Guilds of Ravnica|85|C|{1}{B}|Sorcery|||As an additional cost to cast this spell, sacrifice a creature.$You gain life equal to that sacrificed creature's toughness. Destroy target creature an opponent controls.| +Severed Strands|Guilds of Ravnica|85|C|{1}{B}|Sorcery|||As an additional cost to cast this spell, sacrifice a creature.$You gain life equal to the sacrificed creature's toughness. Destroy target creature an opponent controls.| Spinal Centipede|Guilds of Ravnica|86|C|{2}{B}|Creature - Insect|3|2|When Spinal Centipede dies, put a +1/+1 counter on target creature you control.| Undercity Necrolisk|Guilds of Ravnica|87|U|{3}{B}|Creature - Zombie Lizard|3|3|{1}, Sacrifice another creature: Put a +1/+1 counter on Undercity Necrolisk. It gains menace until end of turn. Activate this ability only any time you could cast a sorcery.| Veiled Shade|Guilds of Ravnica|88|C|{2}{B}|Creature - Shade|2|2|{1}{B}: Veiled Shade gets +1/+1 until end of turn.| -Vicious Rumors|Guilds of Ravnica|89|C|{B}|Sorcery|||Vicious Rumors deals 1 damage to each opponent. Each opponent discards a card, the puts the top card of their library into their graveyard. You gain 1 life.| +Vicious Rumors|Guilds of Ravnica|89|C|{B}|Sorcery|||Vicious Rumors deals 1 damage to each opponent. Each opponent discards a card, then puts the top card of their library into their graveyard. You gain 1 life.| Whispering Snitch|Guilds of Ravnica|90|U|{1}{B}|Creature - Vampire Rogue|1|3|Whenever you surveil for the first time each turn, Whispering Snitch deals 1 damage to each opponent and you gain 1 life.| Arclight Phoenix|Guilds of Ravnica|91|M|{3}{R}|Creature - Phoenix|3|2|Flying, haste$At the beginning of combat on your turn, if you've cast three or more instant and sorcery spells this turn, you may return Arclight Phoenix from your graveyard to the battlefield.| Barging Sergeant|Guilds of Ravnica|92|C|{4}{R}|Creature - Minotaur Soldier|4|2|Haste$Mentor| Book Devourer|Guilds of Ravnica|93|U|{5}{R}|Creature - Beast|4|5|Trample$Whenever Book Devourer deals combat damage to a player, you may discard all the cards in your hand. If you do, draw that many cards.| Command the Storm|Guilds of Ravnica|94|C|{4}{R}|Instant|||Command the Storm deals 5 damage to target creature.| -Cosmotronic Wave|Guilds of Ravnica|95|C|{3}{B}|Sorcery|||Cosmotronic Wave deals 1 damage to each creature your opponents control. Creatures your opponents control can't block this turn.| +Cosmotronic Wave|Guilds of Ravnica|95|C|{3}{R}|Sorcery|||Cosmotronic Wave deals 1 damage to each creature your opponents control. Creatures your opponents control can't block this turn.| Direct Current|Guilds of Ravnica|96|C|{1}{R}{R}|Sorcery|||Direct Current deals 2 damage to any target.$Jump-start| Electrostatic Field|Guilds of Ravnica|97|U|{1}{R}|Creature - Wall|0|4|Defender$When you cast an instant or sorcery spell, Electrostatic Field deals 1 damage to each opponent.| Erratic Cyclops|Guilds of Ravnica|98|R|{3}{R}|Creature - Cyclops Shaman|0|8|Trample$Whenever you cast an instant or sorcery spell, Erratic Cyclops gets +X/+0 until end of turn, where X is that spell's converted mana cost.| @@ -34403,8 +34403,8 @@ Goblin Banneret|Guilds of Ravnica|102|U|{R}|Creature - Goblin Soldier|1|1|Mentor Goblin Cratermaker|Guilds of Ravnica|103|U|{1}{R}|Creature - Goblin Warrior|2|2|{1}, Sacrifice Goblin Cratermaker: Choose one —$• Goblin Cratermaker deals 2 damage to target creature.$• Destroy target colorless nonland permanent.| Goblin Locksmith|Guilds of Ravnica|104|C|{1}{R}|Creature - Goblin Rogue|2|1|Whenever Goblin Locksmith attacks, creatures with defender can't block this turn.| Gravitic Punch|Guilds of Ravnica|105|C|{3}{R}|Sorcery|||Target creature you control deals damage equal to its power to target player.$Jump-start| -Hellkite Whelp|Guilds of Ravnica|106|U|{4}{R}|Creature - Dragon|3|34|Flying$Whenever Hellkite Whelp attacks, it deals 1 damage to target creature defending player controls.| -Inescapable Blaze|Guilds of Ravnica|107|U|{4}{R}{R}|Instant|||This spell can't be countered.$Inescapable Flame deals 6 damage to any target.| +Hellkite Whelp|Guilds of Ravnica|106|U|{4}{R}|Creature - Dragon|3|3|Flying$Whenever Hellkite Whelp attacks, it deals 1 damage to target creature defending player controls.| +Inescapable Blaze|Guilds of Ravnica|107|U|{4}{R}{R}|Instant|||This spell can't be countered.$Inescapable Blaze deals 6 damage to any target.| Lava Coil|Guilds of Ravnica|108|U|{1}{R}|Sorcery|||Lava Coil deals 4 damage to target creature. If that creature would die this turn, exile it instead.| Legion Warboss|Guilds of Ravnica|109|R|{2}{R}|Creature - Goblin Soldier|2|2|Mentor$At the beginning of combat on your turn, create a 1/1 red Goblin creature token. That token gains haste until end of turn and attacks this combat if able.| Maniacal Rage|Guilds of Ravnica|110|C|{1}{R}|Enchantment - Aura|||Enchant creature$Enchanted creature gets +2/+2 and can't block.| @@ -34413,7 +34413,7 @@ Ornery Goblin|Guilds of Ravnica|112|C|{1}{R}|Creature - Goblin Warrior|2|1|Whene Risk Factor|Guilds of Ravnica|113|R|{2}{R}|Instant|||Target opponent may have Risk Factor deal 4 damage to them. If that player doesn't, you draw three cards.$Jump-start| Rubblebelt Boar|Guilds of Ravnica|114|C|{3}{R}|Creature - Boar|3|3|When Rubblebelt Boar enters the battlefield, target creature gets +2/+0 until end of turn.| Runaway Steam-Kin|Guilds of Ravnica|115|R|{1}{R}|Creature - Elemental|1|1|Whenever you cast a red spell, if Runaway Steam-Kin has fewer than three +1/+1 counters on it, put a +1/+1 counter on Runaway Steam-Kin.$Remove three +1/+1 counters from Runaway Steam-Kin: Add {R}{R}{R}.| -Smelt-War Minotaur|Guilds of Ravnica|116|U|{2}{R}|Creature - Minotaur Warrior|2|3|Whenever you cast an instant or sorcery spell, target creature an opponent controls can't block this turn.| +Smelt-Ward Minotaur|Guilds of Ravnica|116|U|{2}{R}|Creature - Minotaur Warrior|2|3|Whenever you cast an instant or sorcery spell, target creature an opponent controls can't block this turn.| Street Riot|Guilds of Ravnica|117|U|{4}{R}|Enchantment|||As long as it's your turn, creatures you control get +1/+0 and have trample.| Sure Strike|Guilds of Ravnica|118|C|{1}{R}|Instant|||Target creature gets +3/+0 and gains first strike until end of turn.| Torch Courier|Guilds of Ravnica|119|C|{R}|Creature - Goblin|1|1|Haste$Sacrifice Torch Courier: Another target creature gains haste until end of turn.| @@ -34437,28 +34437,28 @@ Kraul Harpooner|Guilds of Ravnica|136|U|{1}{G}|Creature - Insect Warrior|3|2|Rea Might of the Masses|Guilds of Ravnica|137|U|{G}|Instant|||Target creature gets +1/+1 until end of turn for each creature you control.| Nullhide Ferox|Guilds of Ravnica|138|M|{2}{G}{G}|Creature - Beast|6|6|Hexproof$You can't cast noncreature spells.${2}: Nullhide Ferox loses all abilities until end of turn. Any player may activate this ability.$If a spell or ability an opponent controls causes you to discard Nullhide Ferox, put it onto the battlefield instead of putting it into your graveyard.| Pack's Favor|Guilds of Ravnica|139|C|{2}{G}|Instant|||Convoke$Target creature gets +3/+3 until end of turn.| -Pause for Reflection|Guilds of Ravnica|140|C|{2}{G}|Instant|||Convoke$Precent all combat damage that would be dealt this turn.| +Pause for Reflection|Guilds of Ravnica|140|C|{2}{G}|Instant|||Convoke$Prevent all combat damage that would be dealt this turn.| Pelt Collector|Guilds of Ravnica|141|R|{G}|Creature - Elf Warrior|1|1|Whenever another creature you control enters the battlefield or dies, if that creature's power is greater than Pelt Collector's, put a +1/+1 counter on Pelt Collector.$As long as Pelt Collector has three or more +1/+1 counters on it, it has trample.| Portcullis Vine|Guilds of Ravnica|142|C|{G}|Creature - Plant Wall|0|3|Defender${2}, {T}, Sacrifice a creature with defender: Draw a card.| Prey Upon|Guilds of Ravnica|143|C|{G}|Sorcery|||Target creature you control fights target creature you don't control.| Siege Wurm|Guilds of Ravnica|144|C|{5}{G}{G}|Creature - Wurm|5|5|Convoke$Trample| Sprouting Renewal|Guilds of Ravnica|145|U|{2}{G}|Sorcery|||Convoke$Choose one —$• Create a 2/2 green and white Elf Knight creature token with vigilance.$• Destroy target artifact or enchantment.| -Urban Utopia|Guilds of Ravnica|146|C|{1}{G}|Enchantment - Aura|||Enchant Land$When Urban Utopia enters the battlefield, draw a card.$Enchanted land has "{T}: Add one mana of any color."| +Urban Utopia|Guilds of Ravnica|146|C|{1}{G}|Enchantment - Aura|||Enchant land$When Urban Utopia enters the battlefield, draw a card.$Enchanted land has "{T}: Add one mana of any color."| Vigorspore Wurm|Guilds of Ravnica|147|C|{5}{G}|Creature - Wurm|6|4|Undergrowth — When Vigorspore Wurm enters the battlefield, target creature gains vigilance and gets +X/+X until end of turn, where X is the number of creature cards in your graveyard.$Vigorspore Wurm can't be blocked by more than one creature.| -Vivid Revival|Guilds of Ravnica|148|R|{4}{G}|Sorcery|||Return up to three target multicolor cards from your graveyard to your hand. Exile Vivid Revival.| +Vivid Revival|Guilds of Ravnica|148|R|{4}{G}|Sorcery|||Return up to three target multicolored cards from your graveyard to your hand. Exile Vivid Revival.| Wary Okapi|Guilds of Ravnica|149|C|{2}{G}|Creature - Antelope|3|2|Vigilance| Wild Ceratok|Guilds of Ravnica|150|C|{3}{G}|Creature - Rhino|4|3|| Artful Takedown|Guilds of Ravnica|151|C|{2}{U}{B}|Instant|||Choose one or both —$• Tap target creature.$• Target creature gets -2/-4 until end of turn.| Assassin's Trophy|Guilds of Ravnica|152|R|{B}{G}|Instant|||Destroy target permanent an opponent controls. Its controller may search their library for a basic land card, put it onto the battlefield, then shuffle their library.| Aurelia, Exemplar of Justice|Guilds of Ravnica|153|M|{2}{R}{W}|Legendary Creature - Angel|2|5|Flying$Mentor$At the beginning of combat on your turn, choose up to one target creature you control. Until end of turn, that creature gets +2/+0, gains trample if it's red, and gains vigilance if it's white.| Beacon Bolt|Guilds of Ravnica|154|U|{1}{U}{R}|Sorcery|||Beacon Bolt deals damage to target creature equal to the total number of instant and sorcery cards you own in exile and in your graveyard.$Jump-start| -Beamsplitter Mage|Guilds of Ravnica|155|U|{U}{R}|Creature - Vedalken Wizard|2|2|Whenever you cast an instant or sorcery that targets only Beamsplitter Mage, if you control one or more creatures that the spell could target, choose one of them. Copy the spell and it targets the chosen creature.| +Beamsplitter Mage|Guilds of Ravnica|155|U|{U}{R}|Creature - Vedalken Wizard|2|2|Whenever you cast an instant or sorcery that targets only Beamsplitter Mage, if you control one or more creatures that spell could target, choose one of those creatures. Copy that spell. The copy targets the chosen creature.| Boros Challenger|Guilds of Ravnica|156|U|{R}{W}|Creature - Human Soldier|2|3|Mentor${2}{R}{W}: Boros Challenger gets +1/+1 until end of turn.| Camaraderie|Guilds of Ravnica|157|R|{4}{G}{W}|Sorcery|||You gain X life and draw X cards, where X is the number of creatures you control. Creatures you control get +1/+1 until end of turn.| Centaur Peacemaker|Guilds of Ravnica|158|C|{1}{G}{W}|Creature - Centaur Cleric|3|3|When Centaur Peacemaker enters the battlefield, each player gains 4 life.| Chance for Glory|Guilds of Ravnica|159|M|{1}{R}{W}|Instant|||Creatures you control gain indestructible. Take an extra turn after this one. At the beginning of that turn's end step, you lose the game.| -Charnel Troll|Guilds of Ravnica|160|R|{1}{B}{G}|Creature - Troll|4|4|Trample$At the beginning of your upkeep, exile a creature card from your graveyard. If you do, put a +1/+1 counter on Charnel Troll. Otherwise sacrifice it.${B}{G}, Discard a creature card: Put a +1/+1 counter on Charnel Troll.| -Conclave Cavalier|Guilds of Ravnica|161|U|{G}{G}{W}{W}|Creature - Centaur Knight|4|4|Vigilance$When Conclave Cavalier dies, create two green and white 2/2 Elf Knight creature tokens with vigilance.| +Charnel Troll|Guilds of Ravnica|160|R|{1}{B}{G}|Creature - Troll|4|4|Trample$At the beginning of your upkeep, exile a creature card from your graveyard. If you do, put a +1/+1 counter on Charnel Troll. Otherwise, sacrifice it.${B}{G}, Discard a creature card: Put a +1/+1 counter on Charnel Troll.| +Conclave Cavalier|Guilds of Ravnica|161|U|{G}{G}{W}{W}|Creature - Centaur Knight|4|4|Vigilance$When Conclave Cavalier dies, create two 2/2 green and white Elf Knight creature tokens with vigilance.| Conclave Guildmage|Guilds of Ravnica|162|U|{G}{W}|Creature - Elf Cleric|2|2|{G}, {T}: Creatures you control gain trample until end of turn.${5}{W}, {T}: Create a 2/2 green and white Elf Knight creature token with vigilance.| Crackling Drake|Guilds of Ravnica|163|U|{U}{U}{R}{R}|Creature - Drake|*|4|Flying$Crackling Drake's power is equal to the total number of instant and sorcery cards you own in exile and in your graveyard.$When Crackling Drake enters the battlefield, draw a card.| Darkblade Agent|Guilds of Ravnica|164|C|{1}{U}{B}|Creature - Human Assassin|2|3|As long as you've surveilled this turn, Darkblade Agent has deathtouch and "Whenever this creature deals combat damage to a player, draw a card."| @@ -34542,7 +34542,7 @@ Boros Locket|Guilds of Ravnica|231|C|{3}|Artifact|||{T}: Add {R} or {W}.${R/W}{R Chamber Sentry|Guilds of Ravnica|232|R|{X}|Artifact Creature - Construct|0|0|Chamber Sentry enters the battlefield with a +1/+1 counter on it for each color of mana spent to cast it.${X}, {T}, Remove X +1/+1 counters from Chamber Sentry: It deals X damage to any target.${W}{U}{B}{R}{G}: Return Chamber Sentry from your graveyard to your hand.| Chromatic Lantern|Guilds of Ravnica|233|R|{3}|Artifact|||Lands you control have "{T}: Add one mana of any color."${T}: Add one mana of any color.| Dimir Locket|Guilds of Ravnica|234|C|{3}|Artifact|||{T}: Add {U} or {B}.${U/B}{U/B}{U/B}{U/B}, {T}, Sacrifice Dimir Locket: Draw two cards.| -Gatekeeper Gargoyle|Guilds of Ravnica|235|U|{6}|Artifact Creature - Gargoyle|3|3|Flying$Gargoyle Guardian enters the battlefield with a +1/+1 counter on it for each Gate you control.| +Gatekeeper Gargoyle|Guilds of Ravnica|235|U|{6}|Artifact Creature - Gargoyle|3|3|Flying$Gatekeeper Gargoyle enters the battlefield with a +1/+1 counter on it for each Gate you control.| Glaive of the Guildpact|Guilds of Ravnica|236|U|{2}|Artifact - Equipment|||Equipped creature gets +1/+0 for each Gate you control and has vigilance and menace.$Equip {3}| Golgari Locket|Guilds of Ravnica|237|C|{3}|Artifact|||{T}: Add {B} or {G}.${B/G}{B/G}{B/G}{B/G}, {T}, Sacrifice Golgari Locket: Draw two cards.| Izzet Locket|Guilds of Ravnica|238|C|{3}|Artifact|||{T}: Add {U} or {R}.${U/R}{U/R}{U/R}{U/R}, {T}, Sacrifice Izzet Locket: Draw two cards.| @@ -34568,9 +34568,11 @@ Swamp|Guilds of Ravnica|262|C||Basic Land - Swamp|||({T}: Add {B}.)| Mountain|Guilds of Ravnica|263|C||Basic Land - Mountain|||({T}: Add {R}.)| Forest|Guilds of Ravnica|264|C||Basic Land - Forest|||({T}: Add {G}.)| Ral, Caller of Storms|Guilds of Ravnica|265|M|{4}{U}{R}|Legendary Planeswalker - Ral|4|+1: Draw a card.$-2: Ral, Caller of Storms deals 3 damage divided as you choose among one, two, or three targets.$-7: Draw seven cards. Ral, Caller of Storms deals 7 damage to each creature your opponents control.| -Ral's Dispersal|Guilds of Ravnica|266|R|{3}{U}{U}|Instant|||Return target creature to its owner's hand. You may search you library and/or graveyard for a card named Ral, Caller of Storms, reveal it, and put it into your hand. If you search your library this way, shuffle it.| +Ral's Dispersal|Guilds of Ravnica|266|R|{3}{U}{U}|Instant|||Return target creature to its owner's hand. You may search your library and/or graveyard for a card named Ral, Caller of Storms, reveal it, and put it into your hand. If you search your library this way, shuffle it.| +Precision Bolt|Guilds of Ravnica|267|C|{2}{R}|Sorcery|||Precision Bolt deals 3 damage to any target.| Ral's Staticaster|Guilds of Ravnica|268|U|{2}{U}{R}|Creature - Viashino Wizard|3|3|Trample$Whenever Ral's Staticaster attacks, if you control a Ral planeswalker, Ral's Staticaster gets +1/+0 for each card in your hand until end of turn.| Vraska, Regal Gorgon|Guilds of Ravnica|269|M|{5}{B}{G}|Legendary Planeswalker - Vraska|5|+2: Put a +1/+1 counter on up to one target creature. That creature gains menace until end of turn.$-3: Destroy target creature.$-10: For each creature card in your graveyard, put a +1/+1 counter on each creature you control.| +Kraul Raider|Guilds of Ravnica|270|C|{2}{B}|Creature - Insect Warrior|2|3|Menace| Attendant of Vraska|Guilds of Ravnica|271|U|{1}{B}{G}|Creature - Zombie Soldier|3|3|When Attendant of Vraska dies, if you control a Vraska planeswalker, you gain life equal to Attendant of Vraska's power.| -Vraska's Stoneglare|Guilds of Ravnica|272|R|{4}{B}{G}|Sorcery|||Destroy target creature. You gain life equal to its toughness. You may search your library and/or graveyard from a card named Vraska, Regal Gorgon, reveal it, and put it into your hand. If you search your library this way, shuffle it.| +Vraska's Stoneglare|Guilds of Ravnica|272|R|{4}{B}{G}|Sorcery|||Destroy target creature. You gain life equal to its toughness. You may search your library and/or graveyard for a card named Vraska, Regal Gorgon, reveal it, and put it into your hand. If you search your library this way, shuffle it.| Impervious Greatwurm|Guilds of Ravnica|273|M|{7}{G}{G}{G}|Creature - Wurm|16|16|Convoke$Indestructible| \ No newline at end of file diff --git a/Utils/mtg-sets-data.txt b/Utils/mtg-sets-data.txt index dde1ea9b8c1..797a5ba7722 100644 --- a/Utils/mtg-sets-data.txt +++ b/Utils/mtg-sets-data.txt @@ -39,6 +39,8 @@ Clash Pack|CLASH| Commander Anthology|CMA| Commander Anthology 2018|CM2| Commander's Arsenal|CM1| +Commander|CMD| +Conspiracy|CNS| Conspiracy: Take the Crown|CN2| Conflux|CON| Champs|CP| @@ -83,6 +85,9 @@ Eldritch Moon|EMN| European Land Program|EURO| Eventide|EVE| Duel Decks: Elves vs. Goblins|EVG| +Duel Decks: Elves vs. Inventors|DDU| +Duels of the Planeswalkers Promos|DPAP| +Pro Tour Promos|PPRO| Exodus|EXO| Zendikar Expeditions|EXP| Fallen Empires|FEM| @@ -153,7 +158,7 @@ Portal Second Age|P02| Planechase 2012 Edition|PC2| Planechase Anthology|PCA| Prophecy|PCY| -Premium Deck Series: Fire & Lightning|PD2| +Premium Deck Series: Fire and Lightning|PD2| Premium Deck Series: Graveborn|PD3| Planar Chaos|PLC| Planeshift|PLS| @@ -211,4 +216,4 @@ Worldwake|WWK| Ixalan|XLN| Zendikar|ZEN| Star Wars|SWS| -Happy Holidays|HHO| +Happy Holidays|HHO| \ No newline at end of file