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.

This commit is contained in:
Christian 'ketura' McCarty
2023-03-11 14:51:27 -06:00
parent c58152bcc8
commit e9b1d3296b
3 changed files with 421 additions and 43 deletions

View File

@@ -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: <b>Tale.</b> Each time a non-[wraith] minion is played, you may spot a Man to put a [gondor] token here.<br><b>Maneuver:</b> 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.

View File

@@ -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: <b>Tale.</b> Each time a non-[wraith] minion is played, you may spot a Man to put a [gondor] token here.<br><b>Maneuver:</b> 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"));
}
}

View File

@@ -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<String, String>()
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"));
}
}