diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/RemoveTokensCumulative.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/RemoveTokensCumulative.java index c6e0503aa..b2324be4d 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/RemoveTokensCumulative.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/RemoveTokensCumulative.java @@ -19,6 +19,8 @@ import com.gempukku.lotro.logic.modifiers.ModifierFlag; import com.gempukku.lotro.logic.timing.Effect; import org.json.simple.JSONObject; +import java.util.Collection; + public class RemoveTokensCumulative implements EffectAppenderProducer { @Override public EffectAppender createEffectAppender(boolean cost, JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { @@ -35,7 +37,12 @@ public class RemoveTokensCumulative implements EffectAppenderProducer { String memory = "_temp"; EffectAppender resolveCardEffect = CardResolver.resolveCard("choose(" + filter + ")", - actionContext -> Filters.hasToken(token, 1), + actionContext -> { + if(token == null) + return Filters.hasAnyCultureTokens(); + + return Filters.hasToken(token, 1); + }, memory, "you", "Choose card to remove a token from", environment); EffectAppender removeTokenEffect = new DelayedAppender() { @@ -43,7 +50,15 @@ public class RemoveTokensCumulative implements EffectAppenderProducer { protected Effect createEffect(boolean cost, CostToEffectAction action, ActionContext actionContext) { PhysicalCard cardFromMemory = actionContext.getCardFromMemory(memory); if (cardFromMemory != null) { - return new RemoveTokenEffect(actionContext.getPerformingPlayer(), actionContext.getSource(), cardFromMemory, token, 1); + if(token == null) { + return new RemoveTokenEffect(actionContext.getPerformingPlayer(), actionContext.getSource(), cardFromMemory, + Token.findTokenForCulture(cardFromMemory.getBlueprint().getCulture()), 1); + } + else { + return new RemoveTokenEffect(actionContext.getPerformingPlayer(), actionContext.getSource(), cardFromMemory, + token, 1); + } + } else { return null; } @@ -59,9 +74,26 @@ public class RemoveTokensCumulative implements EffectAppenderProducer { final int requiredCount = valueSource.getEvaluator(actionContext).evaluateExpression(game, null); + Collection targets; + + if(token == null) { + targets = Filters.filterActive(actionContext.getGame(), Filters.hasAnyCultureTokens(), filterableSource.getFilterable(actionContext)); + } + else { + targets = Filters.filterActive(actionContext.getGame(), Filters.hasToken(token), filterableSource.getFilterable(actionContext)); + } + int totalCount = 0; - for (PhysicalCard physicalCard : Filters.filterActive(actionContext.getGame(), Filters.hasToken(token), filterableSource.getFilterable(actionContext))) { - Integer count = actionContext.getGame().getGameState().getTokens(physicalCard).get(token); + for (var card : targets) { + Integer count = null; + if(token == null){ + count = actionContext.getGame().getGameState().getTokens(card) + .get(Token.findTokenForCulture(card.getBlueprint().getCulture())); + } + else { + count = actionContext.getGame().getGameState().getTokens(card).get(token); + } + if (count != null) { totalCount += count; if (totalCount >= requiredCount) diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set08/Card_08_054_Tests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set08/Card_08_054_Tests.java index df22613d5..1afb4337a 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set08/Card_08_054_Tests.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set08/Card_08_054_Tests.java @@ -17,8 +17,9 @@ public class Card_08_054_Tests return new GenericCardTestHelper( new HashMap<>() {{ - put("card", "8_54"); - // put other cards in here as needed for the test case + put("freebooter", "8_54"); + put("wargalley", "8_59"); + put("leaders", "7_112"); }}, GenericCardTestHelper.FellowshipSites, GenericCardTestHelper.FOTRFrodo, @@ -46,7 +47,7 @@ public class Card_08_054_Tests var scn = GetScenario(); - var card = scn.GetFreepsCard("card"); + var card = scn.GetFreepsCard("freebooter"); assertEquals("Corsair Freebooter", card.getBlueprint().getTitle()); assertNull(card.getBlueprint().getSubtitle()); @@ -62,18 +63,40 @@ public class Card_08_054_Tests assertEquals(4, card.getBlueprint().getSiteNumber()); } - // Uncomment any @Test markers below once this is ready to be used - //@Test - public void CorsairFreebooterTest1() throws DecisionResultInvalidException, CardNotFoundException { + @Test + public void CorsairFreebooterRemovesArbitraryTokensToReinforceRaiderTokenTwice() throws DecisionResultInvalidException, CardNotFoundException { //Pre-game setup var scn = GetScenario(); - var card = scn.GetFreepsCard("card"); - scn.FreepsMoveCardToHand(card); + var freebooter = scn.GetShadowCard("freebooter"); + var wargalley = scn.GetShadowCard("wargalley"); + scn.ShadowMoveCardToHand(freebooter); + scn.ShadowMoveCardToSupportArea(wargalley); + + var leaders = scn.GetFreepsCard("leaders"); + scn.FreepsMoveCardToSupportArea(leaders); scn.StartGame(); - scn.FreepsPlayCard(card); + scn.SetTwilight(10); + scn.AddTokensToCard(leaders, 3); + scn.AddTokensToCard(wargalley, 1); - assertEquals(3, scn.GetTwilight()); + scn.FreepsPassCurrentPhaseAction(); + + assertTrue(scn.ShadowPlayAvailable(freebooter)); + assertEquals(3, scn.GetCultureTokensOn(leaders)); + assertEquals(1, scn.GetCultureTokensOn(wargalley)); + + scn.ShadowPlayCard(freebooter); + assertTrue(scn.ShadowHasOptionalTriggerAvailable()); + + scn.ShadowAcceptOptionalTrigger(); + //Both Noble Leaders and Corsair War Galley have tokens on them to remove + assertEquals(2, scn.ShadowGetCardChoiceCount()); + scn.ShadowChooseCard(leaders); + scn.ShadowChooseCard(leaders); + + assertEquals(1, scn.GetCultureTokensOn(leaders)); + assertEquals(3, scn.GetCultureTokensOn(wargalley)); } }