diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/ProxyingModifier.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/ProxyingModifier.java index 8c605af84..425d1cdde 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/ProxyingModifier.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/ProxyingModifier.java @@ -182,4 +182,12 @@ public class ProxyingModifier implements Modifier { return modifier.isValidFreePlayerAssignments(gameState, modifiersQuerying, companion, minions, result); return result; } + + @Override + public boolean canBeDiscardedFromPlay(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard card, PhysicalCard source, boolean result) { + Modifier modifier = getProxiedModifier(gameState, modifiersQuerying); + if (modifier != null) + return modifier.canBeDiscardedFromPlay(gameState, modifiersQuerying, card, source, result); + return result; + } } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/isengard/Card1_136.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/isengard/Card1_136.java index 701e10249..344074fb8 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/isengard/Card1_136.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/isengard/Card1_136.java @@ -46,7 +46,7 @@ public class Card1_136 extends AbstractEvent { } }); action.addEffect( - new DiscardCardsFromPlayEffect(Filters.type(CardType.CONDITION))); + new DiscardCardsFromPlayEffect(self, Filters.type(CardType.CONDITION))); return action; } } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/site/Card1_353.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/site/Card1_353.java index 304d427f6..1a150f92e 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/site/Card1_353.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/site/Card1_353.java @@ -33,7 +33,7 @@ public class Card1_353 extends AbstractSite { && game.getGameState().getCurrentSite() == self) { DefaultCostToEffectAction action = new DefaultCostToEffectAction(self, null, "Discard every ally"); action.addEffect( - new DiscardCardsFromPlayEffect(Filters.type(CardType.ALLY))); + new DiscardCardsFromPlayEffect(self, Filters.type(CardType.ALLY))); return Collections.singletonList(action); } return null; diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/DiscardCardFromPlayEffect.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/DiscardCardFromPlayEffect.java index 67cf7ad14..27a5be3a9 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/DiscardCardFromPlayEffect.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/DiscardCardFromPlayEffect.java @@ -17,10 +17,6 @@ public class DiscardCardFromPlayEffect extends UnrespondableEffect { _card = card; } - public PhysicalCard getSource() { - return _source; - } - @Override public boolean canPlayEffect(LotroGame game) { Zone zone = _card.getZone(); @@ -29,16 +25,18 @@ public class DiscardCardFromPlayEffect extends UnrespondableEffect { @Override public void playEffect(LotroGame game) { - GameState gameState = game.getGameState(); - gameState.stopAffecting(_card); - gameState.removeCardFromZone(_card); - gameState.addCardToZone(_card, Zone.DISCARD); + if (game.getModifiersQuerying().canBeDiscardedFromPlay(game.getGameState(), _card, _source)) { + GameState gameState = game.getGameState(); + gameState.stopAffecting(_card); + gameState.removeCardFromZone(_card); + gameState.addCardToZone(_card, Zone.DISCARD); - List attachedCards = gameState.getAttachedCards(_card); - for (PhysicalCard attachedCard : attachedCards) { - gameState.stopAffecting(attachedCard); - gameState.removeCardFromZone(attachedCard); - gameState.addCardToZone(attachedCard, Zone.DISCARD); + List attachedCards = gameState.getAttachedCards(_card); + for (PhysicalCard attachedCard : attachedCards) { + gameState.stopAffecting(attachedCard); + gameState.removeCardFromZone(attachedCard); + gameState.addCardToZone(attachedCard, Zone.DISCARD); + } } } } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/DiscardCardsFromPlayEffect.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/DiscardCardsFromPlayEffect.java index 9d223e5ef..f1b39a9b7 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/DiscardCardsFromPlayEffect.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/DiscardCardsFromPlayEffect.java @@ -11,9 +11,11 @@ import com.gempukku.lotro.logic.timing.UnrespondableEffect; import java.util.List; public class DiscardCardsFromPlayEffect extends UnrespondableEffect { + private PhysicalCard _source; private Filter _filter; - public DiscardCardsFromPlayEffect(Filter filter) { + public DiscardCardsFromPlayEffect(PhysicalCard source, Filter filter) { + _source = source; _filter = filter; } @@ -26,16 +28,18 @@ public class DiscardCardsFromPlayEffect extends UnrespondableEffect { public void playEffect(LotroGame game) { List cardsToDiscard = Filters.filterActive(game.getGameState(), game.getModifiersQuerying(), _filter); for (PhysicalCard card : cardsToDiscard) { - GameState gameState = game.getGameState(); - gameState.stopAffecting(card); - gameState.removeCardFromZone(card); - gameState.addCardToZone(card, Zone.DISCARD); + if (game.getModifiersQuerying().canBeDiscardedFromPlay(game.getGameState(), card, _source)) { + GameState gameState = game.getGameState(); + gameState.stopAffecting(card); + gameState.removeCardFromZone(card); + gameState.addCardToZone(card, Zone.DISCARD); - List attachedCards = gameState.getAttachedCards(card); - for (PhysicalCard attachedCard : attachedCards) { - gameState.stopAffecting(attachedCard); - gameState.removeCardFromZone(attachedCard); - gameState.addCardToZone(attachedCard, Zone.DISCARD); + List attachedCards = gameState.getAttachedCards(card); + for (PhysicalCard attachedCard : attachedCards) { + gameState.stopAffecting(attachedCard); + gameState.removeCardFromZone(attachedCard); + gameState.addCardToZone(attachedCard, Zone.DISCARD); + } } } } 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 a8b9cd26f..a1c1b4f0d 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 @@ -122,4 +122,9 @@ public abstract class AbstractModifier implements Modifier { public boolean isValidFreePlayerAssignments(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard companion, List minions, boolean result) { return result; } + + @Override + public boolean canBeDiscardedFromPlay(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard card, PhysicalCard source, boolean result) { + return result; + } } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/CompositeModifier.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/CompositeModifier.java index 85f97066f..8e8f30142 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/CompositeModifier.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/CompositeModifier.java @@ -190,4 +190,12 @@ public class CompositeModifier implements Modifier { return result; } + + @Override + public boolean canBeDiscardedFromPlay(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard card, PhysicalCard source, boolean result) { + for (Modifier modifier : _modifiers) + result = modifier.canBeDiscardedFromPlay(gameState, modifiersQuerying, card, source, result); + + return result; + } } 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 53fb54d8c..de1c46431 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 @@ -49,4 +49,6 @@ public interface Modifier { public boolean shouldSkipPhase(GameState gameState, ModifiersQuerying modifiersQuerying, Phase phase, boolean result); public boolean isValidFreePlayerAssignments(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard companion, List minions, boolean result); + + public boolean canBeDiscardedFromPlay(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard card, PhysicalCard source, boolean result); } 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 7a82a63f1..409437df1 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,5 @@ 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, ALL_MODIFIER + PRESENCE_MODIFIER, ARCHERY_MODIFIER, MOVE_LIMIT_MODIFIER, ACTION_MODIFIER, ASSIGNMENT_MODIFIER, DISCARD_FROM_PLAY_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 8f218793a..0bc76ad69 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 @@ -360,6 +360,18 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying { return result; } + @Override + public boolean canBeDiscardedFromPlay(GameState gameState, PhysicalCard card, PhysicalCard source) { + boolean result = true; + for (Modifier modifier : getModifiers(ModifierEffect.DISCARD_FROM_PLAY_MODIFIER)) + if (affectsCardWithSkipSet(gameState, card, modifier)) + result = modifier.canBeDiscardedFromPlay(gameState, this, card, source, result); + for (Modifier modifier : getModifiers(ModifierEffect.ALL_MODIFIER)) + if (affectsCardWithSkipSet(gameState, card, modifier)) + result = modifier.canBeDiscardedFromPlay(gameState, this, card, source, result); + return result; + } + 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 1449b67f9..bd517dd7f 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 @@ -42,4 +42,6 @@ public interface ModifiersQuerying { public boolean shouldSkipPhase(GameState gameState, Phase phase); public boolean isValidFreePlayerAssignments(GameState gameState, PhysicalCard companion, List minions); + + public boolean canBeDiscardedFromPlay(GameState gameState, PhysicalCard card, PhysicalCard source); }