diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Commander.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Commander.java index b9199751d6e..19bc8619cab 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Commander.java +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Commander.java @@ -1,4 +1,4 @@ - /* +/* * Copyright 2011 BetaSteward_at_googlemail.com. All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Eternal.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Eternal.java index 85094dceb64..5fb0bc28e80 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Eternal.java +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Eternal.java @@ -24,23 +24,30 @@ * The views and conclusions contained in the software and documentation are those of the * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. -*/ - + */ package mage.deck; +import mage.cards.ExpansionSet; +import mage.cards.Sets; import mage.cards.decks.Constructed; +import mage.constants.SetType; /** - * This class implements the new casual format "Eternal", which is legacy with no reserved list cards legal. - * Banlist taken from + * This class implements the new casual format "Eternal", which is legacy with + * no reserved list cards legal. Banlist taken from + * * * @author marthinwurer@gmail.com */ public class Eternal extends Constructed { - public Eternal() { + public Eternal() { super("Constructed - Eternal"); - + for (ExpansionSet set : Sets.getInstance().values()) { + if (set.getSetType() != SetType.CUSTOM_SET) { + setCodes.add(set.getCode()); + } + } banned.add("Abeyance"); banned.add("Aboroth"); banned.add("Academy Rector"); diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Frontier.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Frontier.java index 4c04953bb9a..b50b47453cb 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Frontier.java +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Frontier.java @@ -43,7 +43,7 @@ public class Frontier extends Constructed { public Frontier() { super("Constructed - Frontier"); - Date cutoff = new GregorianCalendar(2014, 7, 18).getTime(); // M15 release date + Date cutoff = new GregorianCalendar(2014, 6, 18).getTime(); // M15 release date for (ExpansionSet set : Sets.getInstance().values()) { if ((set.getReleaseDate().after(cutoff) || set.getReleaseDate().equals(cutoff)) && (set.getSetType() == SetType.CORE || set.getSetType() == SetType.EXPANSION)) { diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Modern.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Modern.java index c4ac0595f1c..270863f5f33 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Modern.java +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Modern.java @@ -43,7 +43,7 @@ public class Modern extends Constructed { public Modern() { super("Constructed - Modern"); - Date cutoff = new GregorianCalendar(2003, 7, 28).getTime(); // Eight edition release date + Date cutoff = new GregorianCalendar(2003, 6, 28).getTime(); // Eight edition release date for (ExpansionSet set : Sets.getInstance().values()) { if ((set.getReleaseDate().after(cutoff) || set.getReleaseDate().equals(cutoff)) && (set.getSetType() == SetType.CORE || set.getSetType() == SetType.EXPANSION)) { diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Pauper.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Pauper.java index 637db8c31d9..755ad626710 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Pauper.java +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Pauper.java @@ -3,23 +3,29 @@ * To change this template file, choose Tools | Templates * and open the template in the editor. */ - package mage.deck; +import mage.cards.ExpansionSet; +import mage.cards.Sets; import mage.cards.decks.Constructed; import mage.constants.Rarity; +import mage.constants.SetType; /** * * @author LevelX2 */ - public class Pauper extends Constructed { + public Pauper() { super("Constructed - Pauper"); //TODO: Add only Magic Online sets for pauper - + for (ExpansionSet set : Sets.getInstance().values()) { + if (set.getSetType() != SetType.CUSTOM_SET) { + setCodes.add(set.getCode()); + } + } rarities.add(Rarity.COMMON); rarities.add(Rarity.LAND); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/flicker/CloudshiftTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/flicker/CloudshiftTest.java index 7eb8817b025..2b9085e3c02 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/flicker/CloudshiftTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/flicker/CloudshiftTest.java @@ -20,8 +20,8 @@ public class CloudshiftTest extends CardTestPlayerBase { /** * Tests that casting Cloudshift makes targeting spell fizzling * - * Cloudshift - * Exile target creature you control, then return that card to the battlefield under your control. + * Cloudshift Exile target creature you control, then return that card to + * the battlefield under your control. */ @Test public void testSpellFizzle() { @@ -43,8 +43,10 @@ public class CloudshiftTest extends CardTestPlayerBase { } /** - * Tests that copy effect is discarded and Clone can enter as a copy of another creature. - * Also tests that copy two creature won't 'collect' abilities, after 'Cloudshift' effect Clone should enter as a copy of another creature. + * Tests that copy effect is discarded and Clone can enter as a copy of + * another creature. Also tests that copy two creature won't 'collect' + * abilities, after 'Cloudshift' effect Clone should enter as a copy of + * another creature. */ @Test public void testCopyEffectDiscarded() { @@ -77,7 +79,7 @@ public class CloudshiftTest extends CardTestPlayerBase { addCard(Zone.BATTLEFIELD, playerA, "Plains", 4); addCard(Zone.BATTLEFIELD, playerA, "Silvercoat Lion"); addCard(Zone.BATTLEFIELD, playerA, "Bonesplitter"); - + // Exile target creature you control, then return that card to the battlefield under your control. addCard(Zone.HAND, playerA, "Cloudshift"); @@ -92,14 +94,14 @@ public class CloudshiftTest extends CardTestPlayerBase { assertLife(playerA, 20); Assert.assertTrue(silvercoatLion.getAttachments().isEmpty()); - Assert.assertTrue("Bonesplitter must not be connected to Silvercoat Lion",bonesplitter.getAttachedTo() == null); - Assert.assertEquals("Silvercoat Lion's power without equipment has to be 2",2, silvercoatLion.getPower().getValue()); - Assert.assertEquals("Silvercoat Lion's toughness has to be 2",2, silvercoatLion.getToughness().getValue()); + Assert.assertTrue("Bonesplitter must not be connected to Silvercoat Lion", bonesplitter.getAttachedTo() == null); + Assert.assertEquals("Silvercoat Lion's power without equipment has to be 2", 2, silvercoatLion.getPower().getValue()); + Assert.assertEquals("Silvercoat Lion's toughness has to be 2", 2, silvercoatLion.getToughness().getValue()); } /** - * Tests that casting Cloudshift makes creature able to block again - * if it before was targeted with can't block effect + * Tests that casting Cloudshift makes creature able to block again if it + * before was targeted with can't block effect * */ @Test @@ -129,7 +131,6 @@ public class CloudshiftTest extends CardTestPlayerBase { assertPermanentCount(playerB, "Fervent Cathar", 0); assertPermanentCount(playerA, "Timberland Guide", 0); - } @Test @@ -146,20 +147,20 @@ public class CloudshiftTest extends CardTestPlayerBase { castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Grizzly Bears"); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Giant Growth", "Grizzly Bears", "you gain life equal to that creature's toughness"); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cloudshift", "Grizzly Bears", null, "you gain life equal to that creature's toughness"); - + setStopAt(1, PhaseStep.POSTCOMBAT_MAIN); - + execute(); - + assertLife(playerA, 27); // 5 from the first with Giant Growth + 2 from the second bear. } - + /* I had a Stoneforge Mystic equipped with a Umesawa's Jitte. I activated Jitte 4 times to make Stoneforge Mystic 9/10. My opponent put into play a Flickerwisp with his Aether Vial and targeted my Stoneforge Mystic. At the end of my turn, Stoneforge Mystic came back as a 9/10, before going down to 1/2 normally once my turn ended. - */ + */ @Test public void testDontApplyEffectToNewInstanceOfPreviousEquipedPermanent() { addCard(Zone.BATTLEFIELD, playerA, "Plains", 4); @@ -168,11 +169,11 @@ public class CloudshiftTest extends CardTestPlayerBase { // Exile target creature you control, then return that card to the battlefield under your control. addCard(Zone.HAND, playerA, "Cloudshift"); - + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Equip {2}", "Silvercoat Lion"); - + attack(3, playerA, "Silvercoat Lion"); - + activateAbility(3, PhaseStep.END_COMBAT, playerA, "Remove a charge counter from {this}: Choose one —
&bull Equipped creature gets"); setModeChoice(playerA, "1"); castSpell(3, PhaseStep.END_COMBAT, playerA, "Cloudshift", "Silvercoat Lion", "Remove a charge counter from"); @@ -186,31 +187,30 @@ public class CloudshiftTest extends CardTestPlayerBase { assertLife(playerA, 20); assertLife(playerB, 18); assertCounterCount("Umezawa's Jitte", CounterType.CHARGE, 1); - assertPermanentCount(playerA,"Silvercoat Lion", 1); - assertGraveyardCount(playerA,"Cloudshift", 1); + assertPermanentCount(playerA, "Silvercoat Lion", 1); + assertGraveyardCount(playerA, "Cloudshift", 1); Assert.assertTrue(silvercoatLion.getAttachments().isEmpty()); - Assert.assertTrue("Umezawa must not be connected to Silvercoat Lion",Umezawa.getAttachedTo() == null); + Assert.assertTrue("Umezawa must not be connected to Silvercoat Lion", Umezawa.getAttachedTo() == null); assertPowerToughness(playerA, "Silvercoat Lion", 2, 2); - + } - + @Test public void testDontApplyEffectToNewInstanceOfPreviousEquipedPermanentFlickerwisp() { addCard(Zone.BATTLEFIELD, playerA, "Plains", 4); addCard(Zone.BATTLEFIELD, playerA, "Silvercoat Lion"); addCard(Zone.BATTLEFIELD, playerA, "Umezawa's Jitte"); - addCard(Zone.BATTLEFIELD, playerB, "Plains", 3); // Flying // When Flickerwisp enters the battlefield, exile another target permanent. Return that // card to the battlefield under its owner's control at the beginning of the next end step. addCard(Zone.HAND, playerB, "Flickerwisp"); - + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Equip {2}", "Silvercoat Lion"); - + attack(3, playerA, "Silvercoat Lion"); - + activateAbility(4, PhaseStep.DRAW, playerA, "Remove a charge counter from {this}: Choose one —
&bull Equipped creature gets"); setModeChoice(playerA, "1"); castSpell(4, PhaseStep.PRECOMBAT_MAIN, playerB, "Flickerwisp"); @@ -225,19 +225,21 @@ public class CloudshiftTest extends CardTestPlayerBase { assertLife(playerA, 20); assertLife(playerB, 18); assertCounterCount("Umezawa's Jitte", CounterType.CHARGE, 1); - assertPermanentCount(playerA,"Silvercoat Lion", 1); - assertPermanentCount(playerB,"Flickerwisp", 1); + assertPermanentCount(playerA, "Silvercoat Lion", 1); + assertPermanentCount(playerB, "Flickerwisp", 1); Assert.assertTrue(silvercoatLion.getAttachments().isEmpty()); - Assert.assertTrue("Umezawa must not be connected to Silvercoat Lion",Umezawa.getAttachedTo() == null); + Assert.assertTrue("Umezawa must not be connected to Silvercoat Lion", Umezawa.getAttachedTo() == null); assertPowerToughness(playerA, "Silvercoat Lion", 2, 2); - + } + /** - * Test that if I cast cloudshift and it goes to the stack and another instant spell exiles the - * target creature as response, cloudshift does not bring back that creature from exile because it's - * a complete other object (400.7). - * 400.7g allows Cloudshift to bring it back only if it was exiled by cloudshift itself. - * + * Test that if I cast cloudshift and it goes to the stack and another + * instant spell exiles the target creature as response, cloudshift does not + * bring back that creature from exile because it's a complete other object + * (400.7). 400.7g allows Cloudshift to bring it back only if it was exiled + * by cloudshift itself. + * */ @Test public void testReturnIfExiledByAnotherSpell() { @@ -245,88 +247,123 @@ public class CloudshiftTest extends CardTestPlayerBase { addCard(Zone.BATTLEFIELD, playerA, "Silvercoat Lion"); addCard(Zone.HAND, playerA, "Cloudshift"); - addCard(Zone.BATTLEFIELD, playerB, "Plains"); // Exile target creature. Its controller gains life equal to its power. addCard(Zone.HAND, playerB, "Swords to Plowshares"); - + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cloudshift", "Silvercoat Lion"); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Swords to Plowshares", "Silvercoat Lion", "Cloudshift"); - + setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); assertGraveyardCount(playerA, "Cloudshift", 1); assertGraveyardCount(playerB, "Swords to Plowshares", 1); - + assertLife(playerA, 22); assertLife(playerB, 20); - - assertPermanentCount(playerA,"Silvercoat Lion", 0); + + assertPermanentCount(playerA, "Silvercoat Lion", 0); assertExileCount("Silvercoat Lion", 1); - - } - + + } + /** - * Test that if a creature returns from cloudshift it returns - * under the control of the controller of Cloudshift. + * Test that if a creature returns from cloudshift it returns under the + * control of the controller of Cloudshift. */ @Test public void testReturnOfOwnerIsAnotherPlayer() { - addCard(Zone.BATTLEFIELD, playerA, "Plains",3); - addCard(Zone.BATTLEFIELD, playerA, "Mountain",3); + addCard(Zone.BATTLEFIELD, playerA, "Plains", 3); + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 3); // Gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn. addCard(Zone.HAND, playerA, "Act of Treason"); - + addCard(Zone.HAND, playerA, "Cloudshift"); - addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion"); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Act of Treason", "Silvercoat Lion"); castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Cloudshift", "Silvercoat Lion"); - + setStopAt(2, PhaseStep.PRECOMBAT_MAIN); execute(); assertGraveyardCount(playerA, "Cloudshift", 1); assertGraveyardCount(playerA, "Act of Treason", 1); - - assertPermanentCount(playerA,"Silvercoat Lion", 1); - assertPermanentCount(playerB,"Silvercoat Lion", 0); - - } - - /** - * Test that if a creature returns from Conjurer's Closet it returns - * under the control of the controller of Conjurer's Closet. + + assertPermanentCount(playerA, "Silvercoat Lion", 1); + assertPermanentCount(playerB, "Silvercoat Lion", 0); + + } + + /** + * Test that if a creature returns from Conjurer's Closet it returns under + * the control of the controller of Conjurer's Closet. */ @Test public void testReturnOfOwnerIsAnotherPlayerConjurersCloset() { - addCard(Zone.BATTLEFIELD, playerA, "Mountain",3); + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 3); // Gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn. addCard(Zone.HAND, playerA, "Act of Treason"); - + // At the beginning of your end step, you may exile target creature you control, then return that card to the battlefield under your control addCard(Zone.BATTLEFIELD, playerA, "Conjurer's Closet"); addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion"); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Act of Treason", "Silvercoat Lion"); addTarget(playerA, "Silvercoat Lion"); - + setStopAt(2, PhaseStep.PRECOMBAT_MAIN); execute(); - assertPermanentCount(playerA,"Conjurer's Closet", 1); + assertPermanentCount(playerA, "Conjurer's Closet", 1); assertGraveyardCount(playerA, "Act of Treason", 1); - - assertPermanentCount(playerA,"Silvercoat Lion", 1); - assertPermanentCount(playerB,"Silvercoat Lion", 0); - - } + + assertPermanentCount(playerA, "Silvercoat Lion", 1); + assertPermanentCount(playerB, "Silvercoat Lion", 0); + + } + + /** + * During a game i play a Flickerwisp main step who targets something and a + * second Flickerwisp who targets the first . End step : the first + * Flickerwisp return at the battlefield and target a Courser of Kruphix, + * normally she's return on the battlefield at the next end step (here end + * step of my opponent) but she's returned on the battlefield immediatly + * + * 8/1/2008 The exiled card will return to the battlefield at the beginning + * of the end step even if Flickerwisp is no longer on the battlefield. + * 8/1/2008 If the permanent that returns to the battlefield has any + * abilities that trigger at the beginning of the end step, those abilities + * won’t trigger that turn. + */ + @Test + public void testDoubleFlickerwisp() { + addCard(Zone.BATTLEFIELD, playerA, "Plains", 6); + // Flying + // When Flickerwisp enters the battlefield, exile another target permanent. + // Return that card to the battlefield under its owner's control at the beginning of the next end step. + addCard(Zone.HAND, playerA, "Flickerwisp", 2); // Creature {1}{W}{W} + + addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion"); + addCard(Zone.BATTLEFIELD, playerB, "Courser of Kruphix"); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Flickerwisp"); + addTarget(playerA, "Silvercoat Lion"); + castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Flickerwisp"); + addTarget(playerA, "Flickerwisp"); + addTarget(playerA, "Courser of Kruphix"); + + setStopAt(2, PhaseStep.PRECOMBAT_MAIN); + execute(); + + assertPermanentCount(playerA, "Flickerwisp", 2); + assertPermanentCount(playerB, "Silvercoat Lion", 1); + assertPermanentCount(playerB, "Courser of Kruphix", 0); + assertExileCount("Courser of Kruphix", 1); + } }