diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractAttachable.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractAttachable.java index be0934394..2d34b18aa 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractAttachable.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractAttachable.java @@ -36,7 +36,7 @@ public abstract class AbstractAttachable extends AbstractLotroCardBlueprint { return false; } - protected Filter getFullValidTargetFilter(String playerId, final LotroGame game, PhysicalCard self) { + protected Filter getFullValidTargetFilter(String playerId, final LotroGame game, final PhysicalCard self) { return Filters.and(getValidTargetFilter(playerId, game, self), new Filter() { @Override @@ -57,6 +57,16 @@ public abstract class AbstractAttachable extends AbstractLotroCardBlueprint { }); } + private Filter getFullAttachValidTargetFilter(String playerId, final LotroGame game, final PhysicalCard self) { + return Filters.and(getFullValidTargetFilter(playerId, game, self), + new Filter() { + @Override + public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) { + return modifiersQuerying.canHavePlayedOn(gameState, self, physicalCard); + } + }); + } + protected abstract Filter getValidTargetFilter(String playerId, LotroGame game, PhysicalCard self); @Override @@ -67,7 +77,7 @@ public abstract class AbstractAttachable extends AbstractLotroCardBlueprint { public boolean checkPlayRequirements(String playerId, LotroGame game, PhysicalCard self, Filter additionalAttachmentFilter, int twilightModifier) { return (self.getBlueprint().getSide() != Side.SHADOW || PlayConditions.canPayForShadowCard(game, self, twilightModifier)) && PlayConditions.checkUniqueness(game.getGameState(), game.getModifiersQuerying(), self) - && Filters.canSpot(game.getGameState(), game.getModifiersQuerying(), getFullValidTargetFilter(playerId, game, self), additionalAttachmentFilter); + && Filters.canSpot(game.getGameState(), game.getModifiersQuerying(), getFullAttachValidTargetFilter(playerId, game, self), additionalAttachmentFilter); } @Override @@ -93,7 +103,7 @@ public abstract class AbstractAttachable extends AbstractLotroCardBlueprint { } public AttachPermanentAction getPlayCardAction(String playerId, LotroGame game, PhysicalCard self, Filter additionalAttachmentFilter, int twilightModifier) { - return new AttachPermanentAction(game, self, Filters.and(getFullValidTargetFilter(playerId, game, self), additionalAttachmentFilter), getAttachCostModifiers(playerId, game, self), twilightModifier); + return new AttachPermanentAction(game, self, Filters.and(getFullAttachValidTargetFilter(playerId, game, self), additionalAttachmentFilter), getAttachCostModifiers(playerId, game, self), twilightModifier); } protected List getExtraPhaseActions(String playerId, LotroGame game, PhysicalCard self) { diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractAttachableFPPossession.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractAttachableFPPossession.java index b2fdc3274..bce45f6b2 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractAttachableFPPossession.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractAttachableFPPossession.java @@ -11,6 +11,7 @@ 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.modifiers.Modifier; +import com.gempukku.lotro.logic.modifiers.ModifiersQuerying; import com.gempukku.lotro.logic.timing.Action; import java.util.LinkedList; @@ -34,7 +35,7 @@ public abstract class AbstractAttachableFPPossession extends AbstractAttachable _vitality = vitality; } - private void appendTransferPossessionAction(List actions, LotroGame game, PhysicalCard self, Filter validTargetFilter) { + private void appendTransferPossessionAction(List actions, LotroGame game, final PhysicalCard self, Filter validTargetFilter) { GameState gameState = game.getGameState(); if (Filters.canSpot(gameState, game.getModifiersQuerying(), validTargetFilter) && gameState.getCurrentPhase() == Phase.FELLOWSHIP @@ -60,6 +61,14 @@ public abstract class AbstractAttachableFPPossession extends AbstractAttachable ); } + validTransferFilter = Filters.and(validTransferFilter, + new Filter() { + @Override + public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) { + return modifiersQuerying.canHaveTransferredOn(gameState, self, physicalCard); + } + }); + if (Filters.canSpot(game.getGameState(), game.getModifiersQuerying(), validTransferFilter)) actions.add(new TransferPermanentAction(self, game, validTransferFilter)); } 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 342d7d274..4d781c360 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,14 +5,12 @@ 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; @@ -46,13 +44,7 @@ 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 Filter() { - @Override - public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) { - return modifiersQuerying.canHavePlayedOn(gameState, card, physicalCard); - } - }) { + new ChooseActiveCardEffect(null, card.getOwner(), "Attach " + card.getBlueprint().getName() + ". Choose target to attach to", filter) { @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 71a5a7250..0929ed27e 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,11 +4,9 @@ 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; @@ -18,13 +16,7 @@ public class TransferPermanentAction extends ActivateCardAction { appendCost(new PayTwilightCostEffect(card)); appendEffect( - 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); - } - }) { + new ChooseActiveCardsEffect(null, card.getOwner(), "Choose target to attach to", 1, 1, filter) { @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/AttachCardEffect.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/AttachCardEffect.java index 14da4d8bc..a97aa9ebf 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/AttachCardEffect.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/AttachCardEffect.java @@ -1,11 +1,13 @@ 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.timing.UnrespondableEffect; +import com.gempukku.lotro.logic.timing.AbstractEffect; +import com.gempukku.lotro.logic.timing.EffectResult; -public class AttachCardEffect extends UnrespondableEffect { +public class AttachCardEffect extends AbstractEffect { private PhysicalCard _physicalCard; private PhysicalCard _targetCard; @@ -15,9 +17,29 @@ public class AttachCardEffect extends UnrespondableEffect { } @Override - public void doPlayEffect(LotroGame game) { - GameState gameState = game.getGameState(); - gameState.attachCard(_physicalCard, _targetCard); - gameState.startAffecting(_physicalCard, game.getModifiersEnvironment()); + public boolean isPlayableInFull(LotroGame game) { + return !PlayConditions.nonPlayZone(_targetCard.getZone()) + && game.getModifiersQuerying().canHavePlayedOn(game.getGameState(), _physicalCard, _targetCard); + } + + @Override + public String getText(LotroGame game) { + return null; + } + + @Override + public EffectResult.Type getType() { + return null; + } + + @Override + protected FullEffectResult playEffectReturningResult(LotroGame game) { + if (isPlayableInFull(game)) { + GameState gameState = game.getGameState(); + gameState.attachCard(_physicalCard, _targetCard); + gameState.startAffecting(_physicalCard, game.getModifiersEnvironment()); + 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/set4/gandalf/Card4_100.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set4/gandalf/Card4_100.java new file mode 100644 index 000000000..a39fa7d4d --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set4/gandalf/Card4_100.java @@ -0,0 +1,69 @@ +package com.gempukku.lotro.cards.set4.gandalf; + +import com.gempukku.lotro.cards.AbstractAttachableFPPossession; +import com.gempukku.lotro.cards.PlayConditions; +import com.gempukku.lotro.cards.effects.ExertCharactersEffect; +import com.gempukku.lotro.cards.modifiers.MayNotBearModifier; +import com.gempukku.lotro.common.Culture; +import com.gempukku.lotro.common.Keyword; +import com.gempukku.lotro.common.Phase; +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.game.state.Skirmish; +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.List; + +/** + * Set: The Two Towers + * Side: Free + * Culture: Gandalf + * Twilight Cost: 2 + * Type: Possession • Mount + * Strength: +2 + * Game Text: Bearer must be Gandalf. Discard any hand weapon he bears. Gandalf may not bear a hand weapon. + * At the start of each skirmish involving Gandalf, each minion skirmishing him must exert. + */ +public class Card4_100 extends AbstractAttachableFPPossession { + public Card4_100() { + super(2, 2, 0, Culture.GANDALF, Keyword.MOUNT, "Shadowfax", true); + } + + @Override + protected Filter getValidTargetFilter(String playerId, LotroGame game, PhysicalCard self) { + return Filters.name("Gandalf"); + } + + @Override + protected List getNonBasicStatsModifiers(PhysicalCard self) { + return Collections.singletonList( + new MayNotBearModifier(self, Filters.hasAttached(self), Filters.keyword(Keyword.HAND_WEAPON))); + } + + @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.attachedTo(Filters.hasAttached(self)), Filters.keyword(Keyword.HAND_WEAPON)))); + return Collections.singletonList(action); + } + if (effectResult.getType() == EffectResult.Type.START_OF_PHASE + && game.getGameState().getCurrentPhase() == Phase.SKIRMISH) { + final Skirmish skirmish = game.getGameState().getSkirmish(); + if (skirmish != null && skirmish.getFellowshipCharacter() != null && skirmish.getFellowshipCharacter().getBlueprint().getName().equals("Gandalf")) { + RequiredTriggerAction action = new RequiredTriggerAction(self); + action.appendEffect( + new ExertCharactersEffect(self, Filters.inSkirmishAgainst(Filters.name("Gandalf")))); + return Collections.singletonList(action); + } + } + return null; + } +}