From af5ccf69142ef0b3681f9bb0a883bacbda077dcd Mon Sep 17 00:00:00 2001 From: Patrick Hulin Date: Mon, 9 Dec 2019 13:50:07 -0500 Subject: [PATCH] Implement AdventurePredicate. This adds support for Edgewall Innkeeper (and similar cards) and Memory Theft. --- .../cost/adventure/AdventureCardsTest.java | 140 ++++++++++++++++++ .../adventure/CastAdventureCardsTest.java | 50 ------- .../mage/cards/AdventureCardSpellImpl.java | 2 + .../mageobject/AdventurePredicate.java | 12 +- 4 files changed, 152 insertions(+), 52 deletions(-) create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/cost/adventure/AdventureCardsTest.java delete mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/cost/adventure/CastAdventureCardsTest.java diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/cost/adventure/AdventureCardsTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/cost/adventure/AdventureCardsTest.java new file mode 100644 index 00000000000..a2860105888 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/cost/adventure/AdventureCardsTest.java @@ -0,0 +1,140 @@ +package org.mage.test.cards.cost.adventure; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +public class AdventureCardsTest extends CardTestPlayerBase { + @Test + public void testCastTreatsToShare() { + setStrictChooseMode(true); + addCard(Zone.BATTLEFIELD, playerA, "Forest"); + addCard(Zone.HAND, playerA, "Curious Pair"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Treats to Share"); + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + assertHandCount(playerA, 0); + assertPermanentCount(playerA, "Food", 1); + assertExileCount(playerA, "Curious Pair", 1); + assertGraveyardCount(playerA,0); + assertAllCommandsUsed(); + } + + @Test + public void testCastCuriousPair() { + setStrictChooseMode(true); + addCard(Zone.BATTLEFIELD, playerA, "Forest"); + addCard(Zone.BATTLEFIELD, playerA, "Forest"); + addCard(Zone.HAND, playerA, "Curious Pair"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Curious Pair"); + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + assertHandCount(playerA, 0); + assertPermanentCount(playerA, "Food", 0); + assertPermanentCount(playerA, "Curious Pair", 1); + assertExileCount(playerA, "Curious Pair", 0); + assertGraveyardCount(playerA,0); + assertAllCommandsUsed(); + } + + @Test + public void testCastTreatsToShareAndCuriousPair() { + setStrictChooseMode(true); + addCard(Zone.BATTLEFIELD, playerA, "Forest"); + addCard(Zone.BATTLEFIELD, playerA, "Forest"); + addCard(Zone.BATTLEFIELD, playerA, "Forest"); + addCard(Zone.HAND, playerA, "Curious Pair"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Treats to Share"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Curious Pair"); + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + assertHandCount(playerA, 0); + assertPermanentCount(playerA, "Food", 1); + assertPermanentCount(playerA, "Curious Pair", 1); + assertExileCount(playerA, "Curious Pair", 0); + assertGraveyardCount(playerA, 0); + assertAllCommandsUsed(); + } + + @Test + public void testCastTreatsToShareWithEdgewallInnkeeper() { + setStrictChooseMode(true); + addCard(Zone.BATTLEFIELD, playerA, "Forest"); + addCard(Zone.BATTLEFIELD, playerA, "Forest"); + addCard(Zone.BATTLEFIELD, playerA, "Forest"); + addCard(Zone.BATTLEFIELD, playerA, "Edgewall Innkeeper"); + addCard(Zone.HAND, playerA, "Curious Pair"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Treats to Share"); + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + assertHandCount(playerA, 0); + assertPermanentCount(playerA, "Food", 1); + assertPermanentCount(playerA, "Curious Pair", 0); + assertExileCount(playerA, "Curious Pair", 1); + assertGraveyardCount(playerA, 0); + assertAllCommandsUsed(); + } + + @Test + public void testCastCuriousPairWithEdgewallInnkeeper() { + setStrictChooseMode(true); + addCard(Zone.BATTLEFIELD, playerA, "Forest"); + addCard(Zone.BATTLEFIELD, playerA, "Forest"); + addCard(Zone.BATTLEFIELD, playerA, "Edgewall Innkeeper"); + addCard(Zone.HAND, playerA, "Curious Pair"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Curious Pair"); + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + assertHandCount(playerA, 1); + assertPermanentCount(playerA, "Food", 0); + assertPermanentCount(playerA, "Curious Pair", 1); + assertExileCount(playerA, "Curious Pair", 0); + assertGraveyardCount(playerA,0); + assertAllCommandsUsed(); + } + + @Test + public void testCastTreatsToShareAndCuriousPairWithEdgewallInnkeeper() { + setStrictChooseMode(true); + addCard(Zone.BATTLEFIELD, playerA, "Forest"); + addCard(Zone.BATTLEFIELD, playerA, "Forest"); + addCard(Zone.BATTLEFIELD, playerA, "Forest"); + addCard(Zone.BATTLEFIELD, playerA, "Edgewall Innkeeper"); + addCard(Zone.HAND, playerA, "Curious Pair"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Treats to Share"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Curious Pair"); + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + assertHandCount(playerA, 1); + assertPermanentCount(playerA, "Food", 1); + assertPermanentCount(playerA, "Curious Pair", 1); + assertExileCount(playerA, "Curious Pair", 0); + assertGraveyardCount(playerA, 0); + assertAllCommandsUsed(); + } + + @Test + public void testCastMemoryTheft() { + setStrictChooseMode(true); + addCard(Zone.BATTLEFIELD, playerA, "Forest"); + addCard(Zone.HAND, playerA, "Curious Pair"); + addCard(Zone.HAND, playerA, "Opt"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Treats to Share"); + setStopAt(1, PhaseStep.BEGIN_COMBAT); + + addCard(Zone.BATTLEFIELD, playerB, "Swamp"); + addCard(Zone.BATTLEFIELD, playerB, "Swamp"); + addCard(Zone.BATTLEFIELD, playerB, "Swamp"); + addCard(Zone.HAND, playerB, "Memory Theft"); + castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Memory Theft", playerA); + playerB.addChoice("Opt"); + playerB.addChoice("Curious Pair"); + setStopAt(2, PhaseStep.BEGIN_COMBAT); + execute(); + assertHandCount(playerA, 0); + assertExileCount(playerA, "Curious Pair", 0); + assertGraveyardCount(playerA, 2); + assertAllCommandsUsed(); + } +} diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/cost/adventure/CastAdventureCardsTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/cost/adventure/CastAdventureCardsTest.java deleted file mode 100644 index f8a1d125364..00000000000 --- a/Mage.Tests/src/test/java/org/mage/test/cards/cost/adventure/CastAdventureCardsTest.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.mage.test.cards.cost.adventure; - -import mage.constants.PhaseStep; -import mage.constants.Zone; -import org.junit.Test; -import org.mage.test.serverside.base.CardTestPlayerBase; - -public class CastAdventureCardsTest extends CardTestPlayerBase { - @Test - public void testCastTreatsToShare() { - addCard(Zone.BATTLEFIELD, playerA, "Forest"); - addCard(Zone.HAND, playerA, "Curious Pair"); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Treats to Share"); - setStopAt(1, PhaseStep.BEGIN_COMBAT); - execute(); - assertPermanentCount(playerA, "Food", 1); - assertExileCount(playerA, "Curious Pair", 1); - assertGraveyardCount(playerA,0); - } - - @Test - public void testCastCuriousPair() { - addCard(Zone.BATTLEFIELD, playerA, "Forest"); - addCard(Zone.BATTLEFIELD, playerA, "Forest"); - addCard(Zone.HAND, playerA, "Curious Pair"); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Curious Pair"); - setStopAt(1, PhaseStep.BEGIN_COMBAT); - execute(); - assertPermanentCount(playerA, "Food", 0); - assertPermanentCount(playerA, "Curious Pair", 1); - assertExileCount(playerA, "Curious Pair", 0); - assertGraveyardCount(playerA,0); - } - - @Test - public void testCastTreatsToShareAndCuriousPair() { - addCard(Zone.BATTLEFIELD, playerA, "Forest"); - addCard(Zone.BATTLEFIELD, playerA, "Forest"); - addCard(Zone.BATTLEFIELD, playerA, "Forest"); - addCard(Zone.HAND, playerA, "Curious Pair"); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Treats to Share"); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Curious Pair"); - setStopAt(1, PhaseStep.BEGIN_COMBAT); - execute(); - assertPermanentCount(playerA, "Food", 1); - assertPermanentCount(playerA, "Curious Pair", 1); - assertExileCount(playerA, "Curious Pair", 0); - assertGraveyardCount(playerA, 0); - } -} diff --git a/Mage/src/main/java/mage/cards/AdventureCardSpellImpl.java b/Mage/src/main/java/mage/cards/AdventureCardSpellImpl.java index ff55557b677..d8a1b2212a4 100644 --- a/Mage/src/main/java/mage/cards/AdventureCardSpellImpl.java +++ b/Mage/src/main/java/mage/cards/AdventureCardSpellImpl.java @@ -7,6 +7,7 @@ package mage.cards; import mage.constants.CardType; import mage.constants.SpellAbilityType; +import mage.constants.SubType; import mage.constants.Zone; import mage.game.Game; @@ -23,6 +24,7 @@ public class AdventureCardSpellImpl extends CardImpl implements AdventureCardSpe public AdventureCardSpellImpl(UUID ownerId, CardSetInfo setInfo, CardType[] cardTypes, String costs, AdventureCard adventureCardParent) { super(ownerId, setInfo, cardTypes, costs, SpellAbilityType.ADVENTURE_SPELL); + this.subtype.add(SubType.ADVENTURE); this.adventureCardParent = adventureCardParent; } diff --git a/Mage/src/main/java/mage/filter/predicate/mageobject/AdventurePredicate.java b/Mage/src/main/java/mage/filter/predicate/mageobject/AdventurePredicate.java index 90927d92ca6..98544c800f6 100644 --- a/Mage/src/main/java/mage/filter/predicate/mageobject/AdventurePredicate.java +++ b/Mage/src/main/java/mage/filter/predicate/mageobject/AdventurePredicate.java @@ -1,19 +1,27 @@ package mage.filter.predicate.mageobject; import mage.MageObject; +import mage.cards.AdventureCard; +import mage.cards.Card; import mage.filter.predicate.Predicate; import mage.game.Game; +import mage.game.stack.Spell; /** * @author TheElk801 - * TODO: make this actually work */ public enum AdventurePredicate implements Predicate { instance; @Override public boolean apply(MageObject input, Game game) { - return false; + if (input instanceof Spell) { + return ((Spell) input).getCard() instanceof AdventureCard; + } else if (input instanceof Card) { + return input instanceof AdventureCard; + } else { + return false; + } } @Override