diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV02/V2-Moria.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV02/V2-Moria.hjson index e74a1fde4..10b4971b8 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV02/V2-Moria.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV02/V2-Moria.hjson @@ -34,14 +34,14 @@ requires: [ { type: HasCardStacked - filter: playable, unique, culture(moria), minion + filter: playable, unique, minion on: self } ] effect: [ { type: ChooseCardsFromSingleStack - select: choose(playable, unique, culture(moria), minion) + select: choose(playable, unique, minion) count: 1 on: self memorize: chosenMinion diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/GenericCardTestHelper.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/GenericCardTestHelper.java index 6c34773d1..955e847ba 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/GenericCardTestHelper.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/GenericCardTestHelper.java @@ -332,10 +332,18 @@ public class GenericCardTestHelper extends AbstractAtTest { } public List FreepsGetBPChoices() { return GetADParamAsList(P1, "blueprintId"); } public List ShadowGetBPChoices() { return GetADParamAsList(P2, "blueprintId"); } + public List FreepsGetActionChoices() { return GetADParamAsList(P1, "actionId"); } + public List ShadowGetActionChoices() { return GetADParamAsList(P2, "actionId"); } public List FreepsGetMultipleChoices() { return GetADParamAsList(P1, "results"); } public List ShadowGetMultipleChoices() { return GetADParamAsList(P2, "results"); } - public int FreepsGetChoiceCount() { return GetADParamAsList(P1, "results").size(); } - public int ShadowGetChoiceCount() { return GetADParamAsList(P2, "results").size(); } + public int FreepsGetChoiceCount() { return GetChoiceCount(FreepsGetMultipleChoices()); } + public int ShadowGetChoiceCount() { return GetChoiceCount(ShadowGetMultipleChoices()); } + + public int GetChoiceCount(List list) { + if(list == null) + return 0; + return list.size(); + } public List FreepsGetFreepsAssignmentTargets() { return GetADParamAsList(P1, "freeCharacters"); } public List FreepsGetShadowAssignmentTargets() { return GetADParamAsList(P1, "minions"); } @@ -344,7 +352,13 @@ public class GenericCardTestHelper extends AbstractAtTest { public List ShadowGetShadowAssignmentTargets() { return GetADParamAsList(P2, "minions"); } public List FreepsGetADParamAsList(String paramName) { return GetADParamAsList(P1, paramName); } public List ShadowGetADParamAsList(String paramName) { return GetADParamAsList(P2, paramName); } - public List GetADParamAsList(String playerID, String paramName) { return Arrays.asList(GetAwaitingDecisionParam(playerID, paramName)); } + public List GetADParamAsList(String playerID, String paramName) { + var paramList = GetAwaitingDecisionParam(playerID, paramName); + if(paramList == null) + return null; + + return Arrays.asList(paramList); + } public int GetADParamEqualsCount(String playerID, String paramName, String value) { return (int) Arrays.stream(GetAwaitingDecisionParam(playerID, paramName)).filter(s -> s.equals(value)).count(); @@ -753,6 +767,21 @@ public class GenericCardTestHelper extends AbstractAtTest { PassCurrentPhaseActions(); } + public void SkipPassedAllAssignments() throws DecisionResultInvalidException { + SkipToAssignments(); + if(FreepsDecisionAvailable("Assign minions to companions or allies at home")) { + FreepsDeclineAssignments(); + } + if(ShadowDecisionAvailable("Assign minions to companions or allies at home")) { + ShadowDeclineAssignments(); + } + if(FreepsDecisionAvailable("Assignment action")) { + PassFierceAssignmentActions(); + FreepsDeclineAssignments(); + ShadowDeclineAssignments(); + } + } + public void SkipToArcheryWounds() throws DecisionResultInvalidException { SkipToPhase(Phase.ARCHERY); PassCurrentPhaseActions(); @@ -833,6 +862,14 @@ public class GenericCardTestHelper extends AbstractAtTest { } } + public void PassManeuverActions() throws DecisionResultInvalidException { PassCurrentPhaseActions(); } + public void PassArcheryActions() throws DecisionResultInvalidException { PassCurrentPhaseActions(); } + public void PassAssignmentActions() throws DecisionResultInvalidException { PassCurrentPhaseActions(); } + public void PassFierceAssignmentActions() throws DecisionResultInvalidException { PassCurrentPhaseActions(); } + public void PassSkirmishActions() throws DecisionResultInvalidException { PassCurrentPhaseActions(); } + public void PassFierceSkirmishActions() throws DecisionResultInvalidException { PassCurrentPhaseActions(); } + public void PassRegroupActions() throws DecisionResultInvalidException { PassCurrentPhaseActions(); } + public void PassCurrentPhaseActions() throws DecisionResultInvalidException { FreepsPassCurrentPhaseAction(); ShadowPassCurrentPhaseAction(); @@ -860,6 +897,16 @@ public class GenericCardTestHelper extends AbstractAtTest { public void FreepsDeclineAssignments() throws DecisionResultInvalidException { FreepsPassCurrentPhaseAction(); } public void ShadowDeclineAssignments() throws DecisionResultInvalidException { ShadowPassCurrentPhaseAction(); } + public void FreepsAssignAndResolve(PhysicalCardImpl comp, PhysicalCardImpl...minions) throws DecisionResultInvalidException { + AssignToMinions(P1, comp, minions); + + if(ShadowDecisionAvailable("Assign minions to companions or allies at home")) { + ShadowDeclineAssignments(); + } + + FreepsResolveSkirmish(comp); + } + public void FreepsAssignToMinions(PhysicalCardImpl comp, PhysicalCardImpl...minions) throws DecisionResultInvalidException { AssignToMinions(P1, comp, minions); } public void ShadowAssignToMinions(PhysicalCardImpl comp, PhysicalCardImpl...minions) throws DecisionResultInvalidException { AssignToMinions(P2, comp, minions); } public void AssignToMinions(String player, PhysicalCardImpl comp, PhysicalCardImpl...minions) throws DecisionResultInvalidException { @@ -913,8 +960,22 @@ public class GenericCardTestHelper extends AbstractAtTest { public void FreepsChooseAnyCard() throws DecisionResultInvalidException { FreepsChoose(FreepsGetCardChoices().getFirst()); } public void ShadowChooseAnyCard() throws DecisionResultInvalidException { ShadowChoose(ShadowGetCardChoices().getFirst()); } - public void FreepsChooseCards(PhysicalCardImpl...cards) throws DecisionResultInvalidException { ChooseCards(P1, cards); } - public void ShadowChooseCards(PhysicalCardImpl...cards) throws DecisionResultInvalidException { ChooseCards(P2, cards); } + public void FreepsChooseCards(PhysicalCardImpl...cards) throws DecisionResultInvalidException { + if(GetChoiceCount(FreepsGetBPChoices()) > 0) { + ChooseCardBPFromSelection(P1, cards); + } + else { + ChooseCards(P1, cards); + } + } + public void ShadowChooseCards(PhysicalCardImpl...cards) throws DecisionResultInvalidException { + if(GetChoiceCount(ShadowGetBPChoices()) > 0) { + ChooseCardBPFromSelection(P2, cards); + } + else { + ChooseCards(P2, cards); + } + } public void ChooseCards(String player, PhysicalCardImpl...cards) throws DecisionResultInvalidException { String[] ids = new String[cards.length]; @@ -957,7 +1018,32 @@ public class GenericCardTestHelper extends AbstractAtTest { if(found.contains(card)) continue; - if(card.getBlueprintId() == choices[i]) + if(card.getBlueprintId().equals(choices[i])) + { + // I have no idea why the spacing is required, but the BP parser skips to the fourth position + bps.add(" " + i); + found.add(card); + break; + } + } + } + + playerDecided(player, String.join(",", bps)); + //ChooseCardBPFromSelection(player, Arrays.stream(cards).distinct().map(PhysicalCardImpl::getBlueprintId).toArray(String[]::new)); + } + + public void ChooseCardBPFromSelection(String player, String...bpids) throws DecisionResultInvalidException { + String[] choices = GetAwaitingDecisionParam(player,"blueprintId"); + ArrayList bps = new ArrayList<>(); + ArrayList found = new ArrayList<>(); + + for(int i = 0; i < choices.length; i++) + { + for(String card : bpids) + { + if(found.contains(card)) + continue; + if(card.equals(choices[i])) { // I have no idea why the spacing is required, but the BP parser skips to the fourth position bps.add(" " + i); @@ -973,6 +1059,39 @@ public class GenericCardTestHelper extends AbstractAtTest { public boolean FreepsHasCardChoiceAvailable(PhysicalCardImpl card) throws DecisionResultInvalidException { return HasCardChoiceAvailable(P1, card);} public boolean ShadowHasCardChoiceAvailable(PhysicalCardImpl card) throws DecisionResultInvalidException { return HasCardChoiceAvailable(P2, card);} + public boolean FreepsHasCardChoicesAvailable(PhysicalCardImpl...cards) throws DecisionResultInvalidException { + for(var card : cards) { + if(!HasCardChoiceAvailable(P1, card)) + return false; + } + return true; + } + public boolean ShadowHasCardChoicesAvailable(PhysicalCardImpl...cards) throws DecisionResultInvalidException { + for(var card : cards) { + if(!HasCardChoiceAvailable(P2, card)) + return false; + } + return true; + } + + public boolean FreepsHasCardChoiceNotAvailable(PhysicalCardImpl card) throws DecisionResultInvalidException { return !HasCardChoiceAvailable(P1, card);} + public boolean ShadowHasCardChoicenotAvailable(PhysicalCardImpl card) throws DecisionResultInvalidException { return !HasCardChoiceAvailable(P2, card);} + + public boolean FreepsHasCardChoicesNotAvailable(PhysicalCardImpl...cards) throws DecisionResultInvalidException { + for(var card : cards) { + if(HasCardChoiceAvailable(P1, card)) + return false; + } + return true; + } + public boolean ShadowHasCardChoicesNotAvailable(PhysicalCardImpl...cards) throws DecisionResultInvalidException { + for(var card : cards) { + if(HasCardChoiceAvailable(P2, card)) + return false; + } + return true; + } + public boolean HasCardChoiceAvailable(String player, PhysicalCardImpl card) throws DecisionResultInvalidException { String[] choices = GetAwaitingDecisionParam(player,"blueprintId"); if(choices != null) { @@ -1156,9 +1275,23 @@ public class GenericCardTestHelper extends AbstractAtTest { assertTrue(effect.wasCarriedOut()); } - public void FreepsChoose(String choice) throws DecisionResultInvalidException { playerDecided(P1, choice); } + public void FreepsChoose(String choice) throws DecisionResultInvalidException { + if(FreepsGetChoiceCount() > 0) { + FreepsChooseMultipleChoiceOption(choice); + } + else { + playerDecided(P1, choice); + } + } public void FreepsChoose(String...choices) throws DecisionResultInvalidException { playerDecided(P1, String.join(",", choices)); } - public void ShadowChoose(String choice) throws DecisionResultInvalidException { playerDecided(P2, choice); } + public void ShadowChoose(String choice) throws DecisionResultInvalidException { + if(ShadowGetChoiceCount() > 0) { + ShadowChooseMultipleChoiceOption(choice); + } + else { + playerDecided(P2, choice); + } + } public void ShadowChoose(String...choices) throws DecisionResultInvalidException { playerDecided(P2, String.join(",", choices)); } @@ -1208,6 +1341,18 @@ public class GenericCardTestHelper extends AbstractAtTest { return _game.isFinished(); } + public void FreepsChooseAny() throws DecisionResultInvalidException { + if (GetChoiceCount(FreepsGetActionChoices()) > 0){ + ChooseAction(P1, "actionId", FreepsGetActionChoices().getFirst()); + } + else if(FreepsGetBPChoices().size() > 1) { + ChooseCardBPFromSelection(P1, FreepsGetBPChoices().getFirst()); + } + else { + FreepsResolveRuleFirst(); + } + } + public void FreepsResolveRuleFirst() throws DecisionResultInvalidException { FreepsResolveActionOrder(GetADParamAsList(P1, "actionText").getFirst()); } public void FreepsResolveActionOrder(String option) throws DecisionResultInvalidException { ChooseAction(P1, "actionText", option); } diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set01/Card_01_031_Tests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set01/Card_01_031_Tests.java index b7043dacf..e735186e0 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set01/Card_01_031_Tests.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set01/Card_01_031_Tests.java @@ -179,7 +179,7 @@ public class Card_01_031_Tests assertEquals(Zone.ATTACHED, asfaloth.getZone()); scn.FreepsPassCurrentPhaseAction(); - scn.FreepsChoose("0"); // timing tie between Asfaloth and Site + scn.FreepsChooseAny(); // timing tie between Asfaloth and Site assertEquals(Zone.DISCARD, asfaloth.getZone()); } diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set01/Card_01_055_Tests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set01/Card_01_055_Tests.java index baac5de5e..683ff4c6e 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set01/Card_01_055_Tests.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set01/Card_01_055_Tests.java @@ -23,12 +23,12 @@ public class Card_01_055_Tests put("allyHome6_1", "1_56"); put("runner", "1_178"); - put("card1", "1_178"); - put("card2", "1_178"); - put("card3", "1_178"); - put("card4", "1_178"); - put("card5", "1_178"); - put("card6", "1_178"); + put("card1", "1_179"); + put("card2", "1_180"); + put("card3", "1_181"); + put("card4", "1_182"); + put("card5", "1_183"); + put("card6", "1_184"); }}, GenericCardTestHelper.FellowshipSites, GenericCardTestHelper.FOTRFrodo, @@ -50,7 +50,8 @@ public class Card_01_055_Tests * Subtype: Support Area * Game Text: Plays to your support area. * Each Elf ally whose home is site 6 is strength +1. - * Fellowship: Exert Galadriel to look at 2 of cards at random from an opponent's hand. Discard one and replace the other. + * Maneuver: If an opponent has at least 7 cards in hand, exert Galadriel to look at + * 2 of those cards at random. Discard one and replace the other. */ var scn = GetScenario(); @@ -136,8 +137,7 @@ public class Card_01_055_Tests scn.FreepsDismissRevealedCards(); scn.ShadowDismissRevealedCards(); - var card = scn.FreepsGetCardChoices().get(0); - scn.FreepsChoose(card); + scn.FreepsChooseAny(); assertEquals(1, scn.GetWoundsOn(galadriel)); assertEquals(6, scn.GetShadowHandCount()); assertEquals(1, scn.GetShadowDiscardCount()); diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set02/Card_02_044_Tests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set02/Card_02_044_Tests.java index 5793e7ab5..f89af520e 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set02/Card_02_044_Tests.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set02/Card_02_044_Tests.java @@ -137,7 +137,7 @@ public class Card_02_044_Tests assertFalse(scn.ShadowAnyDecisionsAvailable()); assertEquals(2, scn.FreepsGetCardChoiceCount()); scn.FreepsDismissRevealedCards(); - scn.FreepsChooseAnyCard(); + scn.FreepsChooseAny(); scn.ShadowMoveCardToSupportArea(business); //slide in No Business between actions scn.ShadowPassCurrentPhaseAction(); diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set02/Card_02_044_ErrataTests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set02/Card_02_044_ErrataTests.java index 06c756ea7..c17ddf1d4 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set02/Card_02_044_ErrataTests.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set02/Card_02_044_ErrataTests.java @@ -152,7 +152,7 @@ public class Card_02_044_ErrataTests assertFalse(scn.ShadowAnyDecisionsAvailable()); assertEquals(2, scn.FreepsGetCardChoiceCount()); scn.FreepsDismissRevealedCards(); - scn.FreepsChooseAnyCard(); + scn.FreepsChooseAny(); scn.ShadowMoveCardToSupportArea(business); //slide in No Business between actions scn.ShadowPassCurrentPhaseAction(); diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v01/Card_V1_022_Tests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v01/Card_V1_022_Tests.java index 9a7f22bd7..17eea4e5b 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v01/Card_V1_022_Tests.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v01/Card_V1_022_Tests.java @@ -106,7 +106,7 @@ public class Card_V1_022_Tests assertEquals(Zone.DEAD, aragorn.getZone()); //There is a tie between evaluating a rule (threat rule?) and Gilraen's automatic trigger. Freeps chooses // to evaluate the rule first (it shouldn't matter for our purposes). - scn.FreepsChoose("0"); + scn.FreepsResolveRuleFirst(); assertEquals(Zone.DISCARD, memorial.getZone()); } diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v01/Card_V1_024_Tests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v01/Card_V1_024_Tests.java index 915f4ee9e..582eec8ff 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v01/Card_V1_024_Tests.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v01/Card_V1_024_Tests.java @@ -115,7 +115,7 @@ public class Card_V1_024_Tests scn.PassCurrentPhaseActions(); //Freeps tiebreaker between resolving the skirmish or processing the required trigger for You Have My Sword. - scn.FreepsChoose("0"); + scn.FreepsResolveRuleFirst(); assertTrue(scn.FreepsDecisionAvailable("Choose action to perform")); String[] choices = scn.FreepsGetMultipleChoices().toArray(new String[0]); @@ -137,7 +137,7 @@ public class Card_V1_024_Tests scn.PassCurrentPhaseActions(); //Freeps tiebreaker between resolving the skirmish or processing the required trigger for You Have My Sword. - scn.FreepsChoose("0"); + scn.FreepsResolveRuleFirst(); assertTrue(scn.FreepsDecisionAvailable("Choose action to perform")); choices = scn.FreepsGetMultipleChoices().toArray(new String[0]); diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v02/Card_V2_037_Tests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v02/Card_V2_037_Tests.java index 411c9f30d..ba37311a0 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v02/Card_V2_037_Tests.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v02/Card_V2_037_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,11 @@ public class Card_V2_037_Tests return new GenericCardTestHelper( new HashMap<>() {{ - put("card", "102_37"); - // put other cards in here as needed for the test case + put("evil", "102_37"); + put("runner", "1_178"); + put("balrog", "102_38"); + + put("sam", "1_311"); }}, GenericCardTestHelper.FellowshipSites, GenericCardTestHelper.FOTRFrodo, @@ -45,7 +47,7 @@ public class Card_V2_037_Tests var scn = GetScenario(); - var card = scn.GetFreepsCard("card"); + var card = scn.GetFreepsCard("evil"); assertEquals("Ancient Evil", card.getBlueprint().getTitle()); assertNull(card.getBlueprint().getSubtitle()); @@ -57,18 +59,71 @@ public class Card_V2_037_Tests assertEquals(1, card.getBlueprint().getTwilightCost()); } - // Uncomment any @Test markers below once this is ready to be used - //@Test - public void AncientEvilTest1() throws DecisionResultInvalidException, CardNotFoundException { + @Test + public void AncientEvilStacksWinningMoriaCards() throws DecisionResultInvalidException, CardNotFoundException { //Pre-game setup var scn = GetScenario(); - var card = scn.GetFreepsCard("card"); - scn.FreepsMoveCardToHand(card); + var evil = scn.GetShadowCard("evil"); + var runner = scn.GetShadowCard("runner"); + var balrog = scn.GetShadowCard("balrog"); + scn.ShadowMoveCardToSupportArea(evil); + scn.ShadowMoveCharToTable(runner, balrog); + + var sam = scn.GetFreepsCard("sam"); + scn.FreepsMoveCharToTable(sam); scn.StartGame(); - scn.FreepsPlayCard(card); + scn.SkipToAssignments(); + scn.FreepsAssignAndResolve(sam, runner); - assertEquals(1, scn.GetTwilight()); + assertEquals(Zone.SHADOW_CHARACTERS, runner.getZone()); + assertEquals(Zone.SHADOW_CHARACTERS, balrog.getZone()); + scn.PassSkirmishActions(); + + assertTrue(scn.ShadowHasOptionalTriggerAvailable()); + scn.ShadowAcceptOptionalTrigger(); + assertEquals(Zone.STACKED, runner.getZone()); + assertEquals(evil, runner.getStackedOn()); + assertEquals(Zone.SHADOW_CHARACTERS, balrog.getZone()); + + scn.PassFierceAssignmentActions(); + scn.FreepsAssignAndResolve(sam, balrog); + scn.PassFierceSkirmishActions(); + + assertTrue(scn.ShadowHasOptionalTriggerAvailable()); + scn.ShadowAcceptOptionalTrigger(); + assertEquals(Zone.STACKED, balrog.getZone()); + assertEquals(evil, balrog.getStackedOn()); + } + + @Test + public void AncientEvilPlaysStackedUniqueMoriaMinionsWithDiscountThenSelfDiscards() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + var scn = GetScenario(); + + var evil = scn.GetShadowCard("evil"); + var runner = scn.GetShadowCard("runner"); + var balrog = scn.GetShadowCard("balrog"); + scn.ShadowMoveCardToSupportArea(evil); + scn.StackCardsOn(evil, runner, balrog); + + scn.StartGame(); + scn.SetTwilight(17); + scn.FreepsPassCurrentPhaseAction(); + + assertEquals(Zone.STACKED, runner.getZone()); + assertEquals(evil, runner.getStackedOn()); + assertEquals(Zone.STACKED, balrog.getZone()); + assertEquals(evil, balrog.getStackedOn()); + assertEquals(20, scn.GetTwilight()); + assertTrue(scn.ShadowActionAvailable(evil)); + + scn.ShadowUseCardAction(evil); + assertEquals(Zone.SHADOW_CHARACTERS, balrog.getZone()); + assertEquals(Zone.DISCARD, evil.getZone()); + assertEquals(Zone.DISCARD, runner.getZone()); + //20 to start, -14 for balrog, -2 for roaming, +1 for discount of 1 stacked card besides balrog + assertEquals(5, scn.GetTwilight()); } } diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v02/Card_V2_040_Tests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v02/Card_V2_040_Tests.java index a5cfff4a6..e059797e7 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v02/Card_V2_040_Tests.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v02/Card_V2_040_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,11 @@ public class Card_V2_040_Tests return new GenericCardTestHelper( new HashMap<>() {{ - put("card", "102_40"); - // put other cards in here as needed for the test case + put("fire", "102_40"); + put("runner", "1_178"); + put("troll", "1_165"); + + put("aragorn", "1_89"); }}, GenericCardTestHelper.FellowshipSites, GenericCardTestHelper.FOTRFrodo, @@ -44,7 +46,7 @@ public class Card_V2_040_Tests var scn = GetScenario(); - var card = scn.GetFreepsCard("card"); + var card = scn.GetFreepsCard("fire"); assertEquals("Through Fire and Water", card.getBlueprint().getTitle()); assertNull(card.getBlueprint().getSubtitle()); @@ -56,18 +58,73 @@ public class Card_V2_040_Tests assertEquals(0, card.getBlueprint().getTwilightCost()); } - // Uncomment any @Test markers below once this is ready to be used - //@Test - public void ThroughFireandWaterTest1() throws DecisionResultInvalidException, CardNotFoundException { + @Test + public void ThroughFireAndWaterRemovesThreatToExertCompanionWhenUniqueMoriaMinionWins() throws DecisionResultInvalidException, CardNotFoundException { //Pre-game setup var scn = GetScenario(); - var card = scn.GetFreepsCard("card"); - scn.FreepsMoveCardToHand(card); + var fire = scn.GetShadowCard("fire"); + var runner = scn.GetShadowCard("runner"); + var troll = scn.GetShadowCard("troll"); + scn.ShadowMoveCardToSupportArea(fire); + scn.ShadowMoveCharToTable(runner, troll); + + var frodo = scn.GetRingBearer(); + var aragorn = scn.GetFreepsCard("aragorn"); + scn.FreepsMoveCharToTable(aragorn); scn.StartGame(); - scn.FreepsPlayCard(card); + scn.AddThreats(2); + scn.AddWoundsToChar(aragorn, 1); + scn.SkipToAssignments(); + scn.FreepsAssignAndResolve(aragorn, runner); + scn.PassSkirmishActions(); - assertEquals(0, scn.GetTwilight()); + //Runner isn't unique + assertFalse(scn.ShadowHasOptionalTriggerAvailable()); + + scn.PassFierceAssignmentActions(); + scn.FreepsAssignAndResolve(aragorn, troll); + scn.PassFierceSkirmishActions(); + + assertEquals(2, scn.GetThreats()); + assertEquals(0, scn.GetWoundsOn(frodo)); + assertTrue(scn.ShadowHasOptionalTriggerAvailable()); + scn.ShadowAcceptOptionalTrigger(); + assertEquals(1, scn.GetThreats()); + + assertEquals(1, scn.GetWoundsOn(frodo)); + } + + @Test + public void ThroughFireAndWaterNeedsAThreat() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + var scn = GetScenario(); + + var fire = scn.GetShadowCard("fire"); + var runner = scn.GetShadowCard("runner"); + var troll = scn.GetShadowCard("troll"); + scn.ShadowMoveCardToSupportArea(fire); + scn.ShadowMoveCharToTable(runner, troll); + + var frodo = scn.GetRingBearer(); + var aragorn = scn.GetFreepsCard("aragorn"); + scn.FreepsMoveCharToTable(aragorn); + + scn.StartGame(); + scn.SkipToAssignments(); + scn.FreepsAssignAndResolve(aragorn, runner); + scn.PassSkirmishActions(); + + //Runner isn't unique + assertFalse(scn.ShadowHasOptionalTriggerAvailable()); + + scn.PassFierceAssignmentActions(); + scn.FreepsAssignAndResolve(aragorn, troll); + scn.PassFierceSkirmishActions(); + + //No threats + assertFalse(scn.ShadowHasOptionalTriggerAvailable()); + assertEquals(0, scn.GetWoundsOn(frodo)); } } diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v02/Card_V2_041_Tests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v02/Card_V2_041_Tests.java index 96a0e5d35..6896cc462 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v02/Card_V2_041_Tests.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v02/Card_V2_041_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,11 @@ public class Card_V2_041_Tests return new GenericCardTestHelper( new HashMap<>() {{ - put("card", "102_41"); - // put other cards in here as needed for the test case + put("peak", "102_41"); + put("runner", "1_178"); + put("troll", "1_165"); + + put("aragorn", "1_89"); }}, GenericCardTestHelper.FellowshipSites, GenericCardTestHelper.FOTRFrodo, @@ -44,7 +46,7 @@ public class Card_V2_041_Tests var scn = GetScenario(); - var card = scn.GetFreepsCard("card"); + var card = scn.GetFreepsCard("peak"); assertEquals("To Highest Peak", card.getBlueprint().getTitle()); assertNull(card.getBlueprint().getSubtitle()); @@ -56,18 +58,85 @@ public class Card_V2_041_Tests assertEquals(1, card.getBlueprint().getTwilightCost()); } - // Uncomment any @Test markers below once this is ready to be used - //@Test - public void ToHighestPeakTest1() throws DecisionResultInvalidException, CardNotFoundException { + @Test + public void ToHighestPeakDiscardsMinionsToAddThreats() throws DecisionResultInvalidException, CardNotFoundException { //Pre-game setup var scn = GetScenario(); - var card = scn.GetFreepsCard("card"); - scn.FreepsMoveCardToHand(card); + var peak = scn.GetShadowCard("peak"); + var runner = scn.GetShadowCard("runner"); + var troll = scn.GetShadowCard("troll"); + scn.ShadowMoveCardToHand(peak); + scn.ShadowMoveCharToTable(runner, troll); + + var frodo = scn.GetRingBearer(); + var aragorn = scn.GetFreepsCard("aragorn"); + scn.FreepsMoveCharToTable(aragorn); scn.StartGame(); - scn.FreepsPlayCard(card); + scn.SkipPassedAllAssignments(); + + assertEquals(Phase.REGROUP, scn.GetCurrentPhase()); + scn.FreepsPassCurrentPhaseAction(); + + assertEquals(0, scn.GetThreats()); + assertEquals(Zone.SHADOW_CHARACTERS, runner.getZone()); + assertEquals(Zone.SHADOW_CHARACTERS, troll.getZone()); + assertTrue(scn.ShadowPlayAvailable(peak)); + + scn.ShadowPlayCard(peak); + assertEquals(2, scn.ShadowGetCardChoiceCount()); + scn.ShadowChooseCards(runner, troll); + + assertTrue(scn.FreepsDecisionAvailable("Would you like to exert")); + scn.FreepsChooseNo(); + + assertEquals(2, scn.GetThreats()); + assertEquals(Zone.DISCARD, runner.getZone()); + assertEquals(Zone.DISCARD, troll.getZone()); + + } + + @Test + public void ToHighestPeakCanBePreventedByExertingXCompanions() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + var scn = GetScenario(); + + var peak = scn.GetShadowCard("peak"); + var runner = scn.GetShadowCard("runner"); + var troll = scn.GetShadowCard("troll"); + scn.ShadowMoveCardToHand(peak); + scn.ShadowMoveCharToTable(runner, troll); + + var frodo = scn.GetRingBearer(); + var aragorn = scn.GetFreepsCard("aragorn"); + scn.FreepsMoveCharToTable(aragorn); + + scn.StartGame(); + scn.SkipPassedAllAssignments(); + + assertEquals(Phase.REGROUP, scn.GetCurrentPhase()); + scn.FreepsPassCurrentPhaseAction(); + + assertEquals(0, scn.GetThreats()); + assertEquals(Zone.SHADOW_CHARACTERS, runner.getZone()); + assertEquals(Zone.SHADOW_CHARACTERS, troll.getZone()); + assertEquals(0, scn.GetWoundsOn(frodo)); + assertEquals(0, scn.GetWoundsOn(aragorn)); + assertTrue(scn.ShadowPlayAvailable(peak)); + + scn.ShadowPlayCard(peak); + assertEquals(2, scn.ShadowGetCardChoiceCount()); + scn.ShadowChooseCards(runner, troll); + + assertTrue(scn.FreepsDecisionAvailable("Would you like to exert")); + scn.FreepsChooseYes(); + + assertEquals(0, scn.GetThreats()); + assertEquals(Zone.DISCARD, runner.getZone()); + assertEquals(Zone.DISCARD, troll.getZone()); + assertEquals(1, scn.GetWoundsOn(frodo)); + assertEquals(1, scn.GetWoundsOn(aragorn)); - assertEquals(1, scn.GetTwilight()); } } diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v02/Card_V2_045_Tests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v02/Card_V2_045_Tests.java index d3ea61973..04cb00d52 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v02/Card_V2_045_Tests.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v02/Card_V2_045_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,8 @@ public class Card_V2_045_Tests return new GenericCardTestHelper( new HashMap<>() {{ - put("card", "102_45"); - // put other cards in here as needed for the test case + put("hope", "102_45"); + put("eomer", "4_267"); }}, GenericCardTestHelper.FellowshipSites, GenericCardTestHelper.FOTRFrodo, @@ -47,7 +46,7 @@ public class Card_V2_045_Tests var scn = GetScenario(); - var card = scn.GetFreepsCard("card"); + var card = scn.GetFreepsCard("hope"); assertEquals("Do Not Trust to Hope", card.getBlueprint().getTitle()); assertNull(card.getBlueprint().getSubtitle()); @@ -59,18 +58,57 @@ public class Card_V2_045_Tests assertEquals(2, card.getBlueprint().getStrength()); } - // Uncomment any @Test markers below once this is ready to be used - //@Test - public void DoNotTrusttoHopeTest1() throws DecisionResultInvalidException, CardNotFoundException { + @Test + public void DoNotTrusttoHopeMakesBearerValiant() throws DecisionResultInvalidException, CardNotFoundException { //Pre-game setup var scn = GetScenario(); - var card = scn.GetFreepsCard("card"); - scn.FreepsMoveCardToHand(card); + var hope = scn.GetFreepsCard("hope"); + var eomer = scn.GetFreepsCard("eomer"); + scn.FreepsMoveCardToHand(hope); + scn.FreepsMoveCharToTable(eomer); scn.StartGame(); - scn.FreepsPlayCard(card); - assertEquals(1, scn.GetTwilight()); + assertFalse(scn.hasKeyword(eomer, Keyword.VALIANT)); + assertTrue(scn.FreepsPlayAvailable(hope)); + + scn.FreepsPlayCard(hope); + assertEquals(eomer, hope.getAttachedTo()); + assertTrue(scn.hasKeyword(eomer, Keyword.VALIANT)); + } + + @Test + public void DoNotTrusttoHopeWoundsAtStartOfRegroupUnlessDiscarded() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + var scn = GetScenario(); + + var hope = scn.GetFreepsCard("hope"); + var eomer = scn.GetFreepsCard("eomer"); + scn.FreepsMoveCharToTable(eomer); + scn.AttachCardsTo(eomer, hope); + + scn.StartGame(); + + scn.SkipToPhase(Phase.REGROUP); + assertTrue(scn.FreepsDecisionAvailable("")); + assertEquals(0, scn.GetWoundsOn(eomer)); + assertEquals(Zone.ATTACHED, hope.getZone()); + + scn.FreepsChoose("Wound"); + assertEquals(1, scn.GetWoundsOn(eomer)); + assertEquals(Zone.ATTACHED, hope.getZone()); + + scn.SkipToMovementDecision(); + scn.FreepsChooseToMove(); + + scn.SkipToPhase(Phase.REGROUP); + assertTrue(scn.FreepsDecisionAvailable("")); + assertEquals(1, scn.GetWoundsOn(eomer)); + assertEquals(Zone.ATTACHED, hope.getZone()); + + scn.FreepsChoose("Discard"); + assertEquals(1, scn.GetWoundsOn(eomer)); + assertEquals(Zone.DISCARD, hope.getZone()); } } diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v02/Card_V2_047_Tests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v02/Card_V2_047_Tests.java index 2e6617b9d..ef3f3d131 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v02/Card_V2_047_Tests.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v02/Card_V2_047_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,13 @@ public class Card_V2_047_Tests return new GenericCardTestHelper( new HashMap<>() {{ - put("card", "102_47"); - // put other cards in here as needed for the test case + put("erkenbrand", "102_47"); + put("eowyn", "5_122"); + put("elite", "4_265"); + put("rider", "4_286"); + put("guard", "5_83"); + put("veteran", "7_246"); + put("dwarfguard", "1_7"); }}, GenericCardTestHelper.FellowshipSites, GenericCardTestHelper.FOTRFrodo, @@ -49,7 +53,7 @@ public class Card_V2_047_Tests var scn = GetScenario(); - var card = scn.GetFreepsCard("card"); + var card = scn.GetFreepsCard("erkenbrand"); assertEquals("Erkenbrand", card.getBlueprint().getTitle()); assertEquals("Kinsman of the House of Eorl", card.getBlueprint().getSubtitle()); @@ -65,18 +69,75 @@ public class Card_V2_047_Tests assertEquals(Signet.GANDALF, card.getBlueprint().getSignet()); } - // Uncomment any @Test markers below once this is ready to be used - //@Test - public void ErkenbrandTest1() throws DecisionResultInvalidException, CardNotFoundException { + @Test + public void ErkenbrandBanishes3NonUniqueRohanCompanionsFromDeadPile() throws DecisionResultInvalidException, CardNotFoundException { //Pre-game setup var scn = GetScenario(); - var card = scn.GetFreepsCard("card"); - scn.FreepsMoveCardToHand(card); + var frodo = scn.GetRingBearer(); + var erkenbrand = scn.GetFreepsCard("erkenbrand"); + var eowyn = scn.GetFreepsCard("eowyn"); + var elite = scn.GetFreepsCard("elite"); + var rider = scn.GetFreepsCard("rider"); + var guard = scn.GetFreepsCard("guard"); + var veteran = scn.GetFreepsCard("veteran"); + var dwarfguard = scn.GetFreepsCard("dwarfguard"); + scn.FreepsMoveCardToDeadPile(eowyn, elite, rider, guard, veteran, dwarfguard); + scn.FreepsMoveCardToHand(erkenbrand); scn.StartGame(); - scn.FreepsPlayCard(card); - assertEquals(5, scn.GetTwilight()); + assertEquals(Zone.DEAD, eowyn.getZone()); + assertEquals(Zone.DEAD, elite.getZone()); + assertEquals(Zone.DEAD, rider.getZone()); + assertEquals(Zone.DEAD, guard.getZone()); + assertEquals(Zone.DEAD, veteran.getZone()); + assertEquals(Zone.DEAD, dwarfguard.getZone()); + + scn.FreepsPlayCard(erkenbrand); + assertEquals(4, scn.FreepsGetCardChoiceCount()); + assertTrue(scn.FreepsHasCardChoicesAvailable(elite, rider, guard, veteran)); + assertTrue(scn.FreepsHasCardChoicesNotAvailable(eowyn, dwarfguard)); + + scn.FreepsChooseCards(elite, rider, guard); + assertEquals(Zone.DEAD, eowyn.getZone()); + assertEquals(Zone.REMOVED, elite.getZone()); + assertEquals(Zone.REMOVED, rider.getZone()); + assertEquals(Zone.REMOVED, guard.getZone()); + assertEquals(Zone.DEAD, veteran.getZone()); + assertEquals(Zone.DEAD, dwarfguard.getZone()); + } + + @Test + public void ErkenbrandMakesExhaustedCompanionsValiant() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + var scn = GetScenario(); + + var frodo = scn.GetRingBearer(); + var erkenbrand = scn.GetFreepsCard("erkenbrand"); + var elite = scn.GetFreepsCard("elite"); + var rider = scn.GetFreepsCard("rider"); + var guard = scn.GetFreepsCard("guard"); + var veteran = scn.GetFreepsCard("veteran"); + var dwarfguard = scn.GetFreepsCard("dwarfguard"); + scn.FreepsMoveCharToTable(elite, rider, guard, dwarfguard); + scn.FreepsMoveCardToHand(erkenbrand); + + scn.StartGame(); + + scn.AddWoundsToChar(frodo, 3); + scn.AddWoundsToChar(elite, 2); + scn.AddWoundsToChar(rider, 1); + + assertEquals(1, scn.GetVitality(frodo)); + assertFalse(scn.hasKeyword(frodo, Keyword.VALIANT)); + assertEquals(1, scn.GetVitality(elite)); + assertFalse(scn.hasKeyword(elite, Keyword.VALIANT)); + assertEquals(2, scn.GetVitality(rider)); + assertFalse(scn.hasKeyword(rider, Keyword.VALIANT)); + assertEquals(2, scn.GetVitality(dwarfguard)); + assertFalse(scn.hasKeyword(dwarfguard, Keyword.VALIANT)); + + scn.FreepsPlayCard(erkenbrand); } }