From f8d7c6b5a35d96fed59438121be2ebfaa05b1f9f Mon Sep 17 00:00:00 2001 From: Christian 'ketura' McCarty Date: Sat, 13 Mar 2021 02:36:56 -0600 Subject: [PATCH] VPack1 Gondor Implementation The five gondor cards are now implemented. Lords of Gondor requires additional development to be complete (see commented out failing test). Added ReplaceInAssignment effect. Updated DiscardFromHand effect to be sensitive to the side performing the discarding. --- .../src/main/web/cards/set101/vpack1.json | 234 +++++++++--------- .../main/web/cards/set51/set01-errata.json | 2 +- .../field/effect/EffectAppenderFactory.java | 1 + .../effect/appender/ReplaceInAssignment.java | 47 ++++ .../field/effect/trigger/DiscardFromHand.java | 19 +- .../lotro/cards/GenericCardTestHelper.java | 12 + .../pc/vset1/vpack1/Card_V1_001Tests.java | 147 +++++++++++ .../pc/vset1/vpack1/Card_V1_002Tests.java | 125 ++++++++++ .../pc/vset1/vpack1/Card_V1_003Tests.java | 95 +++++++ .../pc/vset1/vpack1/Card_V1_004Tests.java | 106 ++++++++ .../pc/vset1/vpack1/Card_V1_005Tests.java | 126 ++++++++++ 11 files changed, 785 insertions(+), 129 deletions(-) create mode 100644 gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ReplaceInAssignment.java create mode 100644 gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vset1/vpack1/Card_V1_001Tests.java create mode 100644 gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vset1/vpack1/Card_V1_002Tests.java create mode 100644 gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vset1/vpack1/Card_V1_003Tests.java create mode 100644 gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vset1/vpack1/Card_V1_004Tests.java create mode 100644 gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vset1/vpack1/Card_V1_005Tests.java diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set101/vpack1.json b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set101/vpack1.json index 86c488a59..393d3d096 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set101/vpack1.json +++ b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set101/vpack1.json @@ -1,5 +1,5 @@ { - "101_1001": { + "101_001": { "side": "free_people", "culture": "Gondor", "title": "*The Lords of Gondor Have Returned", @@ -41,55 +41,50 @@ ] }, - "101_1002": { + "101_002": { "side": "free_people", "culture": "Gondor", - "title": "*I Will not Let the White City Fall", + "title": "*I Will Not Let the White City Fall", "type": "condition", "cost": 2, "keyword": "support area", "effects": [ { - "type": "activated", - "phase": "skirmish", - "condition": { - "type": "canSpot", - "filter": "bearer,inSkirmishAgainst(Nazgul)", + "type": "trigger", + "trigger": { + "type": "losesSkirmish", + "filter": "name(Boromir)" + }, + "effect": { + "type": "modifyStrength", + "filter": "choose(name(Aragorn))", + "amount": 2, + "until": "start(regroup)" }, - "cost": [ - { - "type": "memorize", - "filter": "bearer", - "memory": "bearer" - }, - { - "type": "discard", - "filter": "self" - } - ], - "effect":[ - { - "type": "modifyStrength", - "filter": "memory(bearer)", - "amount": 3 - }, - { - "type": "addKeyword", - "filter": "memory(bearer)", - "keyword": "damage+1" - } - ] }, + { + "type": "trigger", + "trigger": { + "type": "losesSkirmish", + "filter": "name(Aragorn)" + }, + "effect": { + "type": "modifyStrength", + "filter": "choose(name(Boromir))", + "amount": 2, + "until": "start(regroup)" + }, + } ] }, - "101_1003": { + "101_003": { "side": "free_people", "culture": "Gondor", "title": "*Boromir", "subtitle": "The Redeemed", "type": "companion", - "cost": 2, + "cost": 3, "race": "man", "strength": 7, "vitality": 3, @@ -97,40 +92,49 @@ "signet": "aragorn", "effects": [ { - "type": "activated", - "phase": "skirmish", - "condition": { - "type": "canSpot", - "filter": "bearer,inSkirmishAgainst(Nazgul)", - }, - "cost": [ - { - "type": "memorize", - "filter": "bearer", - "memory": "bearer" - }, - { - "type": "discard", - "filter": "self" + "type": "modifier", + "modifier": { + "type": "addKeyword", + "filter": "self", + "keyword": "defender+1", + "condition": { + "type": "canSpot", + "filter": "companion,culture(shire)", + "count": 2 } - ], - "effect":[ - { - "type": "modifyStrength", - "filter": "memory(bearer)", - "amount": 3 - }, - { - "type": "addKeyword", - "filter": "memory(bearer)", - "keyword": "damage+1" - } - ] + } }, + { + "type": "modifier", + "modifier": { + "type": "modifyStrength", + "filter": "self", + "amount": 1, + "condition": { + "type": "canSpot", + "filter": "companion,culture(shire)", + "count": 4 + } + } + }, + { + "type": "modifier", + "modifier": { + "type": "addKeyword", + "filter": "self", + "keyword": "damage+1", + "condition": { + "type": "canSpot", + "filter": "companion,culture(shire)", + "count": 4 + } + } + }, + ] }, - "101_1004": { + "101_004": { "side": "free_people", "culture": "Gondor", "title": "*Loud and Clear It Sounds", @@ -139,82 +143,68 @@ "keyword": "support area", "effects": [ { - "type": "activated", - "phase": "skirmish", - "condition": { - "type": "canSpot", - "filter": "bearer,inSkirmishAgainst(Nazgul)", + "type": "trigger", + "optional": true, + "trigger": { + "type": "assignedToSkirmish", + "filter": "companion,culture(shire)", + "side": "shadow", + "memorizeAssigned": "assignedHobbit", + "memorizeAgainst": "assignedMinion" }, "cost": [ { - "type": "memorize", - "filter": "bearer", - "memory": "bearer" - }, + "type": "exert", + "count": 1, + "filter": "choose(companion,culture(gondor))", + "memorize": "newAssignee" + }, { "type": "discard", "filter": "self" } ], - "effect":[ - { - "type": "modifyStrength", - "filter": "memory(bearer)", - "amount": 3 - }, - { - "type": "addKeyword", - "filter": "memory(bearer)", - "keyword": "damage+1" - } - ] - }, + "effect": { + "type": "replaceInAssignment", + "filter": "memory(assignedHobbit)", + "with": "memory(newAssignee)" + } + } ] }, - "101_1005": { + "101_005": { "side": "free_people", "culture": "Gondor", "title": "Remnant of Numenor", "type": "condition", "cost": 1, "keyword": "support area", - "effects": [ - { - "type": "activated", - "phase": "skirmish", - "condition": { - "type": "canSpot", - "filter": "bearer,inSkirmishAgainst(Nazgul)", - }, - "cost": [ - { - "type": "memorize", - "filter": "bearer", - "memory": "bearer" - }, - { - "type": "discard", - "filter": "self" - } - ], - "effect":[ - { - "type": "modifyStrength", - "filter": "memory(bearer)", - "amount": 3 - }, - { - "type": "addKeyword", - "filter": "memory(bearer)", - "keyword": "damage+1" - } - ] + "condition": { + "type": "canSpot", + "filter": "companion,culture(gondor)" + }, + "effects": { + "type": "trigger", + "optional": true, + "trigger": { + "type": "discardFromHand", + "filter": "any", + "player": "shadowPlayer" }, - ] + "cost": { + "type": "addTwilight", + "amount": 1 + }, + "effect": { + "type": "shuffleCardsFromDiscardIntoDrawDeck", + "filter": "choose(culture(gondor))", + "count": 1 + } + } }, - "101_1006": { + "101_006": { "side": "shadow", "culture": "Sauron", "title": "*Great Wolf Chief", @@ -263,7 +253,7 @@ ] }, - "101_1007": { + "101_007": { "side": "shadow", "culture": "Sauron", "title": "Hollin Snarler", @@ -312,7 +302,7 @@ ] }, - "101_1008": { + "101_008": { "side": "shadow", "culture": "Sauron", "title": "Hound of Sauron", @@ -361,7 +351,7 @@ ] }, - "101_1009": { + "101_009": { "side": "shadow", "culture": "Sauron", "title": "*The Hunt is Up!", @@ -403,7 +393,7 @@ ] }, - "101_1010": { + "101_010": { "side": "shadow", "culture": "Sauron", "title": "I See You", diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set51/set01-errata.json b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set51/set01-errata.json index 46a85fec6..dbc6aa7ee 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set51/set01-errata.json +++ b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set51/set01-errata.json @@ -201,7 +201,7 @@ { "type": "conditional", "condition": { - "type": "chooseHowManyToSpot", + "type": "canSpot", "count": 5, "filter": "companion" }, diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/EffectAppenderFactory.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/EffectAppenderFactory.java index 8a17b3b19..3e02e103e 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/EffectAppenderFactory.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/EffectAppenderFactory.java @@ -29,6 +29,7 @@ public class EffectAppenderFactory { effectAppenderProducers.put("wound", new Wound()); effectAppenderProducers.put("heal", new Heal()); effectAppenderProducers.put("replaceinskirmish", new ReplaceInSkirmish()); + effectAppenderProducers.put("replaceinassignment", new ReplaceInAssignment()); effectAppenderProducers.put("canttakemorewoundsthan", new CantTakeMoreWoundsThan()); effectAppenderProducers.put("canttakewounds", new CantTakeWounds()); effectAppenderProducers.put("choice", new Choice()); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ReplaceInAssignment.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ReplaceInAssignment.java new file mode 100644 index 000000000..858fef97e --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ReplaceInAssignment.java @@ -0,0 +1,47 @@ +package com.gempukku.lotro.cards.build.field.effect.appender; + +import com.gempukku.lotro.cards.build.ActionContext; +import com.gempukku.lotro.cards.build.CardGenerationEnvironment; +import com.gempukku.lotro.cards.build.FilterableSource; +import com.gempukku.lotro.cards.build.InvalidCardDefinitionException; +import com.gempukku.lotro.cards.build.field.FieldUtils; +import com.gempukku.lotro.cards.build.field.effect.EffectAppender; +import com.gempukku.lotro.cards.build.field.effect.EffectAppenderProducer; +import com.gempukku.lotro.cards.build.field.effect.appender.resolver.CardResolver; +import com.gempukku.lotro.game.PhysicalCard; +import com.gempukku.lotro.logic.actions.CostToEffectAction; +import com.gempukku.lotro.logic.effects.ReplaceFpCharacterInAssignmentEffect; +import com.gempukku.lotro.logic.timing.DoNothingEffect; +import com.gempukku.lotro.logic.timing.Effect; +import org.json.simple.JSONObject; + +public class ReplaceInAssignment implements EffectAppenderProducer { + @Override + public EffectAppender createEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + FieldUtils.validateAllowedFields(effectObject, "filter", "with"); + + final String filter = FieldUtils.getString(effectObject.get("filter"), "filter"); + final String with = FieldUtils.getString(effectObject.get("with"), "with"); + + MultiEffectAppender result = new MultiEffectAppender(); + result.addEffectAppender( + CardResolver.resolveCard(filter, "_oldAssignee", "you", "Choose assigned character to replace", environment)); + result.addEffectAppender( + CardResolver.resolveCard(with, "_newAssignee", "you", "Choose character to replace with in assignment", environment)); + result.addEffectAppender( + new DelayedAppender() { + @Override + protected Effect createEffect(boolean cost, CostToEffectAction action, ActionContext actionContext) { + final PhysicalCard oldCard = actionContext.getCardFromMemory("_oldAssignee"); + final PhysicalCard newCard = actionContext.getCardFromMemory("_newAssignee"); + if (oldCard != null && newCard != null) + return new ReplaceFpCharacterInAssignmentEffect(newCard, oldCard); + else + return new DoNothingEffect(); + } + }); + + return result; + } + +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/DiscardFromHand.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/DiscardFromHand.java index c5189bd66..5cf299eb5 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/DiscardFromHand.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/DiscardFromHand.java @@ -1,22 +1,23 @@ package com.gempukku.lotro.cards.build.field.effect.trigger; -import com.gempukku.lotro.cards.build.ActionContext; -import com.gempukku.lotro.cards.build.CardGenerationEnvironment; -import com.gempukku.lotro.cards.build.FilterableSource; -import com.gempukku.lotro.cards.build.InvalidCardDefinitionException; +import com.gempukku.lotro.cards.build.*; import com.gempukku.lotro.cards.build.field.FieldUtils; +import com.gempukku.lotro.cards.build.field.effect.appender.resolver.PlayerResolver; import com.gempukku.lotro.logic.timing.TriggerConditions; import com.gempukku.lotro.logic.timing.results.DiscardCardFromHandResult; +import com.gempukku.lotro.logic.timing.results.DiscardCardsFromPlayResult; import org.json.simple.JSONObject; public class DiscardFromHand implements TriggerCheckerProducer { @Override public TriggerChecker getTriggerChecker(JSONObject value, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { - FieldUtils.validateAllowedFields(value, "filter", "memorize"); + FieldUtils.validateAllowedFields(value, "filter", "memorize", "player"); final String filter = FieldUtils.getString(value.get("filter"), "filter", "any"); final String memorize = FieldUtils.getString(value.get("memorize"), "memorize"); + final String player = FieldUtils.getString(value.get("player"), "player"); + PlayerSource playerSource = (player != null) ? PlayerResolver.resolvePlayer(player, environment) : null; final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(filter, environment); return new TriggerChecker() { @@ -27,8 +28,14 @@ public class DiscardFromHand implements TriggerCheckerProducer { @Override public boolean accepts(ActionContext actionContext) { - final boolean result = TriggerConditions.forEachDiscardedFromHand(actionContext.getGame(), actionContext.getEffectResult(), + boolean result = TriggerConditions.forEachDiscardedFromHand(actionContext.getGame(), actionContext.getEffectResult(), filterableSource.getFilterable(actionContext)); + if (result && playerSource != null) { + // Need to check if it was that player discarding the card + final String performingPlayer = ((DiscardCardFromHandResult) actionContext.getEffectResult()).getSource().getOwner(); + if (performingPlayer == null || !performingPlayer.equals(playerSource.getPlayer(actionContext))) + result = false; + } if (result && memorize != null) { actionContext.setCardMemory(memorize, ((DiscardCardFromHandResult) actionContext.getEffectResult()).getDiscardedCard()); } 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 016e05992..fa6237a35 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 @@ -270,6 +270,15 @@ public class GenericCardTestHelper extends AbstractAtTest { Arrays.stream(cards).forEach(card -> MoveCardToZone(P1, card, Zone.SUPPORT)); } + public void FreepsMoveCardToDiscard(String cardName) { FreepsMoveCardToSupportArea(GetFreepsCard(cardName)); } + public void FreepsMoveCardToDiscard(PhysicalCardImpl...cards) { + Arrays.stream(cards).forEach(card -> MoveCardToZone(P1, card, Zone.DISCARD)); + } + public void ShadowMoveCardToDiscard(String cardName) { ShadowMoveCardToSupportArea(GetShadowCard(cardName)); } + public void ShadowMoveCardToDiscard(PhysicalCardImpl...cards) { + Arrays.stream(cards).forEach(card -> MoveCardToZone(P1, card, Zone.DISCARD)); + } + public void MoveCardToZone(String player, PhysicalCardImpl card, Zone zone) { if(card.getZone() != null) { @@ -409,6 +418,9 @@ public class GenericCardTestHelper extends AbstractAtTest { _game.getModifiersEnvironment().addUntilEndOfTurnModifier(mod); } + public void FreepsChoose(String choice) throws DecisionResultInvalidException { playerDecided(P1, choice); } + public void ShadowChoose(String choice) throws DecisionResultInvalidException { playerDecided(P2, choice); } + public void FreepsChooseToMove() throws DecisionResultInvalidException { playerDecided(P1, "0"); } public void FreepsChooseToStay() throws DecisionResultInvalidException { playerDecided(P1, "1"); } diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vset1/vpack1/Card_V1_001Tests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vset1/vpack1/Card_V1_001Tests.java new file mode 100644 index 000000000..2e1b7a6d4 --- /dev/null +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vset1/vpack1/Card_V1_001Tests.java @@ -0,0 +1,147 @@ +package com.gempukku.lotro.cards.unofficial.pc.vset1.vpack1; + +import com.gempukku.lotro.cards.GenericCardTestHelper; +import com.gempukku.lotro.common.Keyword; +import com.gempukku.lotro.common.Phase; +import com.gempukku.lotro.game.CardNotFoundException; +import com.gempukku.lotro.game.PhysicalCardImpl; +import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException; +import org.junit.Test; + +import java.util.HashMap; + +import static junit.framework.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public class Card_V1_001Tests +{ + + protected GenericCardTestHelper GetScenario() throws CardNotFoundException, DecisionResultInvalidException { + return new GenericCardTestHelper( + new HashMap() + {{ + put("aragorn", "1_89"); + put("boromir", "1_97"); + put("lords", "101_001"); + + put("runner1", "1_178"); + put("runner2", "1_178"); + }} + ); + } + + + @Test + public void LordsStatsAndKeywordsAreCorrect() throws DecisionResultInvalidException, CardNotFoundException { + + /** + * Set: VSet1, VPack1 + * Title: The Lords of Gondor Have Returned + * Side: Free Peoples + * Culture: Gondor + * Twilight Cost: 2 + * Type: Condition + * Subtype: Support Area + * Game Text: While Boromir is assigned to skirmish more than one minion, Aragorn is strength +3. + * While Aragorn is assigned to skirmish more than one minion, Boromir is strength +3. + */ + + //Pre-game setup + GenericCardTestHelper scn = GetScenario(); + + PhysicalCardImpl lords = scn.GetFreepsCard("lords"); + + assertTrue(scn.HasKeyword(lords, Keyword.SUPPORT_AREA)); + assertEquals(2, lords.getBlueprint().getTwilightCost()); + assertTrue(lords.getBlueprint().isUnique()); + } + +// @Test +// public void OneIsBuffedWhenOtherAssignedMultiple() throws DecisionResultInvalidException, CardNotFoundException { +// //Pre-game setup +// GenericCardTestHelper scn = GetScenario(); +// +// PhysicalCardImpl aragorn = scn.GetFreepsCard("aragorn"); +// PhysicalCardImpl boromir = scn.GetFreepsCard("boromir"); +// PhysicalCardImpl lords = scn.GetFreepsCard("lords"); +// +// scn.FreepsMoveCharToTable(aragorn); +// scn.FreepsMoveCharToTable(boromir); +// scn.FreepsMoveCardToHand(lords); +// +// PhysicalCardImpl runner1 = scn.GetShadowCard("runner1"); +// PhysicalCardImpl runner2 = scn.GetShadowCard("runner2"); +// +// scn.ShadowMoveCharToTable(runner1); +// scn.ShadowMoveCharToTable(runner2); +// +// scn.StartGame(); +// scn.FreepsPlayCard(lords); +// scn.SkipToPhase(Phase.ASSIGNMENT); +// +// assertEquals(7, scn.GetStrength(boromir)); +// assertEquals(8, scn.GetStrength(aragorn)); +// +// scn.FreepsSkipCurrentPhaseAction(); +// scn.ShadowSkipCurrentPhaseAction(); +// +// //Let shadow assign so we don't have to worry about defender bonuses +// scn.FreepsSkipCurrentPhaseAction(); +// scn.ShadowAssignToMinions(boromir, runner1, runner2); +// +// assertEquals(7, scn.GetStrength(boromir)); +// assertEquals(11, scn.GetStrength(aragorn)); +// +// scn.FreepsResolveSkirmish(boromir); +// +// scn.SkipToPhase(Phase.REGROUP); +// scn.SkipCurrentPhaseActions(); +// scn.ShadowSkipCurrentPhaseAction(); +// scn.FreepsChooseToMove(); +// +// scn.SkipToPhase(Phase.ASSIGNMENT); +// +// //Let shadow assign so we don't have to worry about defender bonuses +// scn.FreepsSkipCurrentPhaseAction(); +// scn.ShadowAssignToMinions(aragorn, runner1, runner2); +// +// assertEquals(10, scn.GetStrength(boromir)); +// assertEquals(8, scn.GetStrength(aragorn)); +// } + + + @Test + public void NoBuffsWhenAssignedSingle() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + GenericCardTestHelper scn = GetScenario(); + + PhysicalCardImpl aragorn = scn.GetFreepsCard("aragorn"); + PhysicalCardImpl boromir = scn.GetFreepsCard("boromir"); + PhysicalCardImpl lords = scn.GetFreepsCard("lords"); + + scn.FreepsMoveCharToTable(aragorn); + scn.FreepsMoveCharToTable(boromir); + scn.FreepsMoveCardToHand(lords); + + PhysicalCardImpl runner1 = scn.GetShadowCard("runner1"); + PhysicalCardImpl runner2 = scn.GetShadowCard("runner2"); + + scn.ShadowMoveCharToTable(runner1); + scn.ShadowMoveCharToTable(runner2); + + scn.StartGame(); + scn.FreepsPlayCard(lords); + scn.SkipToPhase(Phase.ASSIGNMENT); + + assertEquals(7, scn.GetStrength(boromir)); + assertEquals(8, scn.GetStrength(aragorn)); + + scn.SkipCurrentPhaseActions(); + + scn.FreepsAssignToMinions(new PhysicalCardImpl[]{ boromir, runner1 }, new PhysicalCardImpl[]{ aragorn, runner2 }); + + assertEquals(7, scn.GetStrength(boromir)); + assertEquals(8, scn.GetStrength(aragorn)); + + } +} diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vset1/vpack1/Card_V1_002Tests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vset1/vpack1/Card_V1_002Tests.java new file mode 100644 index 000000000..1feef137d --- /dev/null +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vset1/vpack1/Card_V1_002Tests.java @@ -0,0 +1,125 @@ +package com.gempukku.lotro.cards.unofficial.pc.vset1.vpack1; + +import com.gempukku.lotro.cards.GenericCardTestHelper; +import com.gempukku.lotro.common.Keyword; +import com.gempukku.lotro.common.Phase; +import com.gempukku.lotro.game.CardNotFoundException; +import com.gempukku.lotro.game.PhysicalCardImpl; +import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException; +import org.junit.Test; + +import java.util.HashMap; + +import static junit.framework.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public class Card_V1_002Tests +{ + + protected GenericCardTestHelper GetScenario() throws CardNotFoundException, DecisionResultInvalidException { + return new GenericCardTestHelper( + new HashMap() + {{ + put("aragorn", "1_89"); + put("boromir", "1_97"); + put("whitecity", "101_002"); + + put("attea", "1_229"); + put("cantea", "1_230"); + }} + ); + } + + + @Test + public void WhiteCityStatsAndKeywordsAreCorrect() throws DecisionResultInvalidException, CardNotFoundException { + + /** + * Set: VSet1, VPack1 + * Title: *I Will Not Let the White City Fall + * Side: Free Peoples + * Culture: Gondor + * Twilight Cost: 2 + * Type: Condition + * Subtype: Support Area + * Game Text: Each time Boromir loses a skirmish, make Aragorn strength +2 until the regroup phase. + * Each time Aragorn loses a skirmish, make Boromir strength +2 until the regroup phase. + */ + + //Pre-game setup + GenericCardTestHelper scn = GetScenario(); + + PhysicalCardImpl whitecity = scn.GetFreepsCard("whitecity"); + + assertTrue(scn.HasKeyword(whitecity, Keyword.SUPPORT_AREA)); + assertEquals(2, whitecity.getBlueprint().getTwilightCost()); + assertTrue(whitecity.getBlueprint().isUnique()); + } + + @Test + public void OneIsBuffedWhenOtherLosesSkirmish() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + GenericCardTestHelper scn = GetScenario(); + + PhysicalCardImpl aragorn = scn.GetFreepsCard("aragorn"); + PhysicalCardImpl boromir = scn.GetFreepsCard("boromir"); + PhysicalCardImpl whitecity = scn.GetFreepsCard("whitecity"); + + scn.FreepsMoveCharToTable(aragorn); + scn.FreepsMoveCharToTable(boromir); + scn.FreepsMoveCardToHand(whitecity); + + PhysicalCardImpl cantea = scn.GetShadowCard("cantea"); + PhysicalCardImpl attea = scn.GetShadowCard("attea"); + scn.ShadowMoveCharToTable(cantea, attea); + + scn.StartGame(); + scn.FreepsPlayCard(whitecity); + scn.SkipToPhase(Phase.ASSIGNMENT); + + assertEquals(7, scn.GetStrength(boromir)); + assertEquals(8, scn.GetStrength(aragorn)); + + scn.SkipCurrentPhaseActions(); + + //Standard assignment + scn.FreepsAssignToMinions(new PhysicalCardImpl[] { aragorn, cantea}, new PhysicalCardImpl[] { boromir, attea}); + + scn.FreepsResolveSkirmish(aragorn); + scn.SkipCurrentPhaseActions(); + scn.FreepsAcceptOptionalTrigger(); //Have to resolve the skirmish and the condition trigger + // 14 > 8, Aragorn lost, Boromir should be buffed + assertEquals(9, scn.GetStrength(boromir)); + assertEquals(8, scn.GetStrength(aragorn)); + + scn.FreepsResolveSkirmish(boromir); + scn.SkipCurrentPhaseActions(); + scn.FreepsAcceptOptionalTrigger(); //Have to resolve the skirmish and the condition trigger + // 12 > 9, Boromir lost, Aragorn should be buffed + assertEquals(9, scn.GetStrength(boromir)); + assertEquals(10, scn.GetStrength(aragorn)); + + //Fierce assignment + scn.FreepsSkipCurrentPhaseAction(); + scn.ShadowSkipCurrentPhaseAction(); + + scn.FreepsAssignToMinions(new PhysicalCardImpl[] { aragorn, cantea}, new PhysicalCardImpl[] { boromir, attea}); + scn.FreepsResolveSkirmish(boromir); + scn.SkipCurrentPhaseActions(); + scn.FreepsAcceptOptionalTrigger(); //Have to resolve the skirmish and the condition trigger + // 10 > 9, Boromir lost again, Aragorn should be buffed again + assertEquals(9, scn.GetStrength(boromir)); + assertEquals(12, scn.GetStrength(aragorn)); + + scn.FreepsResolveSkirmish(aragorn); + //Aragorn now wins his skirmish, so there's no loss trigger to evaluate + + scn.SkipToPhase(Phase.REGROUP); + + //strength should be back to normal + assertEquals(7, scn.GetStrength(boromir)); + assertEquals(8, scn.GetStrength(aragorn)); + } + + +} diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vset1/vpack1/Card_V1_003Tests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vset1/vpack1/Card_V1_003Tests.java new file mode 100644 index 000000000..054ce46b7 --- /dev/null +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vset1/vpack1/Card_V1_003Tests.java @@ -0,0 +1,95 @@ +package com.gempukku.lotro.cards.unofficial.pc.vset1.vpack1; + +import com.gempukku.lotro.cards.GenericCardTestHelper; +import com.gempukku.lotro.common.Keyword; +import com.gempukku.lotro.common.Phase; +import com.gempukku.lotro.common.Signet; +import com.gempukku.lotro.game.CardNotFoundException; +import com.gempukku.lotro.game.PhysicalCardImpl; +import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException; +import org.junit.Test; + +import java.util.HashMap; + +import static junit.framework.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +public class Card_V1_003Tests +{ + + protected GenericCardTestHelper GetScenario() throws CardNotFoundException, DecisionResultInvalidException { + return new GenericCardTestHelper( + new HashMap() + {{ + put("boromir", "101_003"); + put("sam", "1_311"); + put("merry", "1_302"); + put("pippin", "1_307"); + }} + ); + } + + + @Test + public void BoromirStatsAndKeywordsAreCorrect() throws DecisionResultInvalidException, CardNotFoundException { + + /** + * Set: VSet1, VPack1 + * Title: *Boromir + * Subtitle: The Redeemed + * Side: Free Peoples + * Culture: Gondor + * Twilight Cost: 3 + * Type: Companion + * Subtype: Man + * Strength: 7 + * Vitality: 3 + * Signet: Aragorn + * Game Text: While you can spot 2 [shire] companions, Boromir is defender +1. + * While you can spot 4 [shire] companions, Boromir is strength +2 and damage +1. + */ + + //Pre-game setup + GenericCardTestHelper scn = GetScenario(); + + PhysicalCardImpl boromir = scn.GetFreepsCard("boromir"); + + assertTrue(boromir.getBlueprint().isUnique()); + assertEquals(3, boromir.getBlueprint().getTwilightCost()); + assertEquals(7, boromir.getBlueprint().getStrength()); + assertEquals(3, boromir.getBlueprint().getVitality()); + assertEquals(Signet.ARAGORN, boromir.getBlueprint().getSignet()); + } + + @Test + public void TwoAndFourHobbitsTriggerBuffs() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + GenericCardTestHelper scn = GetScenario(); + + PhysicalCardImpl boromir = scn.GetFreepsCard("boromir"); + PhysicalCardImpl sam = scn.GetFreepsCard("sam"); + PhysicalCardImpl merry = scn.GetFreepsCard("merry"); + PhysicalCardImpl pippin = scn.GetFreepsCard("pippin"); + + scn.FreepsMoveCardToHand(sam, merry, pippin); + scn.FreepsMoveCharToTable(boromir); + + scn.StartGame(); + + assertFalse(scn.HasKeyword(boromir, Keyword.DEFENDER)); + assertFalse(scn.HasKeyword(boromir, Keyword.DAMAGE)); + assertEquals(7, scn.GetStrength(boromir)); + + scn.FreepsPlayCard(sam); + assertTrue(scn.HasKeyword(boromir, Keyword.DEFENDER)); + assertEquals(7, scn.GetStrength(boromir)); + + scn.FreepsPlayCard(merry); + scn.FreepsPlayCard(pippin); + assertTrue(scn.HasKeyword(boromir, Keyword.DAMAGE)); + assertEquals(9, scn.GetStrength(boromir)); + } + + +} diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vset1/vpack1/Card_V1_004Tests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vset1/vpack1/Card_V1_004Tests.java new file mode 100644 index 000000000..ad5955514 --- /dev/null +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vset1/vpack1/Card_V1_004Tests.java @@ -0,0 +1,106 @@ +package com.gempukku.lotro.cards.unofficial.pc.vset1.vpack1; + +import com.gempukku.lotro.cards.GenericCardTestHelper; +import com.gempukku.lotro.common.Keyword; +import com.gempukku.lotro.common.Phase; +import com.gempukku.lotro.common.Zone; +import com.gempukku.lotro.game.CardNotFoundException; +import com.gempukku.lotro.game.PhysicalCardImpl; +import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException; +import org.junit.Test; + +import java.util.HashMap; + +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +public class Card_V1_004Tests +{ + + protected GenericCardTestHelper GetScenario() throws CardNotFoundException, DecisionResultInvalidException { + return new GenericCardTestHelper( + new HashMap() + {{ + put("aragorn", "1_89"); + put("boromir", "1_97"); + put("loud", "101_004"); + + put("attea", "1_229"); + }} + ); + } + + + @Test + public void LoudAndClearStatsAndKeywordsAreCorrect() throws DecisionResultInvalidException, CardNotFoundException { + + /** + * Set: VSet1, VPack1 + * Title: *Loud and Clear It Sounds + * Side: Free Peoples + * Culture: Gondor + * Twilight Cost: 1 + * Type: Condition + * Subtype: Support Area + * Game Text: Each time the Shadow player assigns as minion to a [shire] companion, you may exert a [gondor] companion and discard this condition to assign that minion to that [gondor] companion instead. + */ + + //Pre-game setup + GenericCardTestHelper scn = GetScenario(); + + PhysicalCardImpl loud = scn.GetFreepsCard("loud"); + + assertTrue(scn.HasKeyword(loud, Keyword.SUPPORT_AREA)); + assertEquals(1, loud.getBlueprint().getTwilightCost()); + assertTrue(loud.getBlueprint().isUnique()); + } + + @Test + public void LoudAndClearInterceptsShadowAssignment() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + GenericCardTestHelper scn = GetScenario(); + + PhysicalCardImpl frodo = scn.GetRingBearer(); + PhysicalCardImpl aragorn = scn.GetFreepsCard("aragorn"); + PhysicalCardImpl boromir = scn.GetFreepsCard("boromir"); + PhysicalCardImpl loud = scn.GetFreepsCard("loud"); + + scn.FreepsMoveCharToTable(boromir, aragorn); + scn.FreepsMoveCardToSupportArea(loud); + + PhysicalCardImpl attea = scn.GetShadowCard("attea"); + scn.ShadowMoveCharToTable(attea); + + scn.StartGame(); + scn.SkipToPhase(Phase.ASSIGNMENT); + + //Assignment actions + scn.SkipCurrentPhaseActions(); + + //Skip standard assignment so shadow assigns + scn.FreepsSkipCurrentPhaseAction(); + + scn.ShadowAssignToMinions(frodo, attea); + + assertTrue(scn.FreepsHasOptionalTriggerAvailable()); + scn.FreepsAcceptOptionalTrigger(); + scn.FreepsChooseCard(boromir); + + assertTrue(loud.getZone() == Zone.DISCARD); + assertTrue(scn.IsCharAssigned(boromir)); + assertEquals(1, scn.GetWoundsOn(boromir)); + assertFalse(scn.IsCharAssigned(frodo)); + + scn.FreepsResolveSkirmish(boromir); + scn.SkipCurrentPhaseActions(); + + //fierce skirmish + scn.SkipCurrentPhaseActions(); + scn.FreepsAssignToMinions(frodo, attea); + //should only trigger if shadow assigns + assertFalse(scn.FreepsHasOptionalTriggerAvailable()); + } + + +} diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vset1/vpack1/Card_V1_005Tests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vset1/vpack1/Card_V1_005Tests.java new file mode 100644 index 000000000..67194eecb --- /dev/null +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vset1/vpack1/Card_V1_005Tests.java @@ -0,0 +1,126 @@ +package com.gempukku.lotro.cards.unofficial.pc.vset1.vpack1; + +import com.gempukku.lotro.cards.GenericCardTestHelper; +import com.gempukku.lotro.common.Keyword; +import com.gempukku.lotro.common.Phase; +import com.gempukku.lotro.common.Zone; +import com.gempukku.lotro.game.CardNotFoundException; +import com.gempukku.lotro.game.PhysicalCardImpl; +import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException; +import org.junit.Assert; +import org.junit.Test; + +import java.util.HashMap; + +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +public class Card_V1_005Tests +{ + + protected GenericCardTestHelper GetScenario() throws CardNotFoundException, DecisionResultInvalidException { + return new GenericCardTestHelper( + new HashMap() + {{ + put("aragorn", "1_89"); + put("boromir", "1_97"); + put("remnant", "101_005"); + + put("inquisitor", "1_268"); + }} + ); + } + + + @Test + public void RemnantStatsAndKeywordsAreCorrect() throws DecisionResultInvalidException, CardNotFoundException { + + /** + * Set: VSet1, VPack1 + * Title: *Remnant of Numenor + * Side: Free Peoples + * Culture: Gondor + * Twilight Cost: 1 + * Type: Condition + * Subtype: Support Area + * Game Text: To play, spot a [gondor] companion. + * Each time a card is discarded from your hand by a Shadow card, you may add (1) to shuffle a [gondor] card from your discard pile into your draw deck. + */ + + //Pre-game setup + GenericCardTestHelper scn = GetScenario(); + + PhysicalCardImpl remnant = scn.GetFreepsCard("remnant"); + + assertTrue(scn.HasKeyword(remnant, Keyword.SUPPORT_AREA)); + assertEquals(1, remnant.getBlueprint().getTwilightCost()); + } + + @Test + public void RemnantSpotsAGondorCompanionToPlay() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + GenericCardTestHelper scn = GetScenario(); + PhysicalCardImpl aragorn = scn.GetFreepsCard("aragorn"); + PhysicalCardImpl remnant = scn.GetFreepsCard("remnant"); + + scn.FreepsMoveCardToHand(aragorn, remnant); + + scn.StartGame(); + + assertEquals(Phase.FELLOWSHIP, scn.GetCurrentPhase()); + Assert.assertFalse(scn.FreepsCardPlayAvailable(remnant)); + + scn.FreepsPlayCard(aragorn); + assertTrue(scn.FreepsCardPlayAvailable(remnant)); + } + + @Test + public void RemnantTriggersOnShadowDiscardFromHand() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + GenericCardTestHelper scn = GetScenario(); + + PhysicalCardImpl frodo = scn.GetRingBearer(); + PhysicalCardImpl aragorn = scn.GetFreepsCard("aragorn"); + PhysicalCardImpl boromir = scn.GetFreepsCard("boromir"); + PhysicalCardImpl remnant = scn.GetFreepsCard("remnant"); + + scn.FreepsMoveCardToDiscard(boromir); + scn.FreepsMoveCardToHand(aragorn); + scn.FreepsMoveCardToSupportArea(remnant); + + PhysicalCardImpl inquisitor = scn.GetShadowCard("inquisitor"); + scn.ShadowMoveCardToHand(inquisitor); + + scn.StartGame(); + + scn.SetTwilight(10); + + scn.FreepsSkipCurrentPhaseAction(); + + assertEquals(1, scn.GetFreepsHandCount()); + assertEquals(1, scn.GetFreepsDeckCount()); //the orc is also in the deck + assertEquals(1, scn.GetFreepsDiscardCount()); + + scn.ShadowPlayCard(inquisitor); + scn.ShadowAcceptOptionalTrigger(); + + assertTrue(scn.FreepsHasOptionalTriggerAvailable()); + scn.FreepsAcceptOptionalTrigger(); + + //scn.FreepsGetADParamAsList() + + scn.FreepsChoose("temp0"); + + //Card from hand was discarded, one of the two cards in the discard was shuffled in with the orc + assertEquals(0, scn.GetFreepsHandCount()); + assertEquals(2, scn.GetFreepsDeckCount()); + assertEquals(1, scn.GetFreepsDiscardCount()); + + // 10 starting + 2 for moving - 5 for the orc + 1 for Remnant triggering + assertEquals(8, scn.GetTwilight()); + + } + + +}