diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/RevealAndChooseCardsFromOpponentHandEffect.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/RevealAndChooseCardsFromOpponentHandEffect.java index 842b5c5d8..ac073581b 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/RevealAndChooseCardsFromOpponentHandEffect.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/RevealAndChooseCardsFromOpponentHandEffect.java @@ -31,17 +31,19 @@ public abstract class RevealAndChooseCardsFromOpponentHandEffect extends Unrespo @Override public void doPlayEffect(LotroGame game) { - List opponentHand = new LinkedList(game.getGameState().getHand(_opponentId)); - Collection selectable = Filters.filter(opponentHand, game.getGameState(), game.getModifiersQuerying(), _selectionFilter); + if (game.getModifiersQuerying().canLookOrRevealCardsInHand(game.getGameState(), _opponentId)) { + List opponentHand = new LinkedList(game.getGameState().getHand(_opponentId)); + Collection selectable = Filters.filter(opponentHand, game.getGameState(), game.getModifiersQuerying(), _selectionFilter); - game.getUserFeedback().sendAwaitingDecision(_playerId, - new ArbitraryCardsSelectionDecision(1, _text, opponentHand, new LinkedList(selectable), Math.min(_minChosen, selectable.size()), Math.min(_maxChosen, selectable.size())) { - @Override - public void decisionMade(String result) throws DecisionResultInvalidException { - List selectedCards = getSelectedCardsByResponse(result); - cardsSelected(selectedCards); - } - }); + game.getUserFeedback().sendAwaitingDecision(_playerId, + new ArbitraryCardsSelectionDecision(1, _text, opponentHand, new LinkedList(selectable), Math.min(_minChosen, selectable.size()), Math.min(_maxChosen, selectable.size())) { + @Override + public void decisionMade(String result) throws DecisionResultInvalidException { + List selectedCards = getSelectedCardsByResponse(result); + cardsSelected(selectedCards); + } + }); + } } protected abstract void cardsSelected(List selectedCards); diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/OpponentsCantLookOrRevealCardsFromHand.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/OpponentsCantLookOrRevealCardsFromHand.java new file mode 100644 index 000000000..3c7224698 --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/OpponentsCantLookOrRevealCardsFromHand.java @@ -0,0 +1,23 @@ +package com.gempukku.lotro.cards.modifiers; + +import com.gempukku.lotro.game.PhysicalCard; +import com.gempukku.lotro.game.state.GameState; +import com.gempukku.lotro.logic.modifiers.AbstractModifier; +import com.gempukku.lotro.logic.modifiers.ModifierEffect; +import com.gempukku.lotro.logic.modifiers.ModifiersQuerying; + +public class OpponentsCantLookOrRevealCardsFromHand extends AbstractModifier { + private String _playerId; + + public OpponentsCantLookOrRevealCardsFromHand(PhysicalCard source, String playerId) { + super(source, "Opponents can't look or reveal cards from hand", null, new ModifierEffect[]{ModifierEffect.LOOK_OR_REVEAL_MODIFIER}); + _playerId = playerId; + } + + @Override + public boolean canLookOrRevealCardsInHand(GameState gameState, ModifiersQuerying modifiersQuerying, String playerId) { + if (_playerId.equals(playerId)) + return false; + return true; + } +} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/elven/Card1_055.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/elven/Card1_055.java index 5dc28bd42..157fde884 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/elven/Card1_055.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/elven/Card1_055.java @@ -49,16 +49,18 @@ public class Card1_055 extends AbstractPermanent { new MultipleChoiceAwaitingDecision(1, "Choose opponent with at least 7 cards in hand", opponentsHavingAtLeast7Cards(game, playerId)) { @Override protected void validDecisionMade(int index, final String chosenOpponent) { - List hand = game.getGameState().getHand(chosenOpponent); - List randomCardsFromHand = GameUtils.getRandomCards(hand, 2); - action.appendEffect( - new ChooseArbitraryCardsEffect(playerId, "Choose card to discard", randomCardsFromHand, 1, 1) { - @Override - protected void cardsSelected(List selectedCards) { - action.appendEffect( - new DiscardCardFromDeckEffect(chosenOpponent, selectedCards.get(0))); - } - }); + if (game.getModifiersQuerying().canLookOrRevealCardsInHand(game.getGameState(), chosenOpponent)) { + List hand = game.getGameState().getHand(chosenOpponent); + List randomCardsFromHand = GameUtils.getRandomCards(hand, 2); + action.appendEffect( + new ChooseArbitraryCardsEffect(playerId, "Choose card to discard", randomCardsFromHand, 1, 1) { + @Override + protected void cardsSelected(List selectedCards) { + action.appendEffect( + new DiscardCardFromDeckEffect(chosenOpponent, selectedCards.get(0))); + } + }); + } } })); diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/gandalf/Card1_075.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/gandalf/Card1_075.java index 059fb7cad..c73ba12e1 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/gandalf/Card1_075.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/gandalf/Card1_075.java @@ -71,16 +71,15 @@ public class Card1_075 extends AbstractAttachableFPPossession { action.appendEffect( new ChooseOpponentEffect(playerId) { @Override - protected void opponentChosen(String opponentId) { + protected void opponentChosen(final String opponentId) { action.appendEffect( new RevealAndChooseCardsFromOpponentHandEffect(playerId, opponentId, "Opponent's hand", Filters.none(), 0, 0) { @Override protected void cardsSelected(List selectedCards) { - // This is just to reveal the hand + Collection orcs = Filters.filter(game.getGameState().getHand(opponentId), game.getGameState(), game.getModifiersQuerying(), Filters.race(Race.ORC)); + action.appendEffect(new RemoveTwilightEffect(orcs.size())); } }); - Collection orcs = Filters.filter(game.getGameState().getHand(opponentId), game.getGameState(), game.getModifiersQuerying(), Filters.race(Race.ORC)); - action.appendEffect(new RemoveTwilightEffect(orcs.size())); } }); return Collections.singletonList(action); diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/isengard/Card1_120.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/isengard/Card1_120.java index bdaf7d154..54f6e4aee 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/isengard/Card1_120.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/isengard/Card1_120.java @@ -56,17 +56,18 @@ public class Card1_120 extends AbstractPermanent { final ActivateCardAction action = new ActivateCardAction(self, Keyword.SHADOW, "Remove (3) and spot X burdens to make the Free Peoples player reveal X cards at random from hand. You may discard 1 revealed card."); action.appendCost(new RemoveTwilightEffect(3)); final String fpPlayer = gameState.getCurrentPlayerId(); - action.appendEffect( - new PlayoutDecisionEffect(game.getUserFeedback(), playerId, - new ArbitraryCardsSelectionDecision(1, "Choose card to discard", GameUtils.getRandomCards(gameState.getHand(fpPlayer), gameState.getBurdens()), 0, 1) { - @Override - public void decisionMade(String result) throws DecisionResultInvalidException { - List cards = getSelectedCardsByResponse(result); - if (cards.size() > 0) - action.appendEffect(new DiscardCardFromHandEffect(cards.get(0))); - } - }) - ); + if (game.getModifiersQuerying().canLookOrRevealCardsInHand(game.getGameState(), fpPlayer)) { + action.appendEffect( + new PlayoutDecisionEffect(game.getUserFeedback(), playerId, + new ArbitraryCardsSelectionDecision(1, "Choose card to discard", GameUtils.getRandomCards(gameState.getHand(fpPlayer), gameState.getBurdens()), 0, 1) { + @Override + public void decisionMade(String result) throws DecisionResultInvalidException { + List cards = getSelectedCardsByResponse(result); + if (cards.size() > 0) + action.appendEffect(new DiscardCardFromHandEffect(cards.get(0))); + } + })); + } return Collections.singletonList(action); } return null; diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/shire/Card1_313.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/shire/Card1_313.java index 3d13c3d2f..797920495 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/shire/Card1_313.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/shire/Card1_313.java @@ -68,24 +68,23 @@ public class Card1_313 extends AbstractAttachableFPPossession { action.appendEffect( new ChooseOpponentEffect(playerId) { @Override - protected void opponentChosen(String opponentId) { + protected void opponentChosen(final String opponentId) { action.appendEffect( new RevealAndChooseCardsFromOpponentHandEffect(playerId, opponentId, "Opponent's hand", Filters.none(), 0, 0) { @Override protected void cardsSelected(List selectedCards) { - // This is just to reveal the hand + Collection orcs = Filters.filter(game.getGameState().getHand(opponentId), game.getGameState(), game.getModifiersQuerying(), Filters.race(Race.ORC)); + Integer limit = (Integer) self.getData(); + int usedUp = 0; + if (limit != null) + usedUp = limit; + int toRemove = Math.min(4 - usedUp, orcs.size()); + if (toRemove > 0) { + self.storeData(usedUp + toRemove); + action.appendEffect(new RemoveTwilightEffect(toRemove)); + } } }); - Collection orcs = Filters.filter(game.getGameState().getHand(opponentId), game.getGameState(), game.getModifiersQuerying(), Filters.race(Race.ORC)); - Integer limit = (Integer) self.getData(); - int usedUp = 0; - if (limit != null) - usedUp = limit; - int toRemove = Math.min(4 - usedUp, orcs.size()); - if (toRemove > 0) { - self.storeData(usedUp + toRemove); - action.appendEffect(new RemoveTwilightEffect(toRemove)); - } } }); return Collections.singletonList(action); diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set2/gandalf/Card2_021.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set2/gandalf/Card2_021.java new file mode 100644 index 000000000..898b49522 --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set2/gandalf/Card2_021.java @@ -0,0 +1,38 @@ +package com.gempukku.lotro.cards.set2.gandalf; + +import com.gempukku.lotro.cards.AbstractAlly; +import com.gempukku.lotro.cards.modifiers.OpponentsCantLookOrRevealCardsFromHand; +import com.gempukku.lotro.common.Culture; +import com.gempukku.lotro.common.Race; +import com.gempukku.lotro.filters.Filters; +import com.gempukku.lotro.game.PhysicalCard; +import com.gempukku.lotro.game.state.LotroGame; +import com.gempukku.lotro.logic.modifiers.Modifier; + +/** + * Set: Mines of Moria + * Side: Free + * Culture: Gandalf + * Twilight Cost: 2 + * Type: Ally • Home 3 • Man + * Strength: 5 + * Vitality: 2 + * Site: 3 + * Game Text: To play, spot Gandalf. Shadow players may not look at or reveal cards in your hand. + */ +public class Card2_021 extends AbstractAlly { + public Card2_021() { + super(2, 3, 5, 2, Race.MAN, Culture.GANDALF, "Erland", true); + } + + @Override + public boolean checkPlayRequirements(String playerId, LotroGame game, PhysicalCard self, int twilightModifier) { + return super.checkPlayRequirements(playerId, game, self, twilightModifier) + && Filters.canSpot(game.getGameState(), game.getModifiersQuerying(), Filters.name("Gandalf")); + } + + @Override + public Modifier getAlwaysOnEffect(PhysicalCard self) { + return new OpponentsCantLookOrRevealCardsFromHand(self, self.getOwner()); + } +} 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 59a57cf2b..3d4359c56 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 @@ -148,4 +148,9 @@ public abstract class AbstractModifier implements Modifier { public int getRoamingPenalty(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, int result) { return result; } + + @Override + public boolean canLookOrRevealCardsInHand(GameState gameState, ModifiersQuerying modifiersQuerying, String playerId) { + return true; + } } 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 a78426b7d..120a01ff9 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 @@ -60,4 +60,6 @@ public interface Modifier { public boolean canBeDiscardedFromPlay(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard card, PhysicalCard source, boolean result); public boolean canBeHealed(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard card, boolean result); + + public boolean canLookOrRevealCardsInHand(GameState gameState, ModifiersQuerying modifiersQuerying, String playerId); } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifierEffect.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifierEffect.java index 409437df1..fb0413fdf 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifierEffect.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifierEffect.java @@ -2,5 +2,6 @@ package com.gempukku.lotro.logic.modifiers; public enum ModifierEffect { KEYWORD_MODIFIER, STRENGTH_MODIFIER, VITALITY_MODIFIER, TWILIGHT_COST_MODIFIER, OVERWHELM_MODIFIER, WOUND_MODIFIER, - PRESENCE_MODIFIER, ARCHERY_MODIFIER, MOVE_LIMIT_MODIFIER, ACTION_MODIFIER, ASSIGNMENT_MODIFIER, DISCARD_FROM_PLAY_MODIFIER, ALL_MODIFIER + PRESENCE_MODIFIER, ARCHERY_MODIFIER, MOVE_LIMIT_MODIFIER, ACTION_MODIFIER, ASSIGNMENT_MODIFIER, DISCARD_FROM_PLAY_MODIFIER, + LOOK_OR_REVEAL_MODIFIER, ALL_MODIFIER } 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 a08e84ad9..8912852f8 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 @@ -455,6 +455,17 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying { return true; } + @Override + public boolean canLookOrRevealCardsInHand(GameState gameState, String playerId) { + for (Modifier modifier : getModifiers(ModifierEffect.DISCARD_FROM_PLAY_MODIFIER)) + if (!modifier.canLookOrRevealCardsInHand(gameState, this, playerId)) + return false; + for (Modifier modifier : getModifiers(ModifierEffect.ALL_MODIFIER)) + if (!modifier.canLookOrRevealCardsInHand(gameState, this, playerId)) + return false; + return true; + } + private class ModifierHookImpl implements ModifierHook { private Modifier _modifier; 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 4829938c3..a35218d69 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 @@ -51,4 +51,6 @@ public interface ModifiersQuerying { public boolean canBeHealed(GameState gameState, PhysicalCard card); public boolean canDrawCardAndIncrement(GameState gameState, String playerId); + + public boolean canLookOrRevealCardsInHand(GameState gameState, String playerId); }