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()); + + } + + +}