mirror of
https://github.com/correl/mage.git
synced 2024-11-15 19:19:33 +00:00
* Grindstone - Fixed a bug causing target player to lose game by grindstone effect itself.
This commit is contained in:
parent
15389b24d8
commit
7529d6f207
3 changed files with 90 additions and 18 deletions
|
@ -52,11 +52,6 @@ public class Progenitus extends CardImpl {
|
||||||
this.subtype.add("Hydra");
|
this.subtype.add("Hydra");
|
||||||
this.subtype.add("Avatar");
|
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.power = new MageInt(10);
|
||||||
this.toughness = new MageInt(10);
|
this.toughness = new MageInt(10);
|
||||||
|
|
||||||
|
|
|
@ -106,17 +106,23 @@ class GrindstoneEffect extends OneShotEffect {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
colorShared = false;
|
colorShared = false;
|
||||||
Card card1 = targetPlayer.getLibrary().removeFromTop(game);
|
Card card1 = null;
|
||||||
if (card1 != null) {
|
Card card2 = null;
|
||||||
targetPlayer.moveCardToGraveyardWithInfo(card1, source.getSourceId(), game, Zone.LIBRARY);
|
if (targetPlayer.getLibrary().size() > 0) {
|
||||||
Card card2 = targetPlayer.getLibrary().removeFromTop(game);
|
card1 = targetPlayer.getLibrary().removeFromTop(game);
|
||||||
if (card2 != null) {
|
if (targetPlayer.getLibrary().size() > 0) {
|
||||||
targetPlayer.moveCardToGraveyardWithInfo(card2, source.getSourceId(), game, Zone.LIBRARY);
|
card2 = targetPlayer.getLibrary().removeFromTop(game);
|
||||||
if (card1.getColor().hasColor() && card2.getColor().hasColor()) {
|
if (card1.getColor().hasColor() && card2.getColor().hasColor()) {
|
||||||
colorShared = card1.getColor().shares(card2.getColor());
|
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());
|
} while (colorShared && targetPlayer.isInGame());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,6 +29,7 @@ package org.mage.test.cards.replacement;
|
||||||
|
|
||||||
import mage.constants.PhaseStep;
|
import mage.constants.PhaseStep;
|
||||||
import mage.constants.Zone;
|
import mage.constants.Zone;
|
||||||
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.mage.test.serverside.base.CardTestPlayerBase;
|
import org.mage.test.serverside.base.CardTestPlayerBase;
|
||||||
|
|
||||||
|
@ -40,11 +41,11 @@ import org.mage.test.serverside.base.CardTestPlayerBase;
|
||||||
public class GrindstoneTest extends CardTestPlayerBase {
|
public class GrindstoneTest extends CardTestPlayerBase {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests that instead of one spore counter there were two spore counters added to Pallid Mycoderm
|
* Tests that Grindstone mills all cards to graveyard while Painter's Servant is in play
|
||||||
* if Doubling Season is on the battlefield.
|
* Leaving one Progenius in play
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testGrindstoneTest() {
|
public void testGrindstoneProgenius() {
|
||||||
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 5);
|
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 5);
|
||||||
// As Painter's Servant enters the battlefield, choose a color.
|
// 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.
|
// 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.
|
// {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.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();
|
skipInitShuffling();
|
||||||
|
|
||||||
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Painter's Servant");
|
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Painter's Servant");
|
||||||
setChoice(playerA, "Blue");
|
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.");
|
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);
|
setStopAt(1, PhaseStep.END_TURN);
|
||||||
execute();
|
execute();
|
||||||
|
|
||||||
|
Assert.assertEquals("Progenitus has to be in the libarary", 1, playerB.getLibrary().size());
|
||||||
assertPermanentCount(playerA, "Painter's Servant", 1);
|
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…
Reference in a new issue