From c71ef2bac2b426c57ffcab7c501189c038db8093 Mon Sep 17 00:00:00 2001 From: Christian 'ketura' McCarty Date: Tue, 28 May 2024 23:18:28 -0500 Subject: [PATCH] Fixing resistancelessthanfilter to use the superior logic contained in strengthlessthanfilter. Unifying most of the underlying strength comparison filters to use the min/max verbiage and logic --- .../field/effect/filter/FilterFactory.java | 22 ++- .../com/gempukku/lotro/filters/Filters.java | 8 +- .../official/set11/Card_11_170_Tests.java | 138 ++++++++++++++++-- 3 files changed, 141 insertions(+), 27 deletions(-) diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/filter/FilterFactory.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/filter/FilterFactory.java index e9247d851..7f2a7633e 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/filter/FilterFactory.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/filter/FilterFactory.java @@ -533,16 +533,13 @@ public class FilterFactory { parameterFilters.put("resistancelessthanfilter", (parameter, environment) -> { FilterableSource filter = environment.getFilterFactory().createFilter(parameter, environment); - return (actionContext) -> { - Filterable filterable = filter.getFilterable(actionContext); - return new Filter() { - @Override - public boolean accepts(LotroGame game, PhysicalCard physicalCard) { - int resistance = game.getModifiersQuerying().getResistance(game, physicalCard); - return Filters.countActive(game, filterable, Filters.minResistance(resistance + 1)) > 0; + int resistance = 0; + LotroGame game = actionContext.getGame(); + for (PhysicalCard physicalCard : Filters.filterActive(game, filter.getFilterable(actionContext))) { + resistance += game.getModifiersQuerying().getResistance(game, physicalCard); } - }; + return Filters.maxResistance(resistance - 1); }; }); parameterFilters.put("maxresistance", @@ -604,16 +601,17 @@ public class FilterFactory { for (PhysicalCard physicalCard : Filters.filterActive(game, filter.getFilterable(actionContext))) { strength += game.getModifiersQuerying().getStrength(game, physicalCard); } - return Filters.lessStrengthThan(strength); + return Filters.maxStrength(strength - 1); }; }); + parameterFilters.put("maxstrength", (parameter, environment) -> { final ValueSource valueSource = ValueResolver.resolveEvaluator(parameter, environment); return (actionContext) -> { int amount = valueSource.getEvaluator(actionContext).evaluateExpression(actionContext.getGame(), null); - return Filters.lessStrengthThan(amount + 1); + return Filters.maxStrength(amount); }; }); parameterFilters.put("minstrength", @@ -622,7 +620,7 @@ public class FilterFactory { return (actionContext) -> { int amount = valueSource.getEvaluator(actionContext).evaluateExpression(actionContext.getGame(), null); - return Filters.moreStrengthThan(amount - 1); + return Filters.minStrength(amount); }; }); parameterFilters.put("strengthlessthan", @@ -631,7 +629,7 @@ public class FilterFactory { return (actionContext) -> { int amount = valueSource.getEvaluator(actionContext).evaluateExpression(actionContext.getGame(), null); - return Filters.lessStrengthThan(amount); + return Filters.maxStrength(amount - 1); }; }); parameterFilters.put("title", parameterFilters.get("name")); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/filters/Filters.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/filters/Filters.java index b8aa81bde..0aa9d4168 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/filters/Filters.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/filters/Filters.java @@ -126,12 +126,12 @@ public class Filters { return (game, physicalCard) -> game.getModifiersQuerying().getStrength(game, physicalCard) == evaluator.evaluateExpression(game, null); } - public static Filter moreStrengthThan(final int strength) { - return (game, physicalCard) -> game.getModifiersQuerying().getStrength(game, physicalCard) > strength; + public static Filter minStrength(final int strength) { + return (game, physicalCard) -> game.getModifiersQuerying().getStrength(game, physicalCard) >= strength; } - public static Filter lessStrengthThan(final int strength) { - return (game, physicalCard) -> game.getModifiersQuerying().getStrength(game, physicalCard) < strength; + public static Filter maxStrength(final int strength) { + return (game, physicalCard) -> game.getModifiersQuerying().getStrength(game, physicalCard) <= strength; } private static Filter possessionClass(final PossessionClass possessionClass) { diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set11/Card_11_170_Tests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set11/Card_11_170_Tests.java index dff85e578..7ad18e467 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set11/Card_11_170_Tests.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set11/Card_11_170_Tests.java @@ -18,10 +18,25 @@ public class Card_11_170_Tests return new GenericCardTestHelper( new HashMap<>() {{ - put("card", "11_170"); - // put other cards in here as needed for the test case + put("pippin", "11_170"); + put("gimli", "11_8"); + put("legolas", "11_21"); + put("sam", "1_311"); + + put("runner1", "1_178"); + put("runner2", "1_178"); + }}, + new HashMap<>() {{ + put("site1", "1_319"); + put("site2", "1_329"); // Breeland Forest + put("site3", "1_337"); + put("site4", "1_343"); + put("site5", "1_349"); + put("site6", "1_351"); + put("site7", "1_353"); + put("site8", "1_356"); + put("site9", "1_360"); }}, - GenericCardTestHelper.FellowshipSites, GenericCardTestHelper.FOTRFrodo, GenericCardTestHelper.RulingRing ); @@ -47,7 +62,7 @@ public class Card_11_170_Tests var scn = GetScenario(); - var card = scn.GetFreepsCard("card"); + var card = scn.GetFreepsCard("pippin"); assertEquals("Pippin", card.getBlueprint().getTitle()); assertEquals("Brave Decoy", card.getBlueprint().getSubtitle()); @@ -62,18 +77,119 @@ public class Card_11_170_Tests assertEquals(9, card.getBlueprint().getResistance()); } - // Uncomment any @Test markers below once this is ready to be used - //@Test - public void PippinTest1() throws DecisionResultInvalidException, CardNotFoundException { + @Test + public void PippinAbilityWorksOnLowerResCompanionButNotEqual() throws DecisionResultInvalidException, CardNotFoundException { //Pre-game setup var scn = GetScenario(); - var card = scn.GetFreepsCard("card"); - scn.FreepsMoveCardToHand(card); + var pippin = scn.GetFreepsCard("pippin"); + var gimli = scn.GetFreepsCard("gimli"); + var legolas = scn.GetFreepsCard("legolas"); + scn.FreepsMoveCharToTable(pippin, gimli, legolas); + + var runner1 = scn.GetShadowCard("runner1"); + var runner2 = scn.GetShadowCard("runner2"); + scn.ShadowMoveCharToTable(runner1, runner2); scn.StartGame(); - scn.FreepsPlayCard(card); - assertEquals(1, scn.GetTwilight()); + scn.SkipToAssignments(); + scn.FreepsAssignToMinions( + new PhysicalCardImpl[] { gimli, runner1 }, + new PhysicalCardImpl[] { legolas, runner2 } + ); + + //9 - 1 from the bid burden + assertEquals(8, scn.GetResistance(pippin)); + //7 - 1; Gimli is an eligible target for Pippin's ability + assertEquals(6, scn.GetResistance(gimli)); + //7 - 1 + 2 from Legolas' ability; Legolas is not an eligible target + assertEquals(8, scn.GetResistance(legolas)); + + scn.FreepsResolveSkirmish(gimli); + assertTrue(scn.IsCharSkirmishing(runner1)); + assertTrue(scn.IsCharSkirmishing(gimli)); + assertFalse(scn.IsCharSkirmishing(pippin)); + assertTrue(scn.FreepsActionAvailable(pippin)); + + scn.FreepsUseCardAction(pippin); + assertTrue(scn.IsCharSkirmishing(runner1)); + assertFalse(scn.IsCharSkirmishing(gimli)); + assertTrue(scn.IsCharSkirmishing(pippin)); + + scn.ShadowPassCurrentPhaseAction(); + scn.FreepsPassCurrentPhaseAction(); + + scn.FreepsResolveSkirmish(legolas); + //check that pippin didn't die lol + assertEquals(Zone.FREE_CHARACTERS, pippin.getZone()); + assertTrue(scn.IsCharSkirmishing(runner2)); + assertTrue(scn.IsCharSkirmishing(legolas)); + assertFalse(scn.IsCharSkirmishing(pippin)); + assertFalse(scn.FreepsActionAvailable(pippin)); + } + + @Test + public void PippinAbilityDoesNotWorkIfPippinAssignedToSkirmish() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + var scn = GetScenario(); + + var pippin = scn.GetFreepsCard("pippin"); + var gimli = scn.GetFreepsCard("gimli"); + scn.FreepsMoveCharToTable(pippin, gimli); + + var runner1 = scn.GetShadowCard("runner1"); + var runner2 = scn.GetShadowCard("runner2"); + scn.ShadowMoveCharToTable(runner1, runner2); + + scn.StartGame(); + + scn.SkipToAssignments(); + scn.FreepsAssignToMinions( + new PhysicalCardImpl[] { gimli, runner1 }, + new PhysicalCardImpl[] { pippin, runner2 } + ); + + //9 - 1 from the bid burden + assertEquals(8, scn.GetResistance(pippin)); + //7 - 1; Gimli is an eligible target for Pippin's ability + assertEquals(6, scn.GetResistance(gimli)); + + scn.FreepsResolveSkirmish(pippin); + assertTrue(scn.IsCharSkirmishing(runner2)); + assertTrue(scn.IsCharSkirmishing(pippin)); + assertFalse(scn.IsCharSkirmishing(gimli)); + assertFalse(scn.FreepsActionAvailable(pippin)); + } + + @Test + public void PippinAbilityDoesNotWorkOnRingBoundCompanion() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + var scn = GetScenario(); + + var pippin = scn.GetFreepsCard("pippin"); + var sam = scn.GetFreepsCard("sam"); + scn.FreepsMoveCharToTable(pippin, sam); + + var runner1 = scn.GetShadowCard("runner1"); + scn.ShadowMoveCharToTable(runner1); + + scn.StartGame(); + + scn.SkipToAssignments(); + scn.FreepsAssignToMinions( + new PhysicalCardImpl[] { sam, runner1 } + ); + + //9 - 1 from the bid burden + assertEquals(8, scn.GetResistance(pippin)); + //5 - 1; Sam is theoretically an eligible target for Pippin's ability + assertEquals(4, scn.GetResistance(sam)); + + scn.FreepsResolveSkirmish(sam); + assertTrue(scn.IsCharSkirmishing(runner1)); + assertTrue(scn.IsCharSkirmishing(sam)); + assertFalse(scn.IsCharSkirmishing(pippin)); + assertFalse(scn.FreepsActionAvailable(pippin)); } }