diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set1/set1-moria.json b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set1/set1-moria.json index de082c642..be89b4695 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set1/set1-moria.json +++ b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set1/set1-moria.json @@ -811,11 +811,12 @@ "cost": { "type": "discardFromHand", "forced": false, - "count": 3 + "count": 3, + "memorize": "discardedCards" }, "effect": { "type": "playCardFromDiscard", - "filter": "choose(culture(moria),orc)" + "filter": "choose(culture(moria),orc,not(memory(discardedCards)))" } } }, 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 7006b588d..8a17b3b19 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 @@ -42,7 +42,7 @@ public class EffectAppenderFactory { effectAppenderProducers.put("putonring", new PutOnRing()); effectAppenderProducers.put("takeoffring", new TakeOffRing()); effectAppenderProducers.put("discardstackedcards", new DiscardStackedCards()); - effectAppenderProducers.put("memorize", new Memorize()); + effectAppenderProducers.put("memorize", new MemorizeActive()); effectAppenderProducers.put("memorizenumber", new MemorizeNumber()); effectAppenderProducers.put("preventwound", new PreventWound()); effectAppenderProducers.put("preventexert", new PreventExert()); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/Memorize.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/MemorizeActive.java similarity index 97% rename from gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/Memorize.java rename to gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/MemorizeActive.java index 054cf7aee..c71c402a5 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/Memorize.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/MemorizeActive.java @@ -18,7 +18,7 @@ import org.json.simple.JSONObject; import java.util.Collection; -public class Memorize implements EffectAppenderProducer { +public class MemorizeActive implements EffectAppenderProducer { @Override public EffectAppender createEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { FieldUtils.validateAllowedFields(effectObject, "filter", "memory"); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/filters/Filters.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/filters/Filters.java index 5d32e4338..a462ea50b 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/filters/Filters.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/filters/Filters.java @@ -74,12 +74,13 @@ public class Filters { return getCardsMatchingFilter.getPhysicalCards(); } - public static Collection filter(Collection cards, LotroGame game, Filterable... filters) { + public static Collection filter(Iterable cards, LotroGame game, Filterable... filters) { Filter filter = Filters.and(filters); List result = new LinkedList(); - for (PhysicalCard card : cards) + for (PhysicalCard card : cards) { if (filter.accepts(game, card)) result.add(card); + } return result; } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/GameState.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/GameState.java index f184fe2e7..9cd572e85 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/GameState.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/GameState.java @@ -554,6 +554,10 @@ public class GameState { return _allCards.get(cardId); } + public Iterable getAllCards() { + return Collections.unmodifiableCollection(_allCards.values()); + } + public List getHand(String playerId) { return Collections.unmodifiableList(_hands.get(playerId)); } diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/AbstractAtTest.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/AbstractAtTest.java index 9a73ebbff..bccc23d87 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/AbstractAtTest.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/AbstractAtTest.java @@ -34,7 +34,7 @@ public abstract class AbstractAtTest { protected static final String P2 = "player2"; protected PhysicalCardImpl createCard(String owner, String blueprintId) throws CardNotFoundException { - return new PhysicalCardImpl(cardId++, blueprintId, owner, _library.getLotroCardBlueprint(blueprintId)); + return (PhysicalCardImpl) _game.getGameState().createPhysicalCard(owner, _library, blueprintId); } protected void initializeSimplestGame() throws DecisionResultInvalidException { diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/effects/PlayCardFromDiscardAtTest.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/effects/PlayCardFromDiscardAtTest.java new file mode 100644 index 000000000..144ddc4b5 --- /dev/null +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/effects/PlayCardFromDiscardAtTest.java @@ -0,0 +1,46 @@ +package com.gempukku.lotro.at.effects; + +import com.gempukku.lotro.at.AbstractAtTest; +import com.gempukku.lotro.common.Phase; +import com.gempukku.lotro.common.Zone; +import com.gempukku.lotro.game.CardNotFoundException; +import com.gempukku.lotro.game.PhysicalCard; +import com.gempukku.lotro.game.PhysicalCardImpl; +import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException; +import org.junit.Test; + +import java.util.Map; + +import static junit.framework.Assert.assertEquals; + +public class PlayCardFromDiscardAtTest extends AbstractAtTest { + @Test + public void cantPlayCardDiscardedWithTheyAreComing() throws Exception { + initializeSimplestGame(); + + final PhysicalCardImpl theyAreComing = createCard(P2, "1_196"); + final PhysicalCardImpl goblinSneakInDiscard = createCard(P2, "1_181"); + + _game.getGameState().addCardToZone(_game, theyAreComing, Zone.SUPPORT); + _game.getGameState().addCardToZone(_game, goblinSneakInDiscard, Zone.DISCARD); + + for (int i = 0; i < 3; i++) { + final PhysicalCardImpl goblinRunner = createCard(P2, "1_178"); + _game.getGameState().addCardToZone(_game, goblinRunner, Zone.HAND); + } + + skipMulligans(); + + _game.getGameState().setTwilight(10); + + assertEquals(Phase.FELLOWSHIP, _game.getGameState().getCurrentPhase()); + playerDecided(P1, ""); + + playerDecided(P2, getCardActionId(P2, "Use They Are Coming")); + + Map decisionParameters = _userFeedback.getAwaitingDecision(P2).getDecisionParameters(); + String[] cardId = (String[]) decisionParameters.get("cardId"); + assertEquals(1, cardId.length); + assertEquals(String.valueOf(goblinSneakInDiscard.getCardId()), cardId[0]); + } +}