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 90703b546..f95a07e6b 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 @@ -1,10 +1,12 @@ package com.gempukku.lotro.cards; import com.gempukku.lotro.cards.actions.AttachPermanentAction; -import com.gempukku.lotro.common.*; +import com.gempukku.lotro.common.CardType; +import com.gempukku.lotro.common.Culture; +import com.gempukku.lotro.common.Phase; +import com.gempukku.lotro.common.Side; import com.gempukku.lotro.filters.Filter; import com.gempukku.lotro.filters.Filters; -import com.gempukku.lotro.game.LotroCardBlueprint; import com.gempukku.lotro.game.PhysicalCard; import com.gempukku.lotro.game.state.GameState; import com.gempukku.lotro.game.state.LotroGame; @@ -32,11 +34,12 @@ public class AbstractAttachable extends AbstractLotroCardBlueprint { protected void appendAttachCardAction(List actions, LotroGame game, PhysicalCard self, Filter validTargetFilter, Map playCostModifiers) { GameState gameState = game.getGameState(); - LotroCardBlueprint blueprint = self.getBlueprint(); - if (gameState.getCurrentPhase() == ((getSide() == Side.FREE_PEOPLE) ? Phase.FELLOWSHIP : Phase.SHADOW) - && (self.getZone() == Zone.HAND || self.getZone() == Zone.DECK) - && (!blueprint.isUnique() || !Filters.canSpot(gameState, game.getModifiersQuerying(), Filters.name(blueprint.getName()))) - && Filters.canSpot(gameState, game.getModifiersQuerying(), validTargetFilter)) { + if (Filters.canSpot(gameState, game.getModifiersQuerying(), validTargetFilter) + && + ((getSide() == Side.FREE_PEOPLE && PlayConditions.canPlayFPCardDuringPhase(game, Phase.FELLOWSHIP, self)) + || + (getSide() == Side.SHADOW && PlayConditions.canPlayShadowCardDuringPhase(game, Phase.SHADOW, self))) + ) { actions.add(new AttachPermanentAction(self, validTargetFilter, playCostModifiers)); } 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 a33ee4053..108d88347 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 @@ -156,4 +156,12 @@ public class ProxyingModifier implements Modifier { return modifier.canPlayPhaseActions(gameState, modifiersQuerying, phase, result); return result; } + + @Override + public boolean shouldSkipPhase(GameState gameState, ModifiersQuerying modifiersQuerying, Phase phase, boolean result) { + Modifier modifier = getProxiedModifier(gameState, modifiersQuerying); + if (modifier != null) + return modifier.shouldSkipPhase(gameState, modifiersQuerying, phase, result); + return result; + } } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/isengard/Card1_138.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/isengard/Card1_138.java index 86ebcce8a..124e60f90 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/isengard/Card1_138.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/isengard/Card1_138.java @@ -10,11 +10,14 @@ import com.gempukku.lotro.filters.Filters; 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.CostToEffectAction; import com.gempukku.lotro.logic.effects.ChooseActiveCardEffect; +import com.gempukku.lotro.logic.effects.DiscardCardFromPlayEffect; import com.gempukku.lotro.logic.modifiers.AbstractModifier; import com.gempukku.lotro.logic.modifiers.Modifier; import com.gempukku.lotro.logic.modifiers.ModifiersQuerying; import com.gempukku.lotro.logic.timing.Action; +import com.gempukku.lotro.logic.timing.EffectResult; import java.util.Collections; import java.util.List; @@ -72,4 +75,16 @@ public class Card1_138 extends AbstractLotroCardBlueprint { } }; } + + @Override + public List getRequiredWhenActions(LotroGame game, EffectResult effectResult, PhysicalCard self) { + if (effectResult.getType() == EffectResult.Type.END_OF_TURN) { + CostToEffectAction action = new CostToEffectAction(self, "Discard at the end of the turn"); + action.addEffect(new DiscardCardFromPlayEffect(self)); + + return Collections.singletonList(action); + } + + return null; + } } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/isengard/Card1_140.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/isengard/Card1_140.java new file mode 100644 index 000000000..f147a8cb7 --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/isengard/Card1_140.java @@ -0,0 +1,89 @@ +package com.gempukku.lotro.cards.set1.isengard; + +import com.gempukku.lotro.cards.AbstractLotroCardBlueprint; +import com.gempukku.lotro.cards.PlayConditions; +import com.gempukku.lotro.cards.actions.AttachPermanentAction; +import com.gempukku.lotro.cards.effects.ExertCharacterEffect; +import com.gempukku.lotro.common.CardType; +import com.gempukku.lotro.common.Culture; +import com.gempukku.lotro.common.Phase; +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.GameState; +import com.gempukku.lotro.game.state.LotroGame; +import com.gempukku.lotro.logic.actions.CostToEffectAction; +import com.gempukku.lotro.logic.effects.ChooseActiveCardEffect; +import com.gempukku.lotro.logic.effects.DiscardCardFromPlayEffect; +import com.gempukku.lotro.logic.modifiers.AbstractModifier; +import com.gempukku.lotro.logic.modifiers.Modifier; +import com.gempukku.lotro.logic.modifiers.ModifiersQuerying; +import com.gempukku.lotro.logic.timing.Action; +import com.gempukku.lotro.logic.timing.EffectResult; + +import java.util.Collections; +import java.util.List; + +/** + * Set: The Fellowship of the Ring + * Side: Shadow + * Culture: Isengard + * Twilight Cost: 2 + * Type: Condition + * Game Text: To play, exert a [ISENGARD] minion. Plays on a site. While the fellowship is at this site, skip the + * archery phase. Discard this condition at the end of the turn. + */ +public class Card1_140 extends AbstractLotroCardBlueprint { + public Card1_140() { + super(Side.SHADOW, CardType.CONDITION, Culture.ISENGARD, "Spies of Saruman", "1_140"); + } + + @Override + public int getTwilightCost() { + return 2; + } + + @Override + public List getPlayablePhaseActions(String playerId, LotroGame game, PhysicalCard self) { + if (PlayConditions.canPlayShadowCardDuringPhase(game, Phase.SHADOW, self) + && Filters.canSpot(game.getGameState(), game.getModifiersQuerying(), Filters.culture(Culture.ISENGARD), Filters.type(CardType.MINION), Filters.canExert())) { + final AttachPermanentAction action = new AttachPermanentAction(self, Filters.type(CardType.SITE), Collections.emptyMap()); + action.addCost( + new ChooseActiveCardEffect(playerId, "Choose an ISENGARD minion", Filters.culture(Culture.ISENGARD), Filters.type(CardType.MINION), Filters.canExert()) { + @Override + protected void cardSelected(LotroGame game, PhysicalCard isengardMinion) { + action.addCost(new ExertCharacterEffect(isengardMinion)); + } + } + ); + return Collections.singletonList(action); + } + return null; + } + + @Override + public Modifier getAlwaysOnEffect(final PhysicalCard self) { + return new AbstractModifier(self, "Skip archery phase", null) { + @Override + public boolean shouldSkipPhase(GameState gameState, ModifiersQuerying modifiersQuerying, Phase phase, boolean result) { + if (phase == Phase.ARCHERY + && gameState.getCurrentSite() == self.getAttachedTo()) + return true; + return result; + } + }; + } + + @Override + public List getRequiredWhenActions(LotroGame game, EffectResult effectResult, PhysicalCard self) { + if (effectResult.getType() == EffectResult.Type.END_OF_TURN) { + CostToEffectAction action = new CostToEffectAction(self, "Discard at the end of the turn"); + action.addEffect(new DiscardCardFromPlayEffect(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 fff70d228..d9848aa0e 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 @@ -100,4 +100,9 @@ public abstract class AbstractModifier implements Modifier { public boolean canPlayPhaseActions(GameState gameState, ModifiersQuerying modifiersQuerying, Phase phase, boolean result) { return result; } + + @Override + public boolean shouldSkipPhase(GameState gameState, ModifiersQuerying modifiersQuerying, Phase phase, 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 2ad0c41c1..0e431e7b2 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 @@ -155,4 +155,12 @@ public class CompositeModifier implements Modifier { return result; } + + @Override + public boolean shouldSkipPhase(GameState gameState, ModifiersQuerying modifiersQuerying, Phase phase, boolean result) { + for (Modifier modifier : _modifiers) + result = modifier.shouldSkipPhase(gameState, modifiersQuerying, phase, 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 ef4cb8989..54da31656 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 @@ -40,4 +40,6 @@ public interface Modifier { public boolean addsToArcheryTotal(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard card, boolean result); public boolean canPlayPhaseActions(GameState gameState, ModifiersQuerying modifiersQuerying, Phase phase, boolean result); + + public boolean shouldSkipPhase(GameState gameState, ModifiersQuerying modifiersQuerying, Phase phase, boolean result); } 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 e06baf017..79426974b 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 @@ -231,6 +231,14 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying { return result; } + @Override + public boolean shouldSkipPhase(GameState gameState, Phase phase) { + boolean result = false; + for (Modifier modifier : _modifiers) + result = modifier.shouldSkipPhase(gameState, this, phase, 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 aeaee41c2..c31ff2154 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 @@ -36,4 +36,6 @@ public interface ModifiersQuerying { public boolean addsToArcheryTotal(GameState gameState, PhysicalCard card); public boolean canPlayPhaseActions(GameState gameState, Phase phase); + + public boolean shouldSkipPhase(GameState gameState, Phase phase); } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/ArcheryGameProcess.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/ArcheryGameProcess.java index 33e530aaa..557b19adc 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/ArcheryGameProcess.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/ArcheryGameProcess.java @@ -25,6 +25,9 @@ public class ArcheryGameProcess implements GameProcess { @Override public GameProcess getNextProcess() { + if (_game.getModifiersQuerying().shouldSkipPhase(_game.getGameState(), Phase.ARCHERY)) + new CanSpotGameProcess(_game, Filters.type(CardType.MINION), new AssignmentGameProcess(_game), new RegroupGameProcess(_game)); + return new StartOfPhaseGameProcess(_game, Phase.ARCHERY, new PlayersPlayPhaseActionsInOrderGameProcess(_game, _game.getGameState().getPlayerOrder().getCounterClockwisePlayOrder(_game.getGameState().getCurrentPlayerId(), true), 0, new ArcheryFireGameProcess(_game,