diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/CardResolver.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/CardResolver.java index 40542f765..db11c067c 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/CardResolver.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/CardResolver.java @@ -73,8 +73,14 @@ public class CardResolver { public static EffectAppender resolveStackedCards(String type, FilterableSource choiceFilter, FilterableSource playabilityFilter, ValueSource countSource, FilterableSource stackedOn, String memory, String choicePlayer, String choiceText, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { Function> cardSource = actionContext -> { - final Filterable stackedOnFilter = stackedOn.getFilterable(actionContext); - return Filters.filter(actionContext.getGame(), actionContext.getGame().getGameState().getAllCards(), Filters.stackedOn(stackedOnFilter)); + if(stackedOn != null) { + final Filterable stackedOnFilter = stackedOn.getFilterable(actionContext); + return Filters.filter(actionContext.getGame(), actionContext.getGame().getGameState().getAllCards(), Filters.stackedOn(stackedOnFilter)); + } + else { + return Filters.filter(actionContext.getGame(), actionContext.getGame().getGameState().getAllCards(), Filters.stackedOn(Filters.any)); + } + }; if (type.startsWith("memory(") && type.endsWith(")")) { diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set04/Card_04_199_Tests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set04/Card_04_199_Tests.java index 9a8a32cf3..6d1b7ea91 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set04/Card_04_199_Tests.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set04/Card_04_199_Tests.java @@ -17,8 +17,8 @@ public class Card_04_199_Tests return new GenericCardTestHelper( new HashMap<>() {{ - put("card", "4_199"); - // put other cards in here as needed for the test case + put("trooper", "4_199"); + put("child", "4_148"); // source of easy site control }}, GenericCardTestHelper.FellowshipSites, GenericCardTestHelper.FOTRFrodo, @@ -41,12 +41,13 @@ public class Card_04_199_Tests * Strength: 9 * Vitality: 2 * Site Number: 5 - * Game Text: Damage +1.
Regroup: Stack this minion on a site you control.
Shadow: If stacked on a site you control, play this minion. Its twilight cost is -1. + * Game Text: Damage +1.
Regroup: Stack this minion on a site you control. + * Shadow: If stacked on a site you control, play this minion. Its twilight cost is -1. */ var scn = GetScenario(); - var card = scn.GetFreepsCard("card"); + var card = scn.GetFreepsCard("trooper"); assertEquals("Uruk Trooper", card.getBlueprint().getTitle()); assertNull(card.getBlueprint().getSubtitle()); @@ -63,18 +64,70 @@ public class Card_04_199_Tests assertEquals(5, card.getBlueprint().getSiteNumber()); } - // Uncomment any @Test markers below once this is ready to be used - //@Test - public void UrukTrooperTest1() throws DecisionResultInvalidException, CardNotFoundException { + @Test + public void UrukTrooperRegroupActionStacksSelfOnControlledSite() throws DecisionResultInvalidException, CardNotFoundException { //Pre-game setup var scn = GetScenario(); - var card = scn.GetFreepsCard("card"); - scn.FreepsMoveCardToHand(card); + var trooper = scn.GetShadowCard("trooper"); + var child = scn.GetShadowCard("child"); + scn.ShadowMoveCardToHand(child, trooper); scn.StartGame(); - scn.FreepsPlayCard(card); - assertEquals(4, scn.GetTwilight()); + scn.SkipToSite(2); + + scn.ShadowMoveCardToSupportArea(child); + scn.AddTokensToCard(child, 2); + scn.FreepsPassCurrentPhaseAction(); + scn.ShadowUseCardAction(child); //should take control of site + + scn.ShadowMoveCharToTable(trooper); + scn.SkipToPhase(Phase.REGROUP); + scn.FreepsPassCurrentPhaseAction(); + + var controlledSite = scn.GetFreepsSite(1); + assertTrue(scn.IsSiteControlled(controlledSite)); + assertTrue(scn.ShadowActionAvailable(trooper)); + + scn.ShadowUseCardAction(trooper); + assertEquals(controlledSite, trooper.getStackedOn()); + assertEquals(Zone.STACKED, trooper.getZone()); + } + + @Test + public void UrukTrooperShadowActionPlaysSelfFromControlledSite() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + var scn = GetScenario(); + + var trooper = scn.GetShadowCard("trooper"); + var child = scn.GetShadowCard("child"); + scn.ShadowMoveCardToHand(child, trooper); + + scn.StartGame(); + + scn.SkipToSite(2); + + scn.ShadowMoveCardToSupportArea(child); + scn.AddTokensToCard(child, 2); + scn.FreepsPassCurrentPhaseAction(); + scn.ShadowUseCardAction(child); //should take control of site + + scn.SkipToSite(4); + var controlledSite = scn.GetFreepsSite(1); + assertTrue(scn.IsSiteControlled(controlledSite)); + scn.StackCardsOn(controlledSite, trooper); + scn.SetTwilight(48); + + scn.FreepsPassCurrentPhaseAction(); + assertEquals(controlledSite, trooper.getStackedOn()); + assertEquals(Zone.STACKED, trooper.getZone()); + + assertTrue(scn.ShadowActionAvailable(trooper)); + assertEquals(50, scn.GetTwilight()); + scn.ShadowUseCardAction(trooper); + assertEquals(Zone.SHADOW_CHARACTERS, trooper.getZone()); + // Trooper cost 4, but should have a -1 discount, so costs 3 + 2 for roaming + assertEquals(45, scn.GetTwilight()); } } diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set04/Card_04_201_Tests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set04/Card_04_201_Tests.java index 8d357c760..43789a9ca 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set04/Card_04_201_Tests.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set04/Card_04_201_Tests.java @@ -17,8 +17,8 @@ public class Card_04_201_Tests return new GenericCardTestHelper( new HashMap<>() {{ - put("card", "4_201"); - // put other cards in here as needed for the test case + put("veteran", "4_201"); + put("child", "4_148"); // source of easy site control }}, GenericCardTestHelper.FellowshipSites, GenericCardTestHelper.FOTRFrodo, @@ -46,7 +46,7 @@ public class Card_04_201_Tests var scn = GetScenario(); - var card = scn.GetFreepsCard("card"); + var card = scn.GetFreepsCard("veteran"); assertEquals("Uruk Veteran", card.getBlueprint().getTitle()); assertNull(card.getBlueprint().getSubtitle()); @@ -63,18 +63,70 @@ public class Card_04_201_Tests assertEquals(5, card.getBlueprint().getSiteNumber()); } - // Uncomment any @Test markers below once this is ready to be used - //@Test - public void UrukVeteranTest1() throws DecisionResultInvalidException, CardNotFoundException { + @Test + public void UrukVeteranRegroupActionStacksSelfOnControlledSite() throws DecisionResultInvalidException, CardNotFoundException { //Pre-game setup var scn = GetScenario(); - var card = scn.GetFreepsCard("card"); - scn.FreepsMoveCardToHand(card); + var veteran = scn.GetShadowCard("veteran"); + var child = scn.GetShadowCard("child"); + scn.ShadowMoveCardToHand(child, veteran); scn.StartGame(); - scn.FreepsPlayCard(card); - assertEquals(3, scn.GetTwilight()); + scn.SkipToSite(2); + + scn.ShadowMoveCardToSupportArea(child); + scn.AddTokensToCard(child, 2); + scn.FreepsPassCurrentPhaseAction(); + scn.ShadowUseCardAction(child); //should take control of site + + scn.ShadowMoveCharToTable(veteran); + scn.SkipToPhase(Phase.REGROUP); + scn.FreepsPassCurrentPhaseAction(); + + var controlledSite = scn.GetFreepsSite(1); + assertTrue(scn.IsSiteControlled(controlledSite)); + assertTrue(scn.ShadowActionAvailable(veteran)); + + scn.ShadowUseCardAction(veteran); + assertEquals(controlledSite, veteran.getStackedOn()); + assertEquals(Zone.STACKED, veteran.getZone()); + } + + @Test + public void UrukVeteranShadowActionPlaysSelfFromControlledSite() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + var scn = GetScenario(); + + var veteran = scn.GetShadowCard("veteran"); + var child = scn.GetShadowCard("child"); + scn.ShadowMoveCardToHand(child, veteran); + + scn.StartGame(); + + scn.SkipToSite(2); + + scn.ShadowMoveCardToSupportArea(child); + scn.AddTokensToCard(child, 2); + scn.FreepsPassCurrentPhaseAction(); + scn.ShadowUseCardAction(child); //should take control of site + + scn.SkipToSite(4); + var controlledSite = scn.GetFreepsSite(1); + assertTrue(scn.IsSiteControlled(controlledSite)); + scn.StackCardsOn(controlledSite, veteran); + scn.SetTwilight(48); + + scn.FreepsPassCurrentPhaseAction(); + assertEquals(controlledSite, veteran.getStackedOn()); + assertEquals(Zone.STACKED, veteran.getZone()); + + assertTrue(scn.ShadowActionAvailable(veteran)); + assertEquals(50, scn.GetTwilight()); + scn.ShadowUseCardAction(veteran); + assertEquals(Zone.SHADOW_CHARACTERS, veteran.getZone()); + // Trooper cost 3, but should have a -1 discount, so costs 2 + 2 for roaming + assertEquals(46, scn.GetTwilight()); } }