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"));
}
}