mirror of
https://github.com/magefree/mage.git
synced 2026-01-10 21:02:08 -08:00
Merge origin/master
This commit is contained in:
commit
4785ebd5f8
16 changed files with 420 additions and 138 deletions
|
|
@ -287,4 +287,42 @@ public class ManifestTest extends CardTestPlayerBase {
|
|||
assertPermanentCount(playerB, "face down creature", 1);
|
||||
|
||||
}
|
||||
|
||||
// Check if a Megamorph card is manifested and truned by their megamorph ability
|
||||
// it gets the +1/+1 counter.
|
||||
|
||||
@Test
|
||||
public void testManifestMegamorph() {
|
||||
|
||||
addCard(Zone.BATTLEFIELD, playerB, "Swamp", 2);
|
||||
addCard(Zone.BATTLEFIELD, playerB, "Plains", 5);
|
||||
// {1}{B}, {T}, Sacrifice another creature: Manifest the top card of your library.
|
||||
addCard(Zone.BATTLEFIELD, playerB, "Qarsi High Priest", 1);
|
||||
addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 1);
|
||||
|
||||
addCard(Zone.LIBRARY, playerB, "Sandstorm Charger", 1);
|
||||
addCard(Zone.LIBRARY, playerB, "Mountain", 1);
|
||||
|
||||
skipInitShuffling();
|
||||
|
||||
activateAbility(2, PhaseStep.PRECOMBAT_MAIN, playerB, "{1}{B},{T}, Sacrifice another creature");
|
||||
addTarget(playerB, "Silvercoat Lion");
|
||||
|
||||
activateAbility(2, PhaseStep.POSTCOMBAT_MAIN, playerB, "{4}{W}: Turn");
|
||||
|
||||
setStopAt(2, PhaseStep.END_TURN);
|
||||
execute();
|
||||
|
||||
// no life gain
|
||||
assertLife(playerA, 20);
|
||||
assertLife(playerB, 20);
|
||||
|
||||
assertGraveyardCount(playerB, "Silvercoat Lion", 1);
|
||||
|
||||
assertPermanentCount(playerB, "face down creature", 0);
|
||||
assertPermanentCount(playerB, "Sandstorm Charger", 1);
|
||||
assertPowerToughness(playerB, "Sandstorm Charger", 4, 5); // 3/4 and the +1/+1 counter from Megamorph
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -476,6 +476,10 @@ public class MorphTest extends CardTestPlayerBase {
|
|||
|
||||
@Test
|
||||
public void testDiesTriggeredDoesNotTriggerIfFaceDown() {
|
||||
// Flying
|
||||
// When Ashcloud Phoenix dies, return it to the battlefield face down.
|
||||
// Morph (You may cast this card face down as a 2/2 creature for . Turn it face up any time for its morph cost.)
|
||||
// When Ashcloud Phoenix is turned face up, it deals 2 damage to each player.
|
||||
addCard(Zone.HAND, playerA, "Ashcloud Phoenix", 1);
|
||||
addCard(Zone.BATTLEFIELD, playerA, "Forest", 3);
|
||||
|
||||
|
|
@ -505,5 +509,47 @@ public class MorphTest extends CardTestPlayerBase {
|
|||
}
|
||||
}
|
||||
|
||||
}
|
||||
/**
|
||||
* Check that a DiesTriggeredAbility of a creature does not trigger
|
||||
* if the creature dies face down in combat
|
||||
*/
|
||||
|
||||
@Test
|
||||
public void testDiesTriggeredDoesNotTriggerInCombatIfFaceDown() {
|
||||
// Flying
|
||||
// When Ashcloud Phoenix dies, return it to the battlefield face down.
|
||||
// Morph (You may cast this card face down as a 2/2 creature for . Turn it face up any time for its morph cost.)
|
||||
// When Ashcloud Phoenix is turned face up, it deals 2 damage to each player.
|
||||
addCard(Zone.HAND, playerA, "Ashcloud Phoenix", 1);
|
||||
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 3);
|
||||
|
||||
// First strike, forestwalk, vigilance
|
||||
// (This creature deals combat damage before creatures without first strike, it can't be blocked as long as defending player controls a Forest, and attacking doesn't cause this creature to tap.)
|
||||
addCard(Zone.BATTLEFIELD, playerB, "Mirri, Cat Warrior");
|
||||
|
||||
|
||||
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Ashcloud Phoenix");
|
||||
setChoice(playerA, "Yes"); // cast it face down as 2/2 creature
|
||||
|
||||
attack(2, playerB, "Mirri, Cat Warrior");
|
||||
block(2, playerA, "face down creature", "Mirri, Cat Warrior");
|
||||
|
||||
setStopAt(2, PhaseStep.POSTCOMBAT_MAIN);
|
||||
execute();
|
||||
|
||||
assertGraveyardCount(playerA, "Ashcloud Phoenix", 1);
|
||||
|
||||
|
||||
for (Card card: playerA.getGraveyard().getCards(currentGame)) {
|
||||
if (card.getName().equals("Ashcloud Phoenix")) {
|
||||
Assert.assertEquals("Ashcloud Phoenix has to be face up in graveyard", false, card.isFaceDown(currentGame));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
assertLife(playerA, 20);
|
||||
assertLife(playerB, 20);
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,93 @@
|
|||
/*
|
||||
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification, are
|
||||
* permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
* conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
* of conditions and the following disclaimer in the documentation and/or other materials
|
||||
* provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* The views and conclusions contained in the software and documentation are those of the
|
||||
* authors and should not be interpreted as representing official policies, either expressed
|
||||
* or implied, of BetaSteward_at_googlemail.com.
|
||||
*/
|
||||
package org.mage.test.cards.abilities.keywords;
|
||||
|
||||
import mage.constants.PhaseStep;
|
||||
import mage.constants.Zone;
|
||||
import org.junit.Test;
|
||||
import org.mage.test.serverside.base.CardTestPlayerBase;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author LevelX2
|
||||
*/
|
||||
public class ProvokeTest extends CardTestPlayerBase{
|
||||
|
||||
@Test
|
||||
public void testProvokeTappedCreature() {
|
||||
// Creature - Beast 5/3
|
||||
// Trample
|
||||
// Provoke (When this attacks, you may have target creature defending player controls untap and block it if able.)
|
||||
addCard(Zone.BATTLEFIELD, playerA, "Brontotherium");
|
||||
|
||||
addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 1);
|
||||
|
||||
attack(2, playerB, "Silvercoat Lion"); // So it's tapped
|
||||
|
||||
attack(3, playerA, "Brontotherium");
|
||||
addTarget(playerA, "Silvercoat Lion");
|
||||
|
||||
setStopAt(3, PhaseStep.POSTCOMBAT_MAIN);
|
||||
execute();
|
||||
|
||||
assertLife(playerA, 18); // one attack from Lion
|
||||
assertLife(playerB, 17); // Because of Trample
|
||||
|
||||
assertPermanentCount(playerA, "Brontotherium", 1);
|
||||
assertGraveyardCount(playerB,"Silvercoat Lion", 1);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testProvokeCreatureThatCantBlock() {
|
||||
// Creature - Beast 5/3
|
||||
// Trample
|
||||
// Provoke (When this attacks, you may have target creature defending player controls untap and block it if able.)
|
||||
addCard(Zone.BATTLEFIELD, playerA, "Brontotherium");
|
||||
|
||||
// Creature - Zombie Imp 1/1
|
||||
// Discard a card: Putrid Imp gains flying until end of turn.
|
||||
// Threshold - As long as seven or more cards are in your graveyard, Putrid Imp gets +1/+1 and can't block.
|
||||
addCard(Zone.BATTLEFIELD, playerB, "Putrid Imp", 1);
|
||||
addCard(Zone.GRAVEYARD, playerB, "Swamp", 7);
|
||||
|
||||
attack(2, playerB, "Putrid Imp"); // So it's tapped
|
||||
|
||||
attack(3, playerA, "Brontotherium");
|
||||
addTarget(playerA, "Putrid Imp");
|
||||
|
||||
setStopAt(3, PhaseStep.POSTCOMBAT_MAIN);
|
||||
execute();
|
||||
|
||||
assertPermanentCount(playerA, "Brontotherium", 1);
|
||||
assertPermanentCount(playerB, "Putrid Imp", 1); // Can't Block so still alive
|
||||
|
||||
assertLife(playerA, 18); // one attack from Imp
|
||||
assertLife(playerB, 15); // Not blocked
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -29,6 +29,7 @@ package org.mage.test.cards.replacement;
|
|||
|
||||
import mage.constants.PhaseStep;
|
||||
import mage.constants.Zone;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
import org.mage.test.serverside.base.CardTestPlayerBase;
|
||||
|
||||
|
|
@ -40,11 +41,11 @@ import org.mage.test.serverside.base.CardTestPlayerBase;
|
|||
public class GrindstoneTest extends CardTestPlayerBase {
|
||||
|
||||
/**
|
||||
* Tests that instead of one spore counter there were two spore counters added to Pallid Mycoderm
|
||||
* if Doubling Season is on the battlefield.
|
||||
* Tests that Grindstone mills all cards to graveyard while Painter's Servant is in play
|
||||
* Leaving one Progenius in play
|
||||
*/
|
||||
@Test
|
||||
public void testGrindstoneTest() {
|
||||
public void testGrindstoneProgenius() {
|
||||
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 5);
|
||||
// As Painter's Servant enters the battlefield, choose a color.
|
||||
// All cards that aren't on the battlefield, spells, and permanents are the chosen color in addition to their other colors.
|
||||
|
|
@ -52,18 +53,88 @@ public class GrindstoneTest extends CardTestPlayerBase {
|
|||
// {3}, {T}: Target player puts the top two cards of his or her library into his or her graveyard. If both cards share a color, repeat this process.
|
||||
addCard(Zone.BATTLEFIELD, playerA, "Grindstone");
|
||||
|
||||
addCard(Zone.LIBRARY, playerA, "Progenitus", 2);
|
||||
// Protection from everything
|
||||
// If Progenitus would be put into a graveyard from anywhere, reveal Progenitus and shuffle it into its owner's library instead.
|
||||
addCard(Zone.LIBRARY, playerB, "Progenitus", 1);
|
||||
skipInitShuffling();
|
||||
|
||||
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Painter's Servant");
|
||||
setChoice(playerA, "Blue");
|
||||
|
||||
activateAbility(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "{3},{T}: Target player puts the top two cards of his or her library into his or her graveyard. If both cards share a color, repeat this process.");
|
||||
addTarget(playerA, playerB);
|
||||
|
||||
setStopAt(1, PhaseStep.END_TURN);
|
||||
execute();
|
||||
|
||||
Assert.assertEquals("Progenitus has to be in the libarary", 1, playerB.getLibrary().size());
|
||||
assertPermanentCount(playerA, "Painter's Servant", 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests that Grindstone mills all cards to graveyard while Painter's Servant is in play
|
||||
* Iterating with two Progenius for a draw
|
||||
*/
|
||||
@Test
|
||||
public void testGrindstoneProgeniusDraw() {
|
||||
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 5);
|
||||
// As Painter's Servant enters the battlefield, choose a color.
|
||||
// All cards that aren't on the battlefield, spells, and permanents are the chosen color in addition to their other colors.
|
||||
addCard(Zone.HAND, playerA, "Painter's Servant");
|
||||
// {3}, {T}: Target player puts the top two cards of his or her library into his or her graveyard. If both cards share a color, repeat this process.
|
||||
addCard(Zone.BATTLEFIELD, playerA, "Grindstone");
|
||||
|
||||
// Protection from everything
|
||||
// If Progenitus would be put into a graveyard from anywhere, reveal Progenitus and shuffle it into its owner's library instead.
|
||||
addCard(Zone.LIBRARY, playerB, "Progenitus", 2);
|
||||
skipInitShuffling();
|
||||
|
||||
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Painter's Servant");
|
||||
setChoice(playerA, "Blue");
|
||||
|
||||
activateAbility(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "{3},{T}: Target player puts the top two cards of his or her library into his or her graveyard. If both cards share a color, repeat this process.");
|
||||
addTarget(playerA, playerB);
|
||||
|
||||
setStopAt(1, PhaseStep.END_TURN);
|
||||
execute();
|
||||
|
||||
Assert.assertTrue("Has to be a draw because of endless iteration", currentGame.isADraw());
|
||||
assertPermanentCount(playerA, "Painter's Servant", 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests that Grindstone mills all cards to graveyard while Painter's Servant is in play
|
||||
* Iterating with two Progenius for a draw
|
||||
*/
|
||||
@Test
|
||||
public void testGrindstoneUlamog() {
|
||||
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 5);
|
||||
// As Painter's Servant enters the battlefield, choose a color.
|
||||
// All cards that aren't on the battlefield, spells, and permanents are the chosen color in addition to their other colors.
|
||||
addCard(Zone.HAND, playerA, "Painter's Servant");
|
||||
// {3}, {T}: Target player puts the top two cards of his or her library into his or her graveyard. If both cards share a color, repeat this process.
|
||||
addCard(Zone.BATTLEFIELD, playerA, "Grindstone");
|
||||
|
||||
// When you cast Ulamog, the Infinite Gyre, destroy target permanent.
|
||||
// Annihilator 4 (Whenever this creature attacks, defending player sacrifices four permanents.)
|
||||
// Ulamog is indestructible.
|
||||
// When Ulamog is put into a graveyard from anywhere, its owner shuffles his or her graveyard into his or her library.
|
||||
addCard(Zone.LIBRARY, playerB, "Ulamog, the Infinite Gyre", 2);
|
||||
skipInitShuffling();
|
||||
|
||||
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Painter's Servant");
|
||||
setChoice(playerA, "Blue");
|
||||
|
||||
activateAbility(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "{3},{T}: Target player puts the top two cards of his or her library into his or her graveyard. If both cards share a color, repeat this process.");
|
||||
addTarget(playerA, playerB);
|
||||
|
||||
setStopAt(1, PhaseStep.END_TURN);
|
||||
execute();
|
||||
|
||||
// No cards in graveyard because Ulamog shuffle all cards back to Lib
|
||||
assertGraveyardCount(playerB, 0);
|
||||
assertPermanentCount(playerA, "Painter's Servant", 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue