From 7529d6f20712e9c1d337512d019533ceb11280f2 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Tue, 14 Apr 2015 15:25:51 +0200 Subject: [PATCH] * Grindstone - Fixed a bug causing target player to lose game by grindstone effect itself. --- .../src/mage/sets/conflux/Progenitus.java | 5 -- .../src/mage/sets/tempest/Grindstone.java | 24 +++--- .../cards/replacement/GrindstoneTest.java | 79 ++++++++++++++++++- 3 files changed, 90 insertions(+), 18 deletions(-) diff --git a/Mage.Sets/src/mage/sets/conflux/Progenitus.java b/Mage.Sets/src/mage/sets/conflux/Progenitus.java index 8649a5c8960..0226a7e7183 100644 --- a/Mage.Sets/src/mage/sets/conflux/Progenitus.java +++ b/Mage.Sets/src/mage/sets/conflux/Progenitus.java @@ -52,11 +52,6 @@ public class Progenitus extends CardImpl { this.subtype.add("Hydra"); this.subtype.add("Avatar"); - this.color.setRed(true); - this.color.setBlue(true); - this.color.setGreen(true); - this.color.setBlack(true); - this.color.setWhite(true); this.power = new MageInt(10); this.toughness = new MageInt(10); diff --git a/Mage.Sets/src/mage/sets/tempest/Grindstone.java b/Mage.Sets/src/mage/sets/tempest/Grindstone.java index a96272b8a2a..c27434aef0f 100644 --- a/Mage.Sets/src/mage/sets/tempest/Grindstone.java +++ b/Mage.Sets/src/mage/sets/tempest/Grindstone.java @@ -106,17 +106,23 @@ class GrindstoneEffect extends OneShotEffect { return true; } colorShared = false; - Card card1 = targetPlayer.getLibrary().removeFromTop(game); - if (card1 != null) { - targetPlayer.moveCardToGraveyardWithInfo(card1, source.getSourceId(), game, Zone.LIBRARY); - Card card2 = targetPlayer.getLibrary().removeFromTop(game); - if (card2 != null) { - targetPlayer.moveCardToGraveyardWithInfo(card2, source.getSourceId(), game, Zone.LIBRARY); + Card card1 = null; + Card card2 = null; + if (targetPlayer.getLibrary().size() > 0) { + card1 = targetPlayer.getLibrary().removeFromTop(game); + if (targetPlayer.getLibrary().size() > 0) { + card2 = targetPlayer.getLibrary().removeFromTop(game); if (card1.getColor().hasColor() && card2.getColor().hasColor()) { colorShared = card1.getColor().shares(card2.getColor()); - } - } - } + } + } + } + if (card1 != null) { + targetPlayer.moveCardToGraveyardWithInfo(card1, source.getSourceId(), game, Zone.LIBRARY); + } + if (card2 != null) { + targetPlayer.moveCardToGraveyardWithInfo(card2, source.getSourceId(), game, Zone.LIBRARY); + } } while (colorShared && targetPlayer.isInGame()); return true; } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/replacement/GrindstoneTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/replacement/GrindstoneTest.java index 1e800575457..444b2555292 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/replacement/GrindstoneTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/replacement/GrindstoneTest.java @@ -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); + } } + +