From 8f56866ad0d380bc99c71d14140c064422e2676e Mon Sep 17 00:00:00 2001 From: Christian 'ketura' McCarty Date: Mon, 7 Apr 2025 18:23:33 -0500 Subject: [PATCH] Fixed V2 An End Worthy of Remembrance never being playable --- .../cards/unofficial/pc/setV02/V2-Rohan.hjson | 43 ++--- .../pc/vsets/set_v02/Card_V2_046_Tests.java | 161 ++++++++++++++++-- 2 files changed, 174 insertions(+), 30 deletions(-) diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV02/V2-Rohan.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV02/V2-Rohan.hjson index 33731db33..88f93a9c6 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV02/V2-Rohan.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV02/V2-Rohan.hjson @@ -84,17 +84,19 @@ timewords: Skirmish effects: { type: event - requires: { - type: CanSpot - filter: HasCultureTokenCount(2,rohan) - } + requires: [ + { + type: CanSpot + filter: condition,HasCultureTokenCount(2,rohan) + } + ] cost: [ { type: ChooseActiveCards text: Choose how many {rohan} conditions to remove 2 tokens from. count: { type: Range - from: 0 + from: 1 to: { type: ForEachYouCanSpot filter: condition,HasCultureTokenCount(2,rohan) @@ -102,23 +104,26 @@ } select: choose(HasCultureTokenCount(2,rohan)) memorize: chosenConditions - } - { - type: RemoveCultureTokens - select: memory(chosenConditions) - count: 2 - ignoreCostCheckFailure: true - } + } ] effect: [ { - type: ModifyStrength - select: choose(valiant, companion) - count: 3 - until: start(regroup) - amount: { - type: ForEachInMemory - memory: chosenConditions + type: CostToEffect + cost: { + type: RemoveCultureTokens + select: memory(chosenConditions) + count: 2 + ignoreCostCheckFailure: true + } + effect: { + type: ModifyStrength + select: choose(valiant, companion) + count: 3 + until: start(regroup) + amount: { + type: ForEachInMemory + memory: chosenConditions + } } } ] diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v02/Card_V2_046_Tests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v02/Card_V2_046_Tests.java index 61dfa8400..c4ff396c1 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v02/Card_V2_046_Tests.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v02/Card_V2_046_Tests.java @@ -3,7 +3,6 @@ package com.gempukku.lotro.cards.unofficial.pc.vsets.set_v02; 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 org.junit.Test; @@ -18,8 +17,16 @@ public class Card_V2_046_Tests return new GenericCardTestHelper( new HashMap<>() {{ - put("card", "102_46"); - // put other cards in here as needed for the test case + put("end", "102_46"); + put("fortress", "4_276"); + put("none", "6_97"); + put("doom", "8_86"); + put("vhaldir", "102_8"); + put("vgimli", "55_7"); + put("veowyn", "4_270"); + put("veomer", "6_92"); + + put("runner", "1_178"); }}, GenericCardTestHelper.FellowshipSites, GenericCardTestHelper.FOTRFrodo, @@ -44,7 +51,7 @@ public class Card_V2_046_Tests var scn = GetScenario(); - var card = scn.GetFreepsCard("card"); + var card = scn.GetFreepsCard("end"); assertEquals("An End Worthy of Remembrance", card.getBlueprint().getTitle()); assertNull(card.getBlueprint().getSubtitle()); @@ -56,18 +63,150 @@ public class Card_V2_046_Tests assertEquals(2, card.getBlueprint().getTwilightCost()); } - // Uncomment any @Test markers below once this is ready to be used - //@Test - public void AnEndWorthyofRemembranceTest1() throws DecisionResultInvalidException, CardNotFoundException { + @Test + public void AnEndWorthyofRemembrancePumps3ValiantCompanions() throws DecisionResultInvalidException, CardNotFoundException { //Pre-game setup var scn = GetScenario(); - var card = scn.GetFreepsCard("card"); - scn.FreepsMoveCardToHand(card); + var end = scn.GetFreepsCard("end"); + var fortress = scn.GetFreepsCard("fortress"); + var none = scn.GetFreepsCard("none"); + var doom = scn.GetFreepsCard("doom"); + var vhaldir = scn.GetFreepsCard("vhaldir"); + var vgimli = scn.GetFreepsCard("vgimli"); + var veowyn = scn.GetFreepsCard("veowyn"); + var veomer = scn.GetFreepsCard("veomer"); + scn.FreepsMoveCardToHand(end); + scn.FreepsMoveCardToSupportArea(fortress, none, doom); + scn.FreepsMoveCharToTable(vhaldir, vgimli, veowyn, veomer); + scn.AddTokensToCard(fortress, 3); + scn.AddTokensToCard(none, 3); + scn.AddTokensToCard(doom, 3); + + var runner = scn.GetShadowCard("runner"); + scn.ShadowMoveCharToTable(runner); scn.StartGame(); - scn.FreepsPlayCard(card); + scn.SkipToAssignments(); + scn.FreepsAssignToMinions(vgimli, runner); + scn.FreepsResolveSkirmish(vgimli); - assertEquals(2, scn.GetTwilight()); + assertEquals(3, scn.GetCultureTokensOn(fortress)); + assertEquals(3, scn.GetCultureTokensOn(none)); + assertEquals(3, scn.GetCultureTokensOn(doom)); + assertEquals(6, scn.GetStrength(vhaldir)); + assertEquals(6, scn.GetStrength(vgimli)); + assertEquals(6, scn.GetStrength(veowyn)); + assertEquals(7, scn.GetStrength(veomer)); + + assertTrue(scn.FreepsPlayAvailable(end)); + scn.FreepsPlayCard(end); + scn.FreepsChooseCards(fortress, none, doom); + + assertEquals(3, scn.FreepsGetChoiceMax()); + scn.FreepsChooseCards(vgimli, vhaldir, veowyn); + assertEquals(1, scn.GetCultureTokensOn(fortress)); + assertEquals(1, scn.GetCultureTokensOn(none)); + assertEquals(1, scn.GetCultureTokensOn(doom)); + assertEquals(9, scn.GetStrength(vhaldir)); + assertEquals(9, scn.GetStrength(vgimli)); + assertEquals(9, scn.GetStrength(veowyn)); + assertEquals(7, scn.GetStrength(veomer)); + + scn.ShadowPassCurrentPhaseAction(); + scn.FreepsPassCurrentPhaseAction(); + scn.FreepsDeclineOptionalTrigger(); + + assertEquals(Phase.REGROUP, scn.GetCurrentPhase()); + assertEquals(6, scn.GetStrength(vhaldir)); + assertEquals(6, scn.GetStrength(vgimli)); + assertEquals(6, scn.GetStrength(veowyn)); + assertEquals(7, scn.GetStrength(veomer)); + } + + @Test + public void AnEndWorthyofRemembranceCannotPlayIfNoConditionsWith2RohanTokens() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + var scn = GetScenario(); + + var frodo = scn.GetRingBearer(); + var end = scn.GetFreepsCard("end"); + var fortress = scn.GetFreepsCard("fortress"); + var none = scn.GetFreepsCard("none"); + var doom = scn.GetFreepsCard("doom"); + scn.FreepsMoveCardToHand(end); + scn.FreepsMoveCardToSupportArea(fortress, none, doom); + scn.AddTokensToCard(fortress, 1); + scn.AddTokensToCard(none, 1); + scn.AddTokensToCard(doom, 1); + + var runner = scn.GetShadowCard("runner"); + scn.ShadowMoveCharToTable(runner); + + scn.StartGame(); + scn.SkipToAssignments(); + scn.FreepsAssignToMinions(frodo, runner); + scn.FreepsResolveSkirmish(frodo); + + assertEquals(1, scn.GetCultureTokensOn(fortress)); + assertEquals(1, scn.GetCultureTokensOn(none)); + assertEquals(1, scn.GetCultureTokensOn(doom)); + + assertFalse(scn.FreepsPlayAvailable(end)); + } + + @Test + public void AnEndWorthyofRemembrancePumps3ValiantCompanionsPlusOneIfOnlyOneConditionUsed() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + var scn = GetScenario(); + + var end = scn.GetFreepsCard("end"); + var fortress = scn.GetFreepsCard("fortress"); + var none = scn.GetFreepsCard("none"); + var doom = scn.GetFreepsCard("doom"); + var vhaldir = scn.GetFreepsCard("vhaldir"); + var vgimli = scn.GetFreepsCard("vgimli"); + var veowyn = scn.GetFreepsCard("veowyn"); + scn.FreepsMoveCardToHand(end); + scn.FreepsMoveCardToSupportArea(fortress, none, doom); + scn.FreepsMoveCharToTable(vhaldir, vgimli, veowyn); + scn.AddTokensToCard(fortress, 3); + scn.AddTokensToCard(none, 3); + scn.AddTokensToCard(doom, 3); + + var runner = scn.GetShadowCard("runner"); + scn.ShadowMoveCharToTable(runner); + + scn.StartGame(); + scn.SkipToAssignments(); + scn.FreepsAssignToMinions(vgimli, runner); + scn.FreepsResolveSkirmish(vgimli); + + assertEquals(3, scn.GetCultureTokensOn(fortress)); + assertEquals(3, scn.GetCultureTokensOn(none)); + assertEquals(3, scn.GetCultureTokensOn(doom)); + assertEquals(6, scn.GetStrength(vhaldir)); + assertEquals(6, scn.GetStrength(vgimli)); + assertEquals(6, scn.GetStrength(veowyn)); + + assertTrue(scn.FreepsPlayAvailable(end)); + scn.FreepsPlayCard(end); + scn.FreepsChooseCards(fortress); + + assertEquals(1, scn.GetCultureTokensOn(fortress)); + assertEquals(3, scn.GetCultureTokensOn(none)); + assertEquals(3, scn.GetCultureTokensOn(doom)); + assertEquals(7, scn.GetStrength(vhaldir)); + assertEquals(7, scn.GetStrength(vgimli)); + assertEquals(7, scn.GetStrength(veowyn)); + + scn.ShadowPassCurrentPhaseAction(); + scn.FreepsPassCurrentPhaseAction(); + scn.FreepsDeclineOptionalTrigger(); + + assertEquals(Phase.REGROUP, scn.GetCurrentPhase()); + assertEquals(6, scn.GetStrength(vhaldir)); + assertEquals(6, scn.GetStrength(vgimli)); + assertEquals(6, scn.GetStrength(veowyn)); } }