From 190070b59aa5ea590da14094ce665487bdd37e09 Mon Sep 17 00:00:00 2001 From: "marcins78@gmail.com" Date: Wed, 30 May 2012 08:51:50 +0000 Subject: [PATCH] - "Pippin, Friend to Frodo" now prevents only Shadow player from discarding Tales, not the FP player, if a Shadow card makes FP player to discard it. --- .../gempukku/lotro/cards/PlayConditions.java | 4 +-- .../ChooseAndDiscardCardsFromPlayEffect.java | 6 +++-- .../lotro/cards/set1/shire/Card1_306.java | 4 +-- .../lotro/cards/set15/rohan/Card15_128.java | 4 +-- .../lotro/cards/set5/isengard/Card5_060.java | 3 +-- .../com/gempukku/lotro/filters/Filters.java | 11 +++++++- .../logic/modifiers/AbstractModifier.java | 2 +- .../CantDiscardFromPlayByPlayerModifier.java | 26 +++++++++++++++++++ .../CantDiscardFromPlayModifier.java | 2 +- .../lotro/logic/modifiers/Modifier.java | 2 +- .../lotro/logic/modifiers/ModifiersLogic.java | 4 +-- .../logic/modifiers/ModifiersQuerying.java | 2 +- .../src/main/webapp/includes/changeLog.html | 4 +++ 13 files changed, 57 insertions(+), 17 deletions(-) create mode 100644 gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/CantDiscardFromPlayByPlayerModifier.java diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/PlayConditions.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/PlayConditions.java index 7f2fef68e..5f676aad6 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/PlayConditions.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/PlayConditions.java @@ -319,7 +319,7 @@ public class PlayConditions { } public static boolean canDiscardFromPlay(final PhysicalCard source, LotroGame game, final PhysicalCard card) { - return game.getModifiersQuerying().canBeDiscardedFromPlay(game.getGameState(), card, source); + return game.getModifiersQuerying().canBeDiscardedFromPlay(game.getGameState(), source.getOwner(), card, source); } public static boolean canSelfDiscard(PhysicalCard source, LotroGame game) { @@ -331,7 +331,7 @@ public class PlayConditions { new Filter() { @Override public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) { - return modifiersQuerying.canBeDiscardedFromPlay(gameState, physicalCard, source); + return modifiersQuerying.canBeDiscardedFromPlay(gameState, source.getOwner(), physicalCard, source); } })) >= count; } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/choose/ChooseAndDiscardCardsFromPlayEffect.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/choose/ChooseAndDiscardCardsFromPlayEffect.java index 8ce68b4c8..07fd35775 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/choose/ChooseAndDiscardCardsFromPlayEffect.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/choose/ChooseAndDiscardCardsFromPlayEffect.java @@ -14,24 +14,26 @@ import java.util.Collection; public class ChooseAndDiscardCardsFromPlayEffect extends ChooseActiveCardsEffect { private Action _action; + private String _playerId; private SubAction _resultSubAction; public ChooseAndDiscardCardsFromPlayEffect(Action action, String playerId, int minimum, int maximum, Filterable... filters) { super(action.getActionSource(), playerId, "Choose cards to discard", minimum, maximum, filters); _action = action; + _playerId = playerId; } @Override protected Filter getExtraFilterForPlaying(LotroGame game) { if (_action.getActionSource() == null) return Filters.any; - return Filters.canBeDiscarded(_action.getActionSource()); + return Filters.canBeDiscarded(_playerId, _action.getActionSource()); } @Override protected void cardsSelected(LotroGame game, Collection cards) { _resultSubAction = new SubAction(_action); - _resultSubAction.appendEffect(new DiscardCardsFromPlayEffect(_action.getPerformingPlayer(), _action.getActionSource(), Filters.in(cards))); + _resultSubAction.appendEffect(new DiscardCardsFromPlayEffect(_playerId, _action.getActionSource(), Filters.in(cards))); game.getActionsEnvironment().addActionToStack(_resultSubAction); cardsToBeDiscardedCallback(cards); } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/shire/Card1_306.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/shire/Card1_306.java index 57456854c..5cb7a0dbb 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/shire/Card1_306.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/shire/Card1_306.java @@ -7,7 +7,7 @@ import com.gempukku.lotro.common.Race; import com.gempukku.lotro.common.Signet; import com.gempukku.lotro.filters.Filters; import com.gempukku.lotro.game.PhysicalCard; -import com.gempukku.lotro.logic.modifiers.CantDiscardFromPlayModifier; +import com.gempukku.lotro.logic.modifiers.CantDiscardFromPlayByPlayerModifier; import com.gempukku.lotro.logic.modifiers.Modifier; /** @@ -29,6 +29,6 @@ public class Card1_306 extends AbstractCompanion { @Override public Modifier getAlwaysOnModifier(PhysicalCard self) { - return new CantDiscardFromPlayModifier(self, "Can't be discarded by opponent", Filters.and(Culture.SHIRE, Keyword.TALE), Filters.not(Filters.owner(self.getOwner()))); + return new CantDiscardFromPlayByPlayerModifier(self, "Can't be discarded by opponent", Filters.and(Culture.SHIRE, Keyword.TALE), self.getOwner()); } } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set15/rohan/Card15_128.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set15/rohan/Card15_128.java index e89ab5259..1797b98e9 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set15/rohan/Card15_128.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set15/rohan/Card15_128.java @@ -35,8 +35,8 @@ public class Card15_128 extends AbstractCompanion { modifiers.add( new KeywordModifier(self, self, new SpotCondition(3, PossessionClass.MOUNT), Keyword.DAMAGE, 1)); modifiers.add( - new CantDiscardFromPlayModifier(self, "Can't be discarded by a Shadow player", new SpotCondition(4, Side.FREE_PEOPLE, PossessionClass.MOUNT), - Filters.and(Side.FREE_PEOPLE, PossessionClass.MOUNT), Side.SHADOW)); + new CantDiscardFromPlayByPlayerModifier(self, "Can't be discarded by a Shadow player", new SpotCondition(4, Side.FREE_PEOPLE, PossessionClass.MOUNT), + Filters.and(Side.FREE_PEOPLE, PossessionClass.MOUNT), self.getOwner())); return modifiers; } } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set5/isengard/Card5_060.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set5/isengard/Card5_060.java index 690bd5c2a..1f0d21031 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set5/isengard/Card5_060.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set5/isengard/Card5_060.java @@ -60,8 +60,7 @@ public class Card5_060 extends AbstractPermanent { public List getOptionalInPlayBeforeActions(String playerId, LotroGame game, Effect effect, PhysicalCard self) { if (TriggerConditions.isGettingDiscarded(effect, game, Keyword.MACHINE)) { DiscardCardsFromPlayEffect discardEffect = (DiscardCardsFromPlayEffect) effect; - if (discardEffect.getSource() != null - && discardEffect.getSource().getOwner().equals(game.getGameState().getCurrentPlayerId())) { + if (!discardEffect.getPerformingPlayer().equals(self.getOwner())) { ActivateCardAction action = new ActivateCardAction(self); action.appendCost( new SelfDiscardEffect(self)); 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 f83c03ebf..f6e0fe9ed 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 @@ -387,7 +387,16 @@ public class Filters { return new Filter() { @Override public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) { - return modifiersQuerying.canBeDiscardedFromPlay(gameState, physicalCard, source); + return modifiersQuerying.canBeDiscardedFromPlay(gameState, source.getOwner(), physicalCard, source); + } + }; + } + + public static final Filter canBeDiscarded(final String performingPlayer, final PhysicalCard source) { + return new Filter() { + @Override + public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) { + return modifiersQuerying.canBeDiscardedFromPlay(gameState, performingPlayer, physicalCard, source); } }; } 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 abebdd1b1..252f7341a 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 @@ -253,7 +253,7 @@ public abstract class AbstractModifier implements Modifier { } @Override - public boolean canBeDiscardedFromPlay(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard card, PhysicalCard source) { + public boolean canBeDiscardedFromPlay(GameState gameState, ModifiersQuerying modifiersQuerying, String performingPlayer, PhysicalCard card, PhysicalCard source) { return true; } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/CantDiscardFromPlayByPlayerModifier.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/CantDiscardFromPlayByPlayerModifier.java new file mode 100644 index 000000000..11ffa3206 --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/CantDiscardFromPlayByPlayerModifier.java @@ -0,0 +1,26 @@ +package com.gempukku.lotro.logic.modifiers; + +import com.gempukku.lotro.common.Filterable; +import com.gempukku.lotro.game.PhysicalCard; +import com.gempukku.lotro.game.state.GameState; + +public class CantDiscardFromPlayByPlayerModifier extends AbstractModifier { + private String _notPlayer; + + public CantDiscardFromPlayByPlayerModifier(PhysicalCard source, String text, Filterable affectFilter, String notPlayer) { + super(source, text, affectFilter, ModifierEffect.DISCARD_FROM_PLAY_MODIFIER); + _notPlayer = notPlayer; + } + + public CantDiscardFromPlayByPlayerModifier(PhysicalCard source, String text, Condition condition, Filterable affectFilter, String notPlayer) { + super(source, text, affectFilter, condition, ModifierEffect.DISCARD_FROM_PLAY_MODIFIER); + _notPlayer = notPlayer; + } + + @Override + public boolean canBeDiscardedFromPlay(GameState gameState, ModifiersQuerying modifiersQuerying, String performingPlayer, PhysicalCard card, PhysicalCard source) { + if (!_notPlayer.equals(performingPlayer)) + return false; + return true; + } +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/CantDiscardFromPlayModifier.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/CantDiscardFromPlayModifier.java index 7d6953170..559271c62 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/CantDiscardFromPlayModifier.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/CantDiscardFromPlayModifier.java @@ -19,7 +19,7 @@ public class CantDiscardFromPlayModifier extends AbstractModifier { } @Override - public boolean canBeDiscardedFromPlay(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard card, PhysicalCard source) { + public boolean canBeDiscardedFromPlay(GameState gameState, ModifiersQuerying modifiersQuerying, String performingPlayer, PhysicalCard card, PhysicalCard source) { if (Filters.and(_sourceFilter).accepts(gameState, modifiersQuerying, source)) return false; 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 7a2f4eeda..fb512d5c5 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 @@ -102,7 +102,7 @@ public interface Modifier { public boolean isPreventedFromBeingAssignedToSkirmish(GameState gameState, Side sidePlayer, ModifiersQuerying modifiersQuerying, PhysicalCard card); - public boolean canBeDiscardedFromPlay(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard card, PhysicalCard source); + public boolean canBeDiscardedFromPlay(GameState gameState, ModifiersQuerying modifiersQuerying, String performingPlayer, PhysicalCard card, PhysicalCard source); public boolean canBeReturnedToHand(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard card, PhysicalCard source); 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 c2a1c7b90..652ca5c9d 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 @@ -743,11 +743,11 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying { } @Override - public boolean canBeDiscardedFromPlay(GameState gameState, PhysicalCard card, PhysicalCard source) { + public boolean canBeDiscardedFromPlay(GameState gameState, String performingPlayer, PhysicalCard card, PhysicalCard source) { LoggingThreadLocal.logMethodStart(card, "canBeDiscardedFromPlay"); try { for (Modifier modifier : getModifiersAffectingCard(gameState, ModifierEffect.DISCARD_FROM_PLAY_MODIFIER, card)) - if (!modifier.canBeDiscardedFromPlay(gameState, this, card, source)) + if (!modifier.canBeDiscardedFromPlay(gameState, this, performingPlayer, card, source)) return false; return true; } finally { 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 a25e8e11c..00812cd76 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 @@ -108,7 +108,7 @@ public interface ModifiersQuerying { public List getExtraCostsToPlay(GameState gameState, Action action, PhysicalCard target); // Others - public boolean canBeDiscardedFromPlay(GameState gameState, PhysicalCard card, PhysicalCard source); + public boolean canBeDiscardedFromPlay(GameState gameState, String performingPlayer, PhysicalCard card, PhysicalCard source); public boolean canBeReturnedToHand(GameState gameState, PhysicalCard card, PhysicalCard source); diff --git a/gemp-lotr/gemp-lotr-web/src/main/webapp/includes/changeLog.html b/gemp-lotr/gemp-lotr-web/src/main/webapp/includes/changeLog.html index 243c115b8..67df5ae8c 100644 --- a/gemp-lotr/gemp-lotr-web/src/main/webapp/includes/changeLog.html +++ b/gemp-lotr/gemp-lotr-web/src/main/webapp/includes/changeLog.html @@ -1,4 +1,8 @@
+30 May 2012
+- "Pippin, Friend to Frodo" now prevents only Shadow player from discarding Tales, not the FP player, if a Shadow card
+makes FP player to discard it.
+
 25 May 2012
 - If a game is cancelled due to an error or players agreeing to cancel it, it is treated as finished, and players can
 start a new game.