diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set2/set2-moria.json b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set2/set2-moria.json new file mode 100644 index 000000000..973c42f45 --- /dev/null +++ b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set2/set2-moria.json @@ -0,0 +1,282 @@ +{ + "2_49": { + "side": "shadow", + "site": 4, + "cost": 4, + "race": "Orc", + "strength": 8, + "culture": "Moria", + "vitality": 2, + "title": "*Archer Commander", + "type": "minion", + "keyword": "Archer", + "effects": { + "type": "modifier", + "modifier": { + "type": "modifyStrength", + "filter": "another,culture(moria),archer", + "amount": 2 + } + } + }, + "2_50": { + "side": "shadow", + "cost": 1, + "strength": 3, + "culture": "Moria", + "possession": "Hand Weapon", + "title": "*The Balrog's Sword", + "type": "artifact", + "target": "name(The Balrog)", + "effects": [ + { + "type": "modifier", + "modifier": { + "type": "addKeyword", + "filter": "bearer", + "keyword": "damage+1" + } + }, + { + "type": "extraPossessionClass" + } + ] + }, + "2_51": { + "side": "shadow", + "site": 4, + "cost": 12, + "race": "Balrog", + "strength": 17, + "culture": "Moria", + "vitality": 5, + "subtitle": "Durin's Bane", + "title": "*The Balrog", + "type": "minion", + "keyword": [ + "Damage", + "Fierce" + ], + "effects": [ + { + "type": "trigger", + "trigger": { + "type": "condition", + "condition": { + "type": "canSpot", + "filter": "another,minion" + } + }, + "effect": { + "type": "discard", + "filter": "all(another,minion)" + } + }, + { + "type": "modifier", + "modifier": { + "type": "skipPhase", + "phase": "archery" + } + }, + { + "type": "trigger", + "trigger": { + "type": "condition", + "condition": { + "type": "not", + "condition": { + "type": "location", + "filter": "underground" + } + } + }, + "effect": { + "type": "discard", + "filter": "self" + } + } + ] + }, + "2_52": { + "side": "shadow", + "site": 4, + "cost": 14, + "race": "Balrog", + "strength": 17, + "culture": "Moria", + "vitality": 5, + "subtitle": "Flame of Udun", + "title": "*The Balrog", + "type": "minion", + "keyword": [ + "Damage", + "Fierce" + ], + "condition": { + "type": "canSpot", + "filter": "culture(moria),orc" + }, + "effects": [ + { + "type": "trigger", + "trigger": { + "type": "condition", + "condition": { + "type": "not", + "condition": { + "type": "location", + "filter": "underground" + } + } + }, + "effect": { + "type": "discard", + "filter": "self" + } + }, + { + "type": "activated", + "phase": "shadow", + "cost": [ + { + "type": "exert", + "filter": "self" + }, + { + "type": "removeTwilight", + "amount": 2 + } + ], + "effect": { + "type": "playCardFromDiscard", + "filter": "choose(culture(moria),orc)" + } + } + ] + }, + "2_53": { + "side": "shadow", + "cost": 1, + "strength": 2, + "culture": "Moria", + "title": "*Cave Troll's Chain", + "type": "possession", + "target": "name(Cave Troll of Moria)", + "effects": [ + { + "type": "trigger", + "trigger": { + "type": "endOfPhase", + "phase": "maneuver" + }, + "effect": [ + { + "type": "chooseYesOrNo", + "player": "fp", + "text": "Would you like to skip the Archery phase?", + "memorize": "choice" + }, + { + "type": "conditional", + "condition": { + "type": "memoryIs", + "memory": "choice", + "value": "yes" + }, + "effect": { + "type": "addModifier", + "until": "start(regroup)", + "modifier": { + "type": "skipPhase", + "phase": "archery" + } + } + } + ] + }, + { + "type": "trigger", + "trigger": { + "type": "takesWound", + "filter": "bearer" + }, + "condition": { + "type": "phase", + "phase": "archery" + }, + "optional": true, + "effect": { + "type": "wound", + "filter": "choose(archer,companion)" + } + } + ] + }, + "2_54": { + "side": "shadow", + "cost": 1, + "strength": -2, + "culture": "Moria", + "title": "Dark Fire", + "type": "condition", + "condition": { + "type": "canSpot", + "filter": "name(The Balrog)" + }, + "target": "name(Gandalf)", + "effects": { + "type": "trigger", + "trigger": { + "type": "moves" + }, + "effect": { + "type": "exert", + "filter": "all(name(Gandalf))" + } + } + }, + "2_55": { + "side": "shadow", + "cost": 1, + "culture": "Moria", + "title": "Dark Places", + "type": "condition", + "keyword": "Support Area", + "effects": [ + { + "type": "modifier", + "modifier": { + "type": "modifyStrength", + "filter": "unique,culture(moria),minion", + "amount": 1 + } + }, + { + "type": "activated", + "phase": "shadow", + "condition": { + "type": "canSpot", + "filter": "not(your),site" + }, + "effect": [ + { + "type": "chooseActiveCards", + "text": "Choose opponent's site", + "filter": "choose(not(your),site)", + "memorize": "chosenSite" + }, + { + "type": "playSite", + "block": "fellowship", + "number": { + "type": "siteNumberInMemory", + "memory": "chosenSite" + }, + "filter": "or(marsh,underground)" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/Transfer.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/Transfer.java index 358451182..2d4baba24 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/Transfer.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/Transfer.java @@ -2,12 +2,16 @@ 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.cards.build.field.effect.appender.resolver.ValueResolver; +import com.gempukku.lotro.common.Filterable; import com.gempukku.lotro.filters.Filter; +import com.gempukku.lotro.filters.Filters; import com.gempukku.lotro.game.PhysicalCard; import com.gempukku.lotro.logic.actions.CostToEffectAction; import com.gempukku.lotro.logic.effects.TransferPermanentEffect; @@ -31,7 +35,7 @@ public class Transfer implements EffectAppenderProducer { result.addEffectAppender( CardResolver.resolveCard(filter, "_temp1", "you", "Choose card to transfer", environment)); result.addEffectAppender( - CardResolver.resolveCard(where, + CardResolver.resolveCards(where, actionContext -> (Filter) (game, physicalCard) -> { final Collection transferCard = actionContext.getCardsFromMemory("_temp1"); if (transferCard.isEmpty()) @@ -41,7 +45,8 @@ public class Transfer implements EffectAppenderProducer { if (transferredCard.getAttachedTo() == physicalCard) return false; return actionContext.getGame().getModifiersQuerying().canHaveTransferredOn(game, transferredCard, physicalCard); - }, "_temp2", "you", "Choose cards to transfer to", environment)); + }, actionContext -> Filters.any, + ValueResolver.resolveEvaluator(1, environment), "_temp2", "you", "Choose cards to transfer to", environment)); result.addEffectAppender( new DelayedAppender() { @Override diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/TransferFromDiscard.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/TransferFromDiscard.java index 7e18c4f53..29fedc29d 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/TransferFromDiscard.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/TransferFromDiscard.java @@ -2,12 +2,16 @@ 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.cards.build.field.effect.appender.resolver.ValueResolver; +import com.gempukku.lotro.common.Filterable; import com.gempukku.lotro.filters.Filter; +import com.gempukku.lotro.filters.Filters; import com.gempukku.lotro.game.PhysicalCard; import com.gempukku.lotro.logic.actions.CostToEffectAction; import com.gempukku.lotro.logic.effects.TransferPermanentNotFromPlayEffect; @@ -32,7 +36,7 @@ public class TransferFromDiscard implements EffectAppenderProducer { result.addEffectAppender( CardResolver.resolveCardsInDiscard(filter, new ConstantEvaluator(1), "_temp1", "you", "Choose card to transfer", environment)); result.addEffectAppender( - CardResolver.resolveCard(where, + CardResolver.resolveCards(where, actionContext -> (Filter) (game, physicalCard) -> { final Collection transferCard = actionContext.getCardsFromMemory("_temp1"); if (transferCard.isEmpty()) @@ -42,7 +46,8 @@ public class TransferFromDiscard implements EffectAppenderProducer { if (transferredCard.getAttachedTo() == physicalCard) return false; return actionContext.getGame().getModifiersQuerying().canHaveTransferredOn(game, transferredCard, physicalCard); - }, "_temp2", "you", "Choose cards to transfer to", environment)); + }, actionContext -> Filters.any, + ValueResolver.resolveEvaluator(1, environment), "_temp2", "you", "Choose cards to transfer to", environment)); result.addEffectAppender( new DelayedAppender() { @Override diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/IndividualCardAtTest.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/IndividualCardAtTest.java index e5bcc01cf..4a5c888a8 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/IndividualCardAtTest.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/IndividualCardAtTest.java @@ -1308,4 +1308,106 @@ public class IndividualCardAtTest extends AbstractAtTest { assertEquals(burdens, _game.getGameState().getBurdens()); } + + @Test + public void morgulBladeTransferFromSupportArea() throws DecisionResultInvalidException, CardNotFoundException { + initializeSimplestGame(); + + PhysicalCardImpl nelya = createCard(P2, "2_84"); + PhysicalCardImpl morgulBlade = createCard(P2, "1_216"); + PhysicalCardImpl bladeTip = createCard(P2, "1_209"); + + _game.getGameState().addCardToZone(_game, nelya, Zone.SHADOW_CHARACTERS); + _game.getGameState().addCardToZone(_game, bladeTip, Zone.SUPPORT); + _game.getGameState().attachCard(_game, morgulBlade, nelya); + + skipMulligans(); + + // End fellowship phase + playerDecided(P1, ""); + + // End shadow phase + playerDecided(P2, ""); + + // End maneuver phase + playerDecided(P1, ""); + playerDecided(P2, ""); + + // End archery phase + playerDecided(P1, ""); + playerDecided(P2, ""); + + // End assignment phase + playerDecided(P1, ""); + playerDecided(P2, ""); + + // Assign Frodo to Nelya + PhysicalCard frodo = _game.getGameState().getRingBearer(P1); + playerDecided(P1, frodo.getCardId() + " " + nelya.getCardId()); + + // Start skirmish + playerDecided(P1, String.valueOf(frodo.getCardId())); + + // P1 Passes + playerDecided(P1, ""); + + // Use Morgul Blade + playerDecided(P2, "0"); + + assertEquals(Zone.DISCARD, morgulBlade.getZone()); + assertEquals(Zone.ATTACHED, bladeTip.getZone()); + + System.out.println(); + } + + @Test + public void morgulBladeTransferFromDiscard() throws DecisionResultInvalidException, CardNotFoundException { + initializeSimplestGame(); + + PhysicalCardImpl nelya = createCard(P2, "2_84"); + PhysicalCardImpl morgulBlade = createCard(P2, "1_216"); + PhysicalCardImpl bladeTip = createCard(P2, "1_209"); + + _game.getGameState().addCardToZone(_game, nelya, Zone.SHADOW_CHARACTERS); + _game.getGameState().addCardToZone(_game, bladeTip, Zone.DISCARD); + _game.getGameState().attachCard(_game, morgulBlade, nelya); + + skipMulligans(); + + // End fellowship phase + playerDecided(P1, ""); + + // End shadow phase + playerDecided(P2, ""); + + // End maneuver phase + playerDecided(P1, ""); + playerDecided(P2, ""); + + // End archery phase + playerDecided(P1, ""); + playerDecided(P2, ""); + + // End assignment phase + playerDecided(P1, ""); + playerDecided(P2, ""); + + // Assign Frodo to Nelya + PhysicalCard frodo = _game.getGameState().getRingBearer(P1); + playerDecided(P1, frodo.getCardId() + " " + nelya.getCardId()); + + // Start skirmish + playerDecided(P1, String.valueOf(frodo.getCardId())); + + // P1 Passes + playerDecided(P1, ""); + + // Use Morgul Blade + playerDecided(P2, "0"); + + assertEquals(Zone.DISCARD, morgulBlade.getZone()); + assertEquals(Zone.ATTACHED, bladeTip.getZone()); + + System.out.println(); + } }