From 4cd010631099ba87706381684016c2496929c66f Mon Sep 17 00:00:00 2001 From: "marcins78@gmail.com" Date: Fri, 7 Oct 2011 14:11:21 +0000 Subject: [PATCH] "Hearken to Me" --- .../cards/actions/AttachPermanentAction.java | 10 ++- .../actions/TransferPermanentAction.java | 10 ++- .../effects/TransferPermanentEffect.java | 36 +++++++-- .../modifiers/MayNotBePlayedOnModifier.java | 22 ++++++ .../cards/modifiers/MayNotBearModifier.java | 27 +++++++ .../lotro/cards/set2/moria/Card2_058.java | 20 ++--- .../lotro/cards/set2/moria/Card2_066.java | 20 ++--- .../lotro/cards/set2/moria/Card2_073.java | 9 +-- .../lotro/cards/set4/gandalf/Card4_094.java | 77 +++++++++++++++++++ .../logic/modifiers/AbstractModifier.java | 10 +++ .../lotro/logic/modifiers/Modifier.java | 4 + .../lotro/logic/modifiers/ModifierEffect.java | 2 +- .../lotro/logic/modifiers/ModifiersLogic.java | 18 +++++ .../logic/modifiers/ModifiersQuerying.java | 4 + 14 files changed, 234 insertions(+), 35 deletions(-) create mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/MayNotBePlayedOnModifier.java create mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/MayNotBearModifier.java create mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set4/gandalf/Card4_094.java diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/actions/AttachPermanentAction.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/actions/AttachPermanentAction.java index 4d781c360..342d7d274 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/actions/AttachPermanentAction.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/actions/AttachPermanentAction.java @@ -5,12 +5,14 @@ import com.gempukku.lotro.common.Keyword; import com.gempukku.lotro.common.Zone; import com.gempukku.lotro.filters.Filter; import com.gempukku.lotro.game.PhysicalCard; +import com.gempukku.lotro.game.state.GameState; import com.gempukku.lotro.game.state.LotroGame; import com.gempukku.lotro.logic.GameUtils; import com.gempukku.lotro.logic.actions.AbstractCostToEffectAction; import com.gempukku.lotro.logic.effects.ChooseActiveCardEffect; import com.gempukku.lotro.logic.effects.PlayCardEffect; import com.gempukku.lotro.logic.effects.SendMessageEffect; +import com.gempukku.lotro.logic.modifiers.ModifiersQuerying; import com.gempukku.lotro.logic.timing.Effect; import java.util.Iterator; @@ -44,7 +46,13 @@ public class AttachPermanentAction extends AbstractCostToEffectAction { _removeCardEffect = new RemoveCardFromZoneEffect(card); _chooseTargetEffect = - new ChooseActiveCardEffect(null, card.getOwner(), "Attach " + card.getBlueprint().getName() + ". Choose target to attach to", filter) { + new ChooseActiveCardEffect(null, card.getOwner(), "Attach " + card.getBlueprint().getName() + ". Choose target to attach to", filter, + new Filter() { + @Override + public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) { + return modifiersQuerying.canHavePlayedOn(gameState, card, physicalCard); + } + }) { @Override protected void cardSelected(PhysicalCard target) { _putCardIntoPlayEffect = new AttachCardEffect(_source, target); diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/actions/TransferPermanentAction.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/actions/TransferPermanentAction.java index 0929ed27e..71a5a7250 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/actions/TransferPermanentAction.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/actions/TransferPermanentAction.java @@ -4,9 +4,11 @@ import com.gempukku.lotro.cards.effects.PayTwilightCostEffect; import com.gempukku.lotro.cards.effects.TransferPermanentEffect; import com.gempukku.lotro.filters.Filter; import com.gempukku.lotro.game.PhysicalCard; +import com.gempukku.lotro.game.state.GameState; import com.gempukku.lotro.game.state.LotroGame; import com.gempukku.lotro.logic.actions.ActivateCardAction; import com.gempukku.lotro.logic.effects.ChooseActiveCardsEffect; +import com.gempukku.lotro.logic.modifiers.ModifiersQuerying; import java.util.Collection; @@ -16,7 +18,13 @@ public class TransferPermanentAction extends ActivateCardAction { appendCost(new PayTwilightCostEffect(card)); appendEffect( - new ChooseActiveCardsEffect(null, card.getOwner(), "Choose target to attach to", 1, 1, filter) { + new ChooseActiveCardsEffect(null, card.getOwner(), "Choose target to attach to", 1, 1, filter, + new Filter() { + @Override + public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) { + return modifiersQuerying.canHaveTransferredOn(gameState, card, physicalCard); + } + }) { @Override protected void cardsSelected(LotroGame game, Collection target) { if (target.size() > 0) { diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/TransferPermanentEffect.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/TransferPermanentEffect.java index b3ba88e72..750385a3a 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/TransferPermanentEffect.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/TransferPermanentEffect.java @@ -1,12 +1,14 @@ package com.gempukku.lotro.cards.effects; +import com.gempukku.lotro.cards.PlayConditions; import com.gempukku.lotro.game.PhysicalCard; import com.gempukku.lotro.game.state.GameState; import com.gempukku.lotro.game.state.LotroGame; import com.gempukku.lotro.logic.GameUtils; -import com.gempukku.lotro.logic.timing.UnrespondableEffect; +import com.gempukku.lotro.logic.timing.AbstractEffect; +import com.gempukku.lotro.logic.timing.EffectResult; -public class TransferPermanentEffect extends UnrespondableEffect { +public class TransferPermanentEffect extends AbstractEffect { private PhysicalCard _physicalCard; private PhysicalCard _targetCard; @@ -16,9 +18,31 @@ public class TransferPermanentEffect extends UnrespondableEffect { } @Override - public void doPlayEffect(LotroGame game) { - GameState gameState = game.getGameState(); - gameState.sendMessage(_physicalCard.getOwner() + " transfers " + GameUtils.getCardLink(_physicalCard) + " to " + GameUtils.getCardLink(_targetCard)); - gameState.transferCard(_physicalCard, _targetCard); + public boolean isPlayableInFull(LotroGame game) { + return !PlayConditions.nonPlayZone(_targetCard.getZone()) + && !PlayConditions.nonPlayZone(_physicalCard.getZone()) + && game.getModifiersQuerying().canHaveTransferredOn(game.getGameState(), _physicalCard, _targetCard); + } + + @Override + public EffectResult.Type getType() { + return null; + } + + @Override + public String getText(LotroGame game) { + return null; + } + + @Override + protected FullEffectResult playEffectReturningResult(LotroGame game) { + if (isPlayableInFull(game)) { + GameState gameState = game.getGameState(); + gameState.sendMessage(_physicalCard.getOwner() + " transfers " + GameUtils.getCardLink(_physicalCard) + " to " + GameUtils.getCardLink(_targetCard)); + gameState.transferCard(_physicalCard, _targetCard); + + return new FullEffectResult(null, true, true); + } + return new FullEffectResult(null, false, false); } } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/MayNotBePlayedOnModifier.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/MayNotBePlayedOnModifier.java new file mode 100644 index 000000000..b776da8f8 --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/MayNotBePlayedOnModifier.java @@ -0,0 +1,22 @@ +package com.gempukku.lotro.cards.modifiers; + +import com.gempukku.lotro.filters.Filter; +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 MayNotBePlayedOnModifier extends AbstractModifier { + private Filter _unplayableCardFilter; + + public MayNotBePlayedOnModifier(PhysicalCard source, Filter affectFilter, Filter unplayableCardFilter) { + super(source, "Affected by \"may not be played\" limitation", affectFilter, new ModifierEffect[]{ModifierEffect.TARGET_MODIFIER}); + _unplayableCardFilter = unplayableCardFilter; + } + + @Override + public boolean canHavePlayedOn(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard playedCard, PhysicalCard target) { + return !_unplayableCardFilter.accepts(gameState, modifiersQuerying, playedCard); + } +} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/MayNotBearModifier.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/MayNotBearModifier.java new file mode 100644 index 000000000..d047f928a --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/MayNotBearModifier.java @@ -0,0 +1,27 @@ +package com.gempukku.lotro.cards.modifiers; + +import com.gempukku.lotro.filters.Filter; +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 MayNotBearModifier extends AbstractModifier { + private Filter _unbearableCardFilter; + + public MayNotBearModifier(PhysicalCard source, Filter affectFilter, Filter unbearableCardFilter) { + super(source, "Affected by \"may not bear\" limitation", affectFilter, new ModifierEffect[]{ModifierEffect.TARGET_MODIFIER}); + _unbearableCardFilter = unbearableCardFilter; + } + + @Override + public boolean canHavePlayedOn(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard playedCard, PhysicalCard target) { + return !_unbearableCardFilter.accepts(gameState, modifiersQuerying, playedCard); + } + + @Override + public boolean canHaveTransferredOn(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard playedCard, PhysicalCard target) { + return !_unbearableCardFilter.accepts(gameState, modifiersQuerying, playedCard); + } +} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set2/moria/Card2_058.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set2/moria/Card2_058.java index 8f7d1cf36..7e8cdfbd5 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set2/moria/Card2_058.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set2/moria/Card2_058.java @@ -3,6 +3,7 @@ package com.gempukku.lotro.cards.set2.moria; import com.gempukku.lotro.cards.AbstractMinion; import com.gempukku.lotro.cards.PlayConditions; import com.gempukku.lotro.cards.effects.ChooseAndPlayCardFromDeckEffect; +import com.gempukku.lotro.cards.modifiers.MayNotBearModifier; import com.gempukku.lotro.common.CardType; import com.gempukku.lotro.common.Culture; import com.gempukku.lotro.common.Keyword; @@ -13,10 +14,10 @@ import com.gempukku.lotro.game.state.LotroGame; import com.gempukku.lotro.logic.actions.OptionalTriggerAction; import com.gempukku.lotro.logic.actions.RequiredTriggerAction; import com.gempukku.lotro.logic.effects.DiscardCardsFromPlayEffect; +import com.gempukku.lotro.logic.modifiers.Modifier; import com.gempukku.lotro.logic.timing.EffectResult; import java.util.Collections; -import java.util.LinkedList; import java.util.List; /** @@ -48,21 +49,20 @@ public class Card2_058 extends AbstractMinion { return null; } + @Override + public List getAlwaysOnModifiers(PhysicalCard self) { + return Collections.singletonList( + new MayNotBearModifier(self, Filters.sameCard(self), Filters.type(CardType.POSSESSION))); + } + @Override public List getRequiredAfterTriggers(LotroGame game, EffectResult effectResult, PhysicalCard self) { - List actions = new LinkedList(); - if (Filters.canSpot(game.getGameState(), game.getModifiersQuerying(), Filters.type(CardType.POSSESSION), Filters.attachedTo(Filters.sameCard(self)))) { - RequiredTriggerAction action = new RequiredTriggerAction(self); - action.appendEffect( - new DiscardCardsFromPlayEffect(self, Filters.and(Filters.type(CardType.POSSESSION), Filters.attachedTo(Filters.sameCard(self))))); - actions.add(action); - } if (!game.getModifiersQuerying().hasKeyword(game.getGameState(), game.getGameState().getCurrentSite(), Keyword.MARSH)) { RequiredTriggerAction action = new RequiredTriggerAction(self); action.appendEffect( new DiscardCardsFromPlayEffect(self, self)); - actions.add(action); + return Collections.singletonList(action); } - return actions; + return null; } } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set2/moria/Card2_066.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set2/moria/Card2_066.java index 98963c1a4..9e7beb88d 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set2/moria/Card2_066.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set2/moria/Card2_066.java @@ -3,6 +3,7 @@ package com.gempukku.lotro.cards.set2.moria; import com.gempukku.lotro.cards.AbstractMinion; import com.gempukku.lotro.cards.PlayConditions; import com.gempukku.lotro.cards.effects.ChooseAndPlayCardFromDeckEffect; +import com.gempukku.lotro.cards.modifiers.MayNotBearModifier; import com.gempukku.lotro.common.CardType; import com.gempukku.lotro.common.Culture; import com.gempukku.lotro.common.Keyword; @@ -13,10 +14,10 @@ import com.gempukku.lotro.game.state.LotroGame; import com.gempukku.lotro.logic.actions.OptionalTriggerAction; import com.gempukku.lotro.logic.actions.RequiredTriggerAction; import com.gempukku.lotro.logic.effects.DiscardCardsFromPlayEffect; +import com.gempukku.lotro.logic.modifiers.Modifier; import com.gempukku.lotro.logic.timing.EffectResult; import java.util.Collections; -import java.util.LinkedList; import java.util.List; /** @@ -49,21 +50,20 @@ public class Card2_066 extends AbstractMinion { return null; } + @Override + public List getAlwaysOnModifiers(PhysicalCard self) { + return Collections.singletonList( + new MayNotBearModifier(self, Filters.sameCard(self), Filters.type(CardType.POSSESSION))); + } + @Override public List getRequiredAfterTriggers(LotroGame game, EffectResult effectResult, PhysicalCard self) { - List actions = new LinkedList(); - if (Filters.canSpot(game.getGameState(), game.getModifiersQuerying(), Filters.type(CardType.POSSESSION), Filters.attachedTo(Filters.sameCard(self)))) { - RequiredTriggerAction action = new RequiredTriggerAction(self); - action.appendEffect( - new DiscardCardsFromPlayEffect(self, Filters.and(Filters.type(CardType.POSSESSION), Filters.attachedTo(Filters.sameCard(self))))); - actions.add(action); - } if (!game.getModifiersQuerying().hasKeyword(game.getGameState(), game.getGameState().getCurrentSite(), Keyword.MARSH)) { RequiredTriggerAction action = new RequiredTriggerAction(self); action.appendEffect( new DiscardCardsFromPlayEffect(self, self)); - actions.add(action); + return Collections.singletonList(action); } - return actions; + return null; } } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set2/moria/Card2_073.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set2/moria/Card2_073.java index ac2feb219..287e4e133 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set2/moria/Card2_073.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set2/moria/Card2_073.java @@ -1,6 +1,7 @@ package com.gempukku.lotro.cards.set2.moria; import com.gempukku.lotro.cards.AbstractMinion; +import com.gempukku.lotro.cards.modifiers.MayNotBearModifier; import com.gempukku.lotro.cards.modifiers.StrengthModifier; import com.gempukku.lotro.common.CardType; import com.gempukku.lotro.common.Culture; @@ -43,6 +44,8 @@ public class Card2_073 extends AbstractMinion { new StrengthModifier(self, Filters.keyword(Keyword.TENTACLE), 2)); modifiers.add( new KeywordModifier(self, Filters.keyword(Keyword.TENTACLE), Keyword.DAMAGE)); + modifiers.add( + new MayNotBearModifier(self, Filters.sameCard(self), Filters.type(CardType.POSSESSION))); return modifiers; } @@ -55,12 +58,6 @@ public class Card2_073 extends AbstractMinion { new DiscardCardsFromPlayEffect(self, Filters.and(Filters.type(CardType.MINION), Filters.not(Filters.sameCard(self)), Filters.not(Filters.keyword(Keyword.TENTACLE))))); actions.add(action); } - if (Filters.canSpot(game.getGameState(), game.getModifiersQuerying(), Filters.type(CardType.POSSESSION), Filters.attachedTo(Filters.sameCard(self)))) { - RequiredTriggerAction action = new RequiredTriggerAction(self); - action.appendEffect( - new DiscardCardsFromPlayEffect(self, Filters.and(Filters.type(CardType.POSSESSION), Filters.attachedTo(Filters.sameCard(self))))); - actions.add(action); - } if (!game.getModifiersQuerying().hasKeyword(game.getGameState(), game.getGameState().getCurrentSite(), Keyword.MARSH)) { RequiredTriggerAction action = new RequiredTriggerAction(self); action.appendEffect( diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set4/gandalf/Card4_094.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set4/gandalf/Card4_094.java new file mode 100644 index 000000000..f00110582 --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set4/gandalf/Card4_094.java @@ -0,0 +1,77 @@ +package com.gempukku.lotro.cards.set4.gandalf; + +import com.gempukku.lotro.cards.AbstractAttachable; +import com.gempukku.lotro.cards.PlayConditions; +import com.gempukku.lotro.cards.modifiers.MayNotBePlayedOnModifier; +import com.gempukku.lotro.cards.modifiers.StrengthModifier; +import com.gempukku.lotro.cards.modifiers.VitalityModifier; +import com.gempukku.lotro.common.CardType; +import com.gempukku.lotro.common.Culture; +import com.gempukku.lotro.common.Keyword; +import com.gempukku.lotro.common.Side; +import com.gempukku.lotro.filters.Filter; +import com.gempukku.lotro.filters.Filters; +import com.gempukku.lotro.game.PhysicalCard; +import com.gempukku.lotro.game.state.LotroGame; +import com.gempukku.lotro.logic.actions.RequiredTriggerAction; +import com.gempukku.lotro.logic.effects.DiscardCardsFromPlayEffect; +import com.gempukku.lotro.logic.modifiers.Modifier; +import com.gempukku.lotro.logic.timing.EffectResult; + +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; + +/** + * Set: The Two Towers + * Side: Free + * Culture: Gandalf + * Twilight Cost: 0 + * Type: Condition + * Strength: +2 + * Vitality: +1 + * Game Text: Spell. To play, spot Gandalf. Bearer must be Theoden. + * Discard all Shadow conditions on Theoden. Shadow conditions may not be played on Theoden. + */ +public class Card4_094 extends AbstractAttachable { + public Card4_094() { + super(Side.FREE_PEOPLE, CardType.CONDITION, 0, Culture.GANDALF, null, "Hearken to Me", true); + addKeyword(Keyword.SPELL); + } + + @Override + public boolean checkPlayRequirements(String playerId, LotroGame game, PhysicalCard self, Filter additionalAttachmentFilter, int twilightModifier) { + return super.checkPlayRequirements(playerId, game, self, additionalAttachmentFilter, twilightModifier) + && Filters.canSpot(game.getGameState(), game.getModifiersQuerying(), Filters.name("Gandalf")); + } + + @Override + public List getAlwaysOnModifiers(PhysicalCard self) { + List modifiers = new LinkedList(); + + modifiers.add( + new StrengthModifier(self, Filters.hasAttached(self), 2)); + modifiers.add( + new VitalityModifier(self, Filters.hasAttached(self), 1)); + modifiers.add( + new MayNotBePlayedOnModifier(self, Filters.hasAttached(self), Filters.and(Filters.side(Side.SHADOW), Filters.type(CardType.CONDITION)))); + + return modifiers; + } + + @Override + protected Filter getValidTargetFilter(String playerId, LotroGame game, PhysicalCard self) { + return Filters.name("Theoden"); + } + + @Override + public List getRequiredAfterTriggers(LotroGame game, EffectResult effectResult, PhysicalCard self) { + if (PlayConditions.played(game.getGameState(), game.getModifiersQuerying(), effectResult, Filters.sameCard(self))) { + RequiredTriggerAction action = new RequiredTriggerAction(self); + action.appendEffect( + new DiscardCardsFromPlayEffect(self, Filters.and(Filters.side(Side.SHADOW), Filters.type(CardType.CONDITION), Filters.attachedTo(Filters.hasAttached(self))))); + return Collections.singletonList(action); + } + return null; + } +} 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 74b361bb2..4ffe902d6 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 @@ -140,6 +140,16 @@ public abstract class AbstractModifier implements Modifier { return result; } + @Override + public boolean canHavePlayedOn(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard playedCard, PhysicalCard target) { + return true; + } + + @Override + public boolean canHaveTransferredOn(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard playedCard, PhysicalCard target) { + return true; + } + @Override public boolean shouldSkipPhase(GameState gameState, ModifiersQuerying modifiersQuerying, Phase phase, String playerId, boolean 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 2082ad9ea..13ed10641 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 @@ -58,6 +58,10 @@ public interface Modifier { public boolean canPlayAction(GameState gameState, ModifiersQuerying modifiersQuerying, Action action, boolean result); + public boolean canHavePlayedOn(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard playedCard, PhysicalCard target); + + public boolean canHaveTransferredOn(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard playedCard, PhysicalCard target); + public boolean shouldSkipPhase(GameState gameState, ModifiersQuerying modifiersQuerying, Phase phase, String playerId, boolean result); public boolean isValidAssignments(GameState gameState, Side Side, ModifiersQuerying modifiersQuerying, PhysicalCard companion, List minions, 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 2eaec2200..d088ebc70 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 @@ -4,5 +4,5 @@ public enum ModifierEffect { KEYWORD_MODIFIER, STRENGTH_MODIFIER, VITALITY_MODIFIER, RESISTANCE_MODIFIER, TWILIGHT_COST_MODIFIER, OVERWHELM_MODIFIER, WOUND_MODIFIER, PRESENCE_MODIFIER, ARCHERY_MODIFIER, MOVE_LIMIT_MODIFIER, ACTION_MODIFIER, ASSIGNMENT_MODIFIER, DISCARD_FROM_PLAY_MODIFIER, - LOOK_OR_REVEAL_MODIFIER, SPOT_MODIFIER + LOOK_OR_REVEAL_MODIFIER, SPOT_MODIFIER, TARGET_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 b8747a39f..27afc8976 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 @@ -348,6 +348,24 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying { return result; } + @Override + public boolean canHavePlayedOn(GameState gameState, PhysicalCard playedCard, PhysicalCard target) { + for (Modifier modifier : getModifiers(ModifierEffect.TARGET_MODIFIER)) + if (affectsCardWithSkipSet(gameState, target, modifier)) + if (!modifier.canHavePlayedOn(gameState, this, playedCard, target)) + return false; + return true; + } + + @Override + public boolean canHaveTransferredOn(GameState gameState, PhysicalCard playedCard, PhysicalCard target) { + for (Modifier modifier : getModifiers(ModifierEffect.TARGET_MODIFIER)) + if (affectsCardWithSkipSet(gameState, target, modifier)) + if (!modifier.canHaveTransferredOn(gameState, this, playedCard, target)) + return false; + return true; + } + @Override public boolean shouldSkipPhase(GameState gameState, Phase phase, String playerId) { boolean result = false; 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 c10a8e897..b40a70e51 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 @@ -47,6 +47,10 @@ public interface ModifiersQuerying { public boolean canPlayAction(GameState gameState, Action action); + public boolean canHavePlayedOn(GameState gameState, PhysicalCard playedCard, PhysicalCard target); + + public boolean canHaveTransferredOn(GameState gameState, PhysicalCard playedCard, PhysicalCard target); + public boolean shouldSkipPhase(GameState gameState, Phase phase, String playerId); public boolean isValidAssignments(GameState gameState, Side side, Map> assignments);