diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/PlayUtils.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/PlayUtils.java index 84140b9c9..61bd6b63e 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/PlayUtils.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/PlayUtils.java @@ -104,6 +104,9 @@ public class PlayUtils { if (!game.getModifiersQuerying().canPayExtraCostsToPlay(game, card)) return false; + if (!game.getModifiersQuerying().canPlayCard(game, card.getOwner(), card)) + return false; + // Check uniqueness if (!blueprint.skipUniquenessCheck() && !PlayConditions.checkUniqueness(game, card, ignoreCheckingDeadPile)) return false; diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/AbstractModifier.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/AbstractModifier.java index 9ea67bb9d..9b5bf93bf 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/AbstractModifier.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/AbstractModifier.java @@ -208,6 +208,11 @@ public abstract class AbstractModifier implements Modifier { return true; } + @Override + public boolean canPlayCard(LotroGame game, String performingPlayer, PhysicalCard card) { + return true; + } + @Override public List getExtraPhaseAction(LotroGame game, PhysicalCard card) { return null; diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/CantPlayCardsModifier.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/CantPlayCardsModifier.java index 7fba6de39..0a116d1c2 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/CantPlayCardsModifier.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/CantPlayCardsModifier.java @@ -19,6 +19,11 @@ public class CantPlayCardsModifier extends AbstractModifier { _filters = Filters.and(filters); } + @Override + public boolean canPlayCard(LotroGame game, String performingPlayer, PhysicalCard card) { + return !_filters.accepts(game, card); + } + @Override public boolean canPlayAction(LotroGame game, String performingPlayer, Action action) { final PhysicalCard actionSource = action.getActionSource(); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/Modifier.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/Modifier.java index 872be13a2..fd315dd65 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/Modifier.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/Modifier.java @@ -85,6 +85,8 @@ public interface Modifier { boolean canPlayAction(LotroGame game, String performingPlayer, Action action); + boolean canPlayCard(LotroGame game, String performingPlayer, PhysicalCard card); + List getExtraPhaseAction(LotroGame game, PhysicalCard card); List getExtraPhaseActionFromStacked(LotroGame game, PhysicalCard card); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersLogic.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersLogic.java index 938d9394e..2a73c0d86 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersLogic.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersLogic.java @@ -682,6 +682,14 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying { return true; } + @Override + public boolean canPlayCard(LotroGame game, String performingPlayer, PhysicalCard card) { + for (Modifier modifier : getModifiers(game, ModifierEffect.ACTION_MODIFIER)) + if (!modifier.canPlayCard(game, performingPlayer, card)) + return false; + return true; + } + @Override public boolean canHavePlayedOn(LotroGame game, PhysicalCard playedCard, PhysicalCard target) { for (Modifier modifier : getModifiersAffectingCard(game, ModifierEffect.TARGET_MODIFIER, target)) diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersQuerying.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersQuerying.java index cb1bd0128..a3921d1ac 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersQuerying.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersQuerying.java @@ -103,6 +103,8 @@ public interface ModifiersQuerying { // Playing actions public boolean canPlayAction(LotroGame game, String performingPlayer, Action action); + public boolean canPlayCard(LotroGame game, String performingPlayer, PhysicalCard card); + public boolean canHavePlayedOn(LotroGame game, PhysicalCard playedCard, PhysicalCard target); public boolean canHaveTransferredOn(LotroGame game, PhysicalCard playedCard, PhysicalCard target); 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 index 1ee8e880d..6698a3926 100644 --- 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 @@ -149,4 +149,38 @@ public class PlayCardFromDiscardAtTest extends AbstractAtTest { assertFalse(_userFeedback.getAwaitingDecision(P2).getDecisionType() == AwaitingDecisionType.MULTIPLE_CHOICE); } + + @Test + public void azogCantPlayTrollFromDiscardInRivendell() throws Exception { + initializeSimplestGame(); + + skipMulligans(); + + final PhysicalCardImpl rivendell = createCard(P2, "30_51"); + rivendell.setSiteNumber(2); + _game.getGameState().addCardToZone(_game, rivendell, Zone.ADVENTURE_PATH); + + PhysicalCardImpl azog = createCard(P2, "32_28"); + _game.getGameState().addCardToZone(_game, azog, Zone.SHADOW_CHARACTERS); + + PhysicalCardImpl watchfulOrc = createCard(P2, "30_40"); + _game.getGameState().addCardToZone(_game, watchfulOrc, Zone.SHADOW_CHARACTERS); + + PhysicalCardImpl demolitionTroll = createCard(P2, "32_31"); + _game.getGameState().addCardToZone(_game, demolitionTroll, Zone.DISCARD); + + _game.getGameState().setTwilight(20); + + // Fellowship phase + playerDecided(P1, ""); + // Shadow phase + playerDecided(P2, getCardActionId(P2, "Use Watchful Orc")); + // Choose Battleground + playerDecided(P2, "0"); + playerDecided(P2, ""); + // Maneuver phase + playerDecided(P1, ""); + + assertNull(getCardActionId(P2, "Use Azog")); + } }