From e9b1d3296b751d6b89c3a0a2664ae9330e44a337 Mon Sep 17 00:00:00 2001 From: Christian 'ketura' McCarty Date: Sat, 11 Mar 2023 14:51:27 -0600 Subject: [PATCH] Tweaked The Faithful Stone errata to wait for the minion decision to be made before asking Shadow to prevent. Added unit tests for both versions of TFS. --- .../pc/errata/set18/set18-Gondor-errata.hjson | 32 ++- .../official/set18/Card_18_050_Tests.java | 227 ++++++++++++++++++ .../errata/set18/Card_18_050_ErrataTests.java | 205 +++++++++++++--- 3 files changed, 421 insertions(+), 43 deletions(-) create mode 100644 gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set18/Card_18_050_Tests.java diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set18/set18-Gondor-errata.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set18/set18-Gondor-errata.hjson index f1b9c0fcd..e523df66d 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set18/set18-Gondor-errata.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set18/set18-Gondor-errata.hjson @@ -139,20 +139,28 @@ culture: gondor filter: self } - effect: { - type: preventable - player: shadowPlayer - text: Would you like to add (2) to allow your minion to skirmish? - cost: { - type: removeTwilight - amount: 2 - } - effect: { - type: cantBeAssignedToSkirmish + effect: [ + { + type: ChooseActiveCards filter: choose(minion) - until: start(regroup) + memorize: chosenMinion + text: Choose a minion to prevent from skirmishing until the Regroup phase. } - } + { + type: preventable + player: shadowPlayer + text: Would you like to remove (2) to allow {chosenMinion} to skirmish? + cost: { + type: removeTwilight + amount: 2 + } + effect: { + type: cantBeAssignedToSkirmish + filter: memory(chosenMinion) + until: start(regroup) + } + } + ] } ] gametext: Tale. Each time a non-[wraith] minion is played, you may spot a Man to put a [gondor] token here.
Maneuver: Remove 3 [gondor] tokens from here to spot a minion. That minion cannot be assigned to a skirmish until the regroup phase. Any Shadow player may remove (2) to prevent this. diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set18/Card_18_050_Tests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set18/Card_18_050_Tests.java new file mode 100644 index 000000000..3d5ecde5d --- /dev/null +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set18/Card_18_050_Tests.java @@ -0,0 +1,227 @@ +package com.gempukku.lotro.cards.official.set18; + +import com.gempukku.lotro.cards.GenericCardTestHelper; +import com.gempukku.lotro.common.*; +import com.gempukku.lotro.game.CardNotFoundException; +import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException; +import org.junit.Test; + +import java.util.HashMap; + +import static org.junit.Assert.*; + +public class Card_18_050_Tests +{ + + protected GenericCardTestHelper GetScenario() throws CardNotFoundException, DecisionResultInvalidException { + return new GenericCardTestHelper( + new HashMap<>() + {{ + put("stone", "18_50"); + put("boromir", "1_96"); + put("ravager", "4_15"); + put("morc", "7_193"); + put("uruk", "4_187"); + }}, + GenericCardTestHelper.FellowshipSites, + GenericCardTestHelper.FOTRFrodo, + GenericCardTestHelper.FOTRRing + ); + } + + @Test + public void TheFaithfulStoneStatsAndKeywordsAreCorrect() throws DecisionResultInvalidException, CardNotFoundException { + + /** + * Set: 18 + * Title: *The Faithful Stone + * Side: Free Peoples + * Culture: Gondor + * Twilight Cost: 3 + * Type: condition + * Subtype: Support Area + * Game Text: Tale. Each time a non-[wraith] minion is played, you may spot a Man to put a [gondor] token here.
Maneuver: Remove 3 [gondor] tokens from here to spot a minion. That minion cannot be assigned to a skirmish until the regroup phase. Any Shadow player may remove (2) to prevent this. + */ + + //Pre-game setup + GenericCardTestHelper scn = GetScenario(); + + var stone = scn.GetFreepsCard("stone"); + + assertFalse(stone.getBlueprint().isUnique()); + assertEquals(Side.FREE_PEOPLE, stone.getBlueprint().getSide()); + assertEquals(Culture.GONDOR, stone.getBlueprint().getCulture()); + assertEquals(CardType.CONDITION, stone.getBlueprint().getCardType()); + assertTrue(scn.HasKeyword(stone, Keyword.SUPPORT_AREA)); + assertTrue(scn.HasKeyword(stone, Keyword.TALE)); + assertEquals(3, stone.getBlueprint().getTwilightCost()); + } + + @Test + public void TheFaithfulStoneAddsTokenWhenNonRingwraithMinionPlayedIfManCanBeSpotted() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + GenericCardTestHelper scn = GetScenario(); + + var stone = scn.GetFreepsCard("stone"); + var boromir = scn.GetFreepsCard("boromir"); + scn.FreepsMoveCardToSupportArea(stone); + scn.FreepsMoveCharToTable(boromir); + + var uruk = scn.GetShadowCard("uruk"); + scn.ShadowMoveCardToHand(uruk); + + scn.StartGame(); + scn.FreepsPassCurrentPhaseAction(); + + assertEquals(0, scn.GetCultureTokensOn(stone)); + scn.ShadowPlayCard(uruk); + scn.FreepsAcceptOptionalTrigger(); + assertEquals(1, scn.GetCultureTokensOn(stone)); + } + + @Test + public void TheFaithfulStoneAddsTokenWhenNonRingwraithMinionPlayedIfShadowManCanBeSpotted() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + GenericCardTestHelper scn = GetScenario(); + + var stone = scn.GetFreepsCard("stone"); + scn.FreepsMoveCardToSupportArea(stone); + + var uruk = scn.GetShadowCard("uruk"); + var dunlender = scn.GetShadowCard("ravager"); + scn.ShadowMoveCardToHand(uruk); + scn.ShadowMoveCharToTable(dunlender); + + scn.StartGame(); + scn.FreepsPassCurrentPhaseAction(); + + assertEquals(0, scn.GetCultureTokensOn(stone)); + scn.ShadowPlayCard(uruk); + scn.FreepsAcceptOptionalTrigger(); + assertEquals(1, scn.GetCultureTokensOn(stone)); + } + + @Test + public void TheFaithfulStoneAddsNoTokenIfManCannotBeSpotted() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + GenericCardTestHelper scn = GetScenario(); + + var stone = scn.GetFreepsCard("stone"); + scn.FreepsMoveCardToSupportArea(stone); + + var uruk = scn.GetShadowCard("uruk"); + scn.ShadowMoveCardToHand(uruk); + + scn.StartGame(); + scn.FreepsPassCurrentPhaseAction(); + + assertEquals(0, scn.GetCultureTokensOn(stone)); + scn.ShadowPlayCard(uruk); + assertEquals(0, scn.GetCultureTokensOn(stone)); + } + + @Test + public void TheFaithfulStoneAddsNoTokenWhenRingwraithMinionIsPlayed() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + GenericCardTestHelper scn = GetScenario(); + + var stone = scn.GetFreepsCard("stone"); + scn.FreepsMoveCardToSupportArea(stone); + + var morc = scn.GetShadowCard("morc"); + scn.ShadowMoveCardToHand(morc); + + scn.StartGame(); + scn.SetTwilight(10); + scn.FreepsPassCurrentPhaseAction(); + + assertEquals(0, scn.GetCultureTokensOn(stone)); + scn.ShadowPlayCard(morc); + assertEquals(0, scn.GetCultureTokensOn(stone)); + } + + @Test + public void TheFaithfulStoneManueverActionCannotBeUsedIfLessThan3Tokens() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + GenericCardTestHelper scn = GetScenario(); + + var stone = scn.GetFreepsCard("stone"); + var boromir = scn.GetFreepsCard("boromir"); + scn.FreepsMoveCardToSupportArea(stone); + scn.FreepsMoveCharToTable(boromir); + + var uruk = scn.GetShadowCard("uruk"); + scn.ShadowMoveCharToTable(uruk); + + scn.StartGame(); + scn.AddTokensToCard(stone, 2); + scn.SkipToPhase(Phase.MANEUVER); + + assertFalse(scn.FreepsActionAvailable(stone)); + } + + @Test + public void TheFaithfulStoneManueverActionRemoves3TokensToPreventAssigningTargetMinion() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + GenericCardTestHelper scn = GetScenario(); + + var stone = scn.GetFreepsCard("stone"); + scn.FreepsMoveCardToSupportArea(stone); + + var uruk = scn.GetShadowCard("uruk"); + scn.ShadowMoveCharToTable(uruk); + + scn.StartGame(); + scn.AddTokensToCard(stone, 3); + scn.SkipToPhase(Phase.MANEUVER); + + scn.SetTwilight(0); + assertTrue(scn.FreepsActionAvailable(stone)); + assertEquals(3, scn.GetCultureTokensOn(stone)); + scn.FreepsUseCardAction(stone); + assertEquals(0, scn.GetCultureTokensOn(stone)); + + // Maneuver actions + scn.ShadowPassCurrentPhaseAction(); + scn.FreepsPassCurrentPhaseAction(); + //Both pass Archery actions + scn.PassCurrentPhaseActions(); + //Both pass Assignment actions + scn.PassCurrentPhaseActions(); + //Both pass Fierce Assignment actions + scn.PassCurrentPhaseActions(); + + //We are now straight to the Regroup phase as there are no assignable minions + assertEquals(Phase.REGROUP, scn.GetCurrentPhase()); + } + + @Test + public void TheFaithfulStoneManueverActionCanBePreventedByShadowRemoving2Twilight() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + GenericCardTestHelper scn = GetScenario(); + + var stone = scn.GetFreepsCard("stone"); + scn.FreepsMoveCardToSupportArea(stone); + + var uruk = scn.GetShadowCard("uruk"); + scn.ShadowMoveCharToTable(uruk); + + scn.StartGame(); + scn.AddTokensToCard(stone, 3); + scn.SkipToPhase(Phase.MANEUVER); + + scn.SetTwilight(2); + assertTrue(scn.FreepsActionAvailable(stone)); + assertEquals(3, scn.GetCultureTokensOn(stone)); + scn.FreepsUseCardAction(stone); + assertEquals(0, scn.GetCultureTokensOn(stone)); + + assertEquals(2, scn.GetTwilight()); + assertTrue(scn.ShadowDecisionAvailable("Would you like to - remove (2) to prevent")); + scn.ShadowChooseYes(); + assertEquals(0, scn.GetTwilight()); + + scn.SkipToAssignments(); + assertTrue(scn.FreepsDecisionAvailable("assign")); + } +} diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set18/Card_18_050_ErrataTests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set18/Card_18_050_ErrataTests.java index 0ca9077fc..4c16b9e34 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set18/Card_18_050_ErrataTests.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set18/Card_18_050_ErrataTests.java @@ -3,26 +3,25 @@ package com.gempukku.lotro.cards.unofficial.pc.errata.set18; import com.gempukku.lotro.cards.GenericCardTestHelper; import com.gempukku.lotro.common.*; import com.gempukku.lotro.game.CardNotFoundException; -import com.gempukku.lotro.game.PhysicalCardImpl; import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException; -import com.gempukku.lotro.logic.modifiers.MoveLimitModifier; import org.junit.Test; import java.util.HashMap; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.*; public class Card_18_050_ErrataTests { protected GenericCardTestHelper GetScenario() throws CardNotFoundException, DecisionResultInvalidException { return new GenericCardTestHelper( - new HashMap() + new HashMap<>() {{ - put("card", "68_50"); - // put other cards in here as needed for the test case + put("stone", "68_50"); + put("boromir", "1_96"); + put("ravager", "4_15"); + put("morc", "7_193"); + put("uruk", "4_187"); }}, GenericCardTestHelper.FellowshipSites, GenericCardTestHelper.FOTRFrodo, @@ -30,9 +29,7 @@ public class Card_18_050_ErrataTests ); } - // Uncomment both @Test markers below once this is ready to be used - - //@Test + @Test public void TheFaithfulStoneStatsAndKeywordsAreCorrect() throws DecisionResultInvalidException, CardNotFoundException { /** @@ -49,34 +46,180 @@ public class Card_18_050_ErrataTests //Pre-game setup GenericCardTestHelper scn = GetScenario(); - PhysicalCardImpl card = scn.GetFreepsCard("card"); - - assertTrue(card.getBlueprint().isUnique()); - assertEquals(Side.FREE_PEOPLE, card.getBlueprint().getSide()); - assertEquals(Culture.GONDOR, card.getBlueprint().getCulture()); - assertEquals(CardType.CONDITION, card.getBlueprint().getCardType()); - //assertEquals(Race.CREATURE, card.getBlueprint().getRace()); - assertTrue(scn.HasKeyword(card, Keyword.SUPPORT_AREA)); - assertEquals(3, card.getBlueprint().getTwilightCost()); - //assertEquals(, card.getBlueprint().getStrength()); - //assertEquals(, card.getBlueprint().getVitality()); - //assertEquals(, card.getBlueprint().getResistance()); - //assertEquals(Signet., card.getBlueprint().getSignet()); - //assertEquals(, card.getBlueprint().getSiteNumber()); // Change this to getAllyHomeSiteNumbers for allies + var stone = scn.GetFreepsCard("stone"); + assertTrue(stone.getBlueprint().isUnique()); + assertEquals(Side.FREE_PEOPLE, stone.getBlueprint().getSide()); + assertEquals(Culture.GONDOR, stone.getBlueprint().getCulture()); + assertEquals(CardType.CONDITION, stone.getBlueprint().getCardType()); + assertTrue(scn.HasKeyword(stone, Keyword.SUPPORT_AREA)); + assertTrue(scn.HasKeyword(stone, Keyword.TALE)); + assertEquals(3, stone.getBlueprint().getTwilightCost()); } - //@Test - public void TheFaithfulStoneTest1() throws DecisionResultInvalidException, CardNotFoundException { + @Test + public void TheFaithfulStoneAddsTokenWhenNonRingwraithMinionPlayedIfManCanBeSpotted() throws DecisionResultInvalidException, CardNotFoundException { //Pre-game setup GenericCardTestHelper scn = GetScenario(); - PhysicalCardImpl card = scn.GetFreepsCard("card"); - scn.FreepsMoveCardToHand(card); + var stone = scn.GetFreepsCard("stone"); + var boromir = scn.GetFreepsCard("boromir"); + scn.FreepsMoveCardToSupportArea(stone); + scn.FreepsMoveCharToTable(boromir); + + var uruk = scn.GetShadowCard("uruk"); + scn.ShadowMoveCardToHand(uruk); scn.StartGame(); - scn.FreepsPlayCard(card); + scn.FreepsPassCurrentPhaseAction(); - assertEquals(3, scn.GetTwilight()); + assertEquals(0, scn.GetCultureTokensOn(stone)); + scn.ShadowPlayCard(uruk); + assertEquals(1, scn.GetCultureTokensOn(stone)); + } + + @Test + public void TheFaithfulStoneAddsTokenWhenNonRingwraithMinionPlayedIfShadowManCanBeSpotted() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + GenericCardTestHelper scn = GetScenario(); + + var stone = scn.GetFreepsCard("stone"); + scn.FreepsMoveCardToSupportArea(stone); + + var uruk = scn.GetShadowCard("uruk"); + var dunlender = scn.GetShadowCard("ravager"); + scn.ShadowMoveCardToHand(uruk); + scn.ShadowMoveCharToTable(dunlender); + + scn.StartGame(); + scn.FreepsPassCurrentPhaseAction(); + + assertEquals(0, scn.GetCultureTokensOn(stone)); + scn.ShadowPlayCard(uruk); + assertEquals(1, scn.GetCultureTokensOn(stone)); + } + + @Test + public void TheFaithfulStoneAddsNoTokenIfManCannotBeSpotted() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + GenericCardTestHelper scn = GetScenario(); + + var stone = scn.GetFreepsCard("stone"); + scn.FreepsMoveCardToSupportArea(stone); + + var uruk = scn.GetShadowCard("uruk"); + scn.ShadowMoveCardToHand(uruk); + + scn.StartGame(); + scn.FreepsPassCurrentPhaseAction(); + + assertEquals(0, scn.GetCultureTokensOn(stone)); + scn.ShadowPlayCard(uruk); + assertEquals(0, scn.GetCultureTokensOn(stone)); + } + + @Test + public void TheFaithfulStoneAddsNoTokenWhenRingwraithMinionIsPlayed() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + GenericCardTestHelper scn = GetScenario(); + + var stone = scn.GetFreepsCard("stone"); + scn.FreepsMoveCardToSupportArea(stone); + + var morc = scn.GetShadowCard("morc"); + scn.ShadowMoveCardToHand(morc); + + scn.StartGame(); + scn.SetTwilight(10); + scn.FreepsPassCurrentPhaseAction(); + + assertEquals(0, scn.GetCultureTokensOn(stone)); + scn.ShadowPlayCard(morc); + assertEquals(0, scn.GetCultureTokensOn(stone)); + } + + @Test + public void TheFaithfulStoneManueverActionCannotBeUsedIfLessThan3Tokens() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + GenericCardTestHelper scn = GetScenario(); + + var stone = scn.GetFreepsCard("stone"); + var boromir = scn.GetFreepsCard("boromir"); + scn.FreepsMoveCardToSupportArea(stone); + scn.FreepsMoveCharToTable(boromir); + + var uruk = scn.GetShadowCard("uruk"); + scn.ShadowMoveCharToTable(uruk); + + scn.StartGame(); + scn.AddTokensToCard(stone, 2); + scn.SkipToPhase(Phase.MANEUVER); + + assertFalse(scn.FreepsActionAvailable(stone)); + } + + @Test + public void TheFaithfulStoneManueverActionRemoves3TokensToPreventAssigningTargetMinion() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + GenericCardTestHelper scn = GetScenario(); + + var stone = scn.GetFreepsCard("stone"); + scn.FreepsMoveCardToSupportArea(stone); + + var uruk = scn.GetShadowCard("uruk"); + scn.ShadowMoveCharToTable(uruk); + + scn.StartGame(); + scn.AddTokensToCard(stone, 3); + scn.SkipToPhase(Phase.MANEUVER); + + scn.SetTwilight(0); + assertTrue(scn.FreepsActionAvailable(stone)); + assertEquals(3, scn.GetCultureTokensOn(stone)); + scn.FreepsUseCardAction(stone); + assertEquals(0, scn.GetCultureTokensOn(stone)); + + // Maneuver actions + scn.ShadowPassCurrentPhaseAction(); + scn.FreepsPassCurrentPhaseAction(); + //Both pass Archery actions + scn.PassCurrentPhaseActions(); + //Both pass Assignment actions + scn.PassCurrentPhaseActions(); + //Both pass Fierce Assignment actions + scn.PassCurrentPhaseActions(); + + //We are now straight to the Regroup phase as there are no assignable minions + assertEquals(Phase.REGROUP, scn.GetCurrentPhase()); + } + + @Test + public void TheFaithfulStoneManueverActionCanBePreventedByShadowRemoving2Twilight() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + GenericCardTestHelper scn = GetScenario(); + + var stone = scn.GetFreepsCard("stone"); + scn.FreepsMoveCardToSupportArea(stone); + + var uruk = scn.GetShadowCard("uruk"); + scn.ShadowMoveCharToTable(uruk); + + scn.StartGame(); + scn.AddTokensToCard(stone, 3); + scn.SkipToPhase(Phase.MANEUVER); + + scn.SetTwilight(2); + assertTrue(scn.FreepsActionAvailable(stone)); + assertEquals(3, scn.GetCultureTokensOn(stone)); + scn.FreepsUseCardAction(stone); + assertEquals(0, scn.GetCultureTokensOn(stone)); + + assertEquals(2, scn.GetTwilight()); + assertTrue(scn.ShadowDecisionAvailable("Would you like to remove (2) to allow")); + scn.ShadowChooseYes(); + assertEquals(0, scn.GetTwilight()); + + scn.SkipToAssignments(); + assertTrue(scn.FreepsDecisionAvailable("assign")); } }