diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/LookAtTopCardOfADeckEffect.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/LookAtTopCardOfADeckEffect.java new file mode 100644 index 000000000..783140414 --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/LookAtTopCardOfADeckEffect.java @@ -0,0 +1,54 @@ +package com.gempukku.lotro.cards.effects; + +import com.gempukku.lotro.game.PhysicalCard; +import com.gempukku.lotro.game.state.LotroGame; +import com.gempukku.lotro.logic.decisions.ArbitraryCardsSelectionDecision; +import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException; +import com.gempukku.lotro.logic.timing.AbstractEffect; +import com.gempukku.lotro.logic.timing.Effect; + +import java.util.Collections; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; + +public class LookAtTopCardOfADeckEffect extends AbstractEffect { + private String _playerId; + private int _count; + private String _playerDeckId; + + public LookAtTopCardOfADeckEffect(String playerId, int count, String playerDeckId) { + _playerId = playerId; + _count = count; + _playerDeckId = playerDeckId; + } + + @Override + public String getText(LotroGame game) { + return null; + } + + @Override + public Effect.Type getType() { + return null; + } + + @Override + public boolean isPlayableInFull(LotroGame game) { + return game.getGameState().getDeck(_playerDeckId).size() >= _count; + } + + @Override + protected FullEffectResult playEffectReturningResult(LotroGame game) { + List deck = game.getGameState().getDeck(_playerDeckId); + List cards = game.getGameState().getDeck(_playerDeckId).subList(0, Math.min(deck.size(), _count)); + + game.getUserFeedback().sendAwaitingDecision(_playerId, + new ArbitraryCardsSelectionDecision(1, "Cards on top of deck (left is top)", cards, Collections.emptyList(), 0, 0) { + @Override + public void decisionMade(String result) throws DecisionResultInvalidException { + } + }); + return new FullEffectResult(deck.size() >= _count); + } +} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/elven/Card40_042.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/elven/Card40_042.java new file mode 100644 index 000000000..bd7c7be2f --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/elven/Card40_042.java @@ -0,0 +1,39 @@ +package com.gempukku.lotro.cards.set40.elven; + +import com.gempukku.lotro.cards.AbstractAttachableFPPossession; +import com.gempukku.lotro.common.*; +import com.gempukku.lotro.filters.Filters; +import com.gempukku.lotro.game.PhysicalCard; +import com.gempukku.lotro.game.state.LotroGame; +import com.gempukku.lotro.logic.modifiers.KeywordModifier; +import com.gempukku.lotro.logic.modifiers.Modifier; + +import java.util.Collections; +import java.util.List; + +/** + * Title: Elven Bow + * Set: Second Edition + * Side: Free + * Culture: Elven + * Twilight Cost: 1 + * Type: Possession - Ranged Weapon + * Card Number: 1C42 + * Game Text: Bearer must be an Elf. Bearer is an archer. + */ +public class Card40_042 extends AbstractAttachableFPPossession{ + public Card40_042() { + super(1, 0, 0, Culture.ELVEN, PossessionClass.RANGED_WEAPON, "Elven Bow"); + } + + @Override + protected Filterable getValidTargetFilter(String playerId, LotroGame game, PhysicalCard self) { + return Race.ELF; + } + + @Override + protected List getNonBasicStatsModifiers(PhysicalCard self) { + KeywordModifier modifier = new KeywordModifier(self, Filters.hasAttached(self), Keyword.ARCHER); + return Collections.singletonList(modifier); + } +} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/elven/Card40_043.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/elven/Card40_043.java new file mode 100644 index 000000000..80d67c55c --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/elven/Card40_043.java @@ -0,0 +1,70 @@ +package com.gempukku.lotro.cards.set40.elven; + +import com.gempukku.lotro.cards.AbstractEvent; +import com.gempukku.lotro.cards.TriggerConditions; +import com.gempukku.lotro.cards.actions.PlayEventAction; +import com.gempukku.lotro.cards.effects.AddUntilEndOfPhaseActionProxyEffect; +import com.gempukku.lotro.cards.effects.OptionalEffect; +import com.gempukku.lotro.cards.effects.choose.ChooseAndAddUntilEOPStrengthBonusEffect; +import com.gempukku.lotro.cards.effects.choose.ChooseAndPutCardFromDiscardOnTopOfDeckEffect; +import com.gempukku.lotro.common.Culture; +import com.gempukku.lotro.common.Phase; +import com.gempukku.lotro.common.Race; +import com.gempukku.lotro.common.Side; +import com.gempukku.lotro.game.AbstractActionProxy; +import com.gempukku.lotro.game.PhysicalCard; +import com.gempukku.lotro.game.state.LotroGame; +import com.gempukku.lotro.logic.actions.OptionalTriggerAction; +import com.gempukku.lotro.logic.timing.EffectResult; + +import java.util.Collections; +import java.util.List; + +/** + * Title: Elven Reflexes + * Set: Second Edition + * Side: Free + * Culture: Elven + * Twilight Cost: 0 + * Type: Event - Skirmish + * Card Number: 1R43 + * Game Text: Make an Elf strength +1. If that Elf wins this skirmish, you may place up to 2 [ELVEN] cards from your discard pile on top of your draw deck. + */ +public class Card40_043 extends AbstractEvent { + public Card40_043() { + super(Side.FREE_PEOPLE, 0, Culture.ELVEN, "Elven Reflexes", Phase.SKIRMISH); + } + + @Override + public PlayEventAction getPlayCardAction(String playerId, LotroGame game, final PhysicalCard self, int twilightModifier, boolean ignoreRoamingPenalty) { + final PlayEventAction action = new PlayEventAction(self); + action.appendEffect( + new ChooseAndAddUntilEOPStrengthBonusEffect(action, self, playerId, 1, Race.ELF) { + @Override + protected void selectedCharacterCallback(final PhysicalCard selectedCharacter) { + action.appendEffect( + new AddUntilEndOfPhaseActionProxyEffect( + new AbstractActionProxy() { + @Override + public List getOptionalAfterTriggers(String playerId, LotroGame game, EffectResult effectResult) { + if (TriggerConditions.winsSkirmish(game, effectResult, selectedCharacter)) { + OptionalTriggerAction action = new OptionalTriggerAction(self); + action.setVirtualCardAction(true); + action.appendEffect( + new OptionalEffect(action, playerId, + new ChooseAndPutCardFromDiscardOnTopOfDeckEffect(action, playerId, 0, 2, Culture.ELVEN) { + @Override + public String getText(LotroGame game) { + return "Put up to 2 [ELVEN] cards from your discard pile on top of your draw deck"; + } + })); + return Collections.singletonList(action); + } + return null; + } + })); + } + }); + return action; + } +} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/elven/Card40_044.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/elven/Card40_044.java new file mode 100644 index 000000000..9813ff0af --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/elven/Card40_044.java @@ -0,0 +1,70 @@ +package com.gempukku.lotro.cards.set40.elven; + +import com.gempukku.lotro.cards.AbstractEvent; +import com.gempukku.lotro.cards.AbstractPermanent; +import com.gempukku.lotro.cards.PlayConditions; +import com.gempukku.lotro.cards.effects.DiscardTopCardFromDeckEffect; +import com.gempukku.lotro.cards.effects.LookAtTopCardOfADeckEffect; +import com.gempukku.lotro.cards.effects.OptionalEffect; +import com.gempukku.lotro.cards.effects.SelfDiscardEffect; +import com.gempukku.lotro.common.*; +import com.gempukku.lotro.game.PhysicalCard; +import com.gempukku.lotro.game.state.LotroGame; +import com.gempukku.lotro.logic.actions.ActivateCardAction; +import com.gempukku.lotro.logic.effects.AddTwilightEffect; +import com.gempukku.lotro.logic.timing.Action; + +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +/** + * Title: Forewarned + * Set: Second Edition + * Side: Free + * Culture: Elven + * Twilight Cost: 0 + * Type: Condition - Support Area + * Card Number: 1C44 + * Game Text: To play, spot two Elves. + * Fellowship: Add (1) to look at the top card of your draw deck. You may discard this condition to discard that card. + */ +public class Card40_044 extends AbstractPermanent { + public Card40_044() { + super(Side.FREE_PEOPLE, 0, CardType.CONDITION, Culture.ELVEN, Zone.SUPPORT, "Forewarned"); + } + + @Override + public boolean checkPlayRequirements(String playerId, LotroGame game, PhysicalCard self, int withTwilightRemoved, int twilightModifier, boolean ignoreRoamingPenalty, boolean ignoreCheckingDeadPile) { + return super.checkPlayRequirements(playerId, game, self, withTwilightRemoved, twilightModifier, ignoreRoamingPenalty, ignoreCheckingDeadPile) + && PlayConditions.canSpot(game, 2, Race.ELF); + } + + @Override + protected List getExtraPhaseActions(final String playerId, LotroGame game, final PhysicalCard self) { + if (PlayConditions.canUseFPCardDuringPhase(game, Phase.FELLOWSHIP, self)) { + final ActivateCardAction action = new ActivateCardAction(self); + action.appendCost( + new AddTwilightEffect(self, 1)); + action.appendEffect( + new LookAtTopCardOfADeckEffect(playerId, 1, playerId)); + action.appendEffect( + new OptionalEffect(action, playerId, + new SelfDiscardEffect(self) { + @Override + public String getText(LotroGame game) { + return "Discard this condition"; + } + + @Override + protected void forEachDiscardedByEffectCallback(Collection discardedCards) { + action.appendEffect( + new DiscardTopCardFromDeckEffect(self, playerId, 1, false)); + } + })); + + return Collections.singletonList(action); + } + return null; + } +} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/elven/Card40_045.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/elven/Card40_045.java new file mode 100644 index 000000000..f0ef97cfa --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/elven/Card40_045.java @@ -0,0 +1,76 @@ +package com.gempukku.lotro.cards.set40.elven; + +import com.gempukku.lotro.cards.AbstractAlly; +import com.gempukku.lotro.cards.PlayConditions; +import com.gempukku.lotro.cards.TriggerConditions; +import com.gempukku.lotro.cards.effects.RevealTopCardsOfDrawDeckEffect; +import com.gempukku.lotro.cards.effects.SelfExertEffect; +import com.gempukku.lotro.cards.effects.choose.ChooseAndAddUntilEOPStrengthBonusEffect; +import com.gempukku.lotro.common.*; +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.ActivateCardAction; +import com.gempukku.lotro.logic.actions.RequiredTriggerAction; +import com.gempukku.lotro.logic.effects.HealCharactersEffect; +import com.gempukku.lotro.logic.timing.Action; +import com.gempukku.lotro.logic.timing.EffectResult; + +import java.util.Collections; +import java.util.List; + +/** + * Title: *Galadriel, White Lady of Lorien + * Set: Second Edition + * Side: Free + * Culture: Elven + * Twilight Cost: 3 + * Type: Ally - Elf - Lothlorien + * Strength: 3 + * Vitality: 3 + * Card Number: 1R45 + * Game Text: At the start of each of your turns, heal each Lothlorien ally. + * Skirmish: Exert Galadriel to reveal the top card of your draw deck. Make a minion skirmishing an Elf strength -X, where X is the twilight cost of the revealed card. + */ +public class Card40_045 extends AbstractAlly { + public Card40_045() { + super(3, Block.SECOND_ED, 0, 3, 3, Race.ELF, Culture.ELVEN, "Galadriel", "White Lady of Lorien", true); + addKeyword(Keyword.LOTHLORIEN); + } + + @Override + public List getRequiredAfterTriggers(LotroGame game, EffectResult effectResult, PhysicalCard self) { + if (TriggerConditions.startOfTurn(game, effectResult)) { + RequiredTriggerAction action = new RequiredTriggerAction(self); + action.appendEffect( + new HealCharactersEffect(self, CardType.ALLY, Keyword.LOTHLORIEN)); + return Collections.singletonList(action); + } + return null; + } + + @Override + protected List getExtraInPlayPhaseActions(final String playerId, LotroGame game, final PhysicalCard self) { + if (PlayConditions.canUseFPCardDuringPhase(game, Phase.SKIRMISH, self) + && PlayConditions.canSelfExert(self, game)) { + final ActivateCardAction action = new ActivateCardAction(self); + action.appendCost( + new SelfExertEffect(action, self)); + action.appendEffect( + new RevealTopCardsOfDrawDeckEffect(self, playerId, 1) { + @Override + protected void cardsRevealed(List revealedCards) { + if (revealedCards.size() > 0) { + PhysicalCard revealedCard = revealedCards.get(0); + int twilightCost = revealedCard.getBlueprint().getTwilightCost(); + action.appendEffect( + new ChooseAndAddUntilEOPStrengthBonusEffect(action, self, playerId, -twilightCost, + CardType.MINION, Filters.inSkirmishAgainst(Race.ELF))); + } + } + }); + return Collections.singletonList(action); + } + return null; + } +} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/elven/Card40_046.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/elven/Card40_046.java new file mode 100644 index 000000000..2728bd2da --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/elven/Card40_046.java @@ -0,0 +1,60 @@ +package com.gempukku.lotro.cards.set40.elven; + +import com.gempukku.lotro.cards.AbstractEvent; +import com.gempukku.lotro.cards.PlayConditions; +import com.gempukku.lotro.cards.actions.PlayEventAction; +import com.gempukku.lotro.cards.effects.RevealTopCardsOfDrawDeckEffect; +import com.gempukku.lotro.cards.effects.choose.ChooseAndDiscardCardsFromPlayEffect; +import com.gempukku.lotro.cards.effects.choose.ChooseAndExertCharactersEffect; +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.Filters; +import com.gempukku.lotro.game.PhysicalCard; +import com.gempukku.lotro.game.state.LotroGame; + +import java.util.List; + +/** + * Title: Galadriel's Wisdom + * Set: Second Edition + * Side: Free + * Culture: Elven + * Twilight Cost: 1 + * Type: Event - Regroup + * Card Number: 1C46 + * Game Text: Exert Galadriel and reveal the top card of your draw deck to discard a Shadow condition (or 2 Shadow conditions if you reveal an [ELVEN] card). + */ +public class Card40_046 extends AbstractEvent { + public Card40_046() { + super(Side.FREE_PEOPLE, 1, Culture.ELVEN, "Galadriel's Wisdom", Phase.REGROUP); + } + + @Override + public boolean checkPlayRequirements(String playerId, LotroGame game, PhysicalCard self, int withTwilightRemoved, int twilightModifier, boolean ignoreRoamingPenalty, boolean ignoreCheckingDeadPile) { + return super.checkPlayRequirements(playerId, game, self, withTwilightRemoved, twilightModifier, ignoreRoamingPenalty, ignoreCheckingDeadPile) + && PlayConditions.canExert(self, game, Filters.name("Galadriel")) + && game.getGameState().getDeck(playerId).size() > 0; + } + + @Override + public PlayEventAction getPlayCardAction(final String playerId, LotroGame game, PhysicalCard self, int twilightModifier, boolean ignoreRoamingPenalty) { + final PlayEventAction action = new PlayEventAction(self); + action.appendCost( + new ChooseAndExertCharactersEffect(action, playerId, 1, 1, Filters.name("Galadriel"))); + action.appendCost( + new RevealTopCardsOfDrawDeckEffect(self, playerId, 1) { + @Override + protected void cardsRevealed(List revealedCards) { + if (revealedCards.size() > 0) { + PhysicalCard revealedCard = revealedCards.get(0); + int discardCount = (revealedCard.getBlueprint().getCulture() == Culture.ELVEN) ? 2 : 1; + action.appendEffect( + new ChooseAndDiscardCardsFromPlayEffect(action, playerId, discardCount, discardCount, Side.SHADOW, CardType.CONDITION)); + } + } + }); + return action; + } +} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/elven/Card40_047.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/elven/Card40_047.java new file mode 100644 index 000000000..6d4d8530d --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/elven/Card40_047.java @@ -0,0 +1,61 @@ +package com.gempukku.lotro.cards.set40.elven; + +import com.gempukku.lotro.cards.AbstractCompanion; +import com.gempukku.lotro.cards.TriggerConditions; +import com.gempukku.lotro.cards.effects.AddUntilStartOfPhaseModifierEffect; +import com.gempukku.lotro.cards.modifiers.CantBeOverwhelmedModifier; +import com.gempukku.lotro.cards.modifiers.OverwhelmedByMultiplierModifier; +import com.gempukku.lotro.common.Culture; +import com.gempukku.lotro.common.Keyword; +import com.gempukku.lotro.common.Phase; +import com.gempukku.lotro.common.Race; +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.modifiers.Modifier; +import com.gempukku.lotro.logic.modifiers.RemoveKeywordModifier; +import com.gempukku.lotro.logic.timing.EffectResult; +import com.gempukku.lotro.logic.timing.results.AssignAgainstResult; + +import java.util.Collections; +import java.util.List; + +/** + * Title: *Glorfindel, Emissary of the Valar + * Set: Second Edition + * Side: Free + * Culture: Elven + * Twilight Cost: 4 + * Type: Companion - Elf + * Strength: 9 + * Vitality: 3 + * Resistance: 9 + * Card Number: 1R47 + * Game Text: Glorfindel may not be overwhelmed unless his strength is tripled. + * Each time a Nazgul is assigned to skirmish Glorfindel, that Nazgul is prevented from being fierce until the regroup phase. + */ +public class Card40_047 extends AbstractCompanion{ + public Card40_047() { + super(4, 9, 3, 9, Culture.ELVEN, Race.ELF, null, "Glorfindel", "Emissary of the Valar", true); + } + + @Override + public List getAlwaysOnModifiers(LotroGame game, PhysicalCard self) { + OverwhelmedByMultiplierModifier modifier = new OverwhelmedByMultiplierModifier(self, self, 3); + return Collections.singletonList(modifier); + } + + @Override + public List getRequiredAfterTriggers(LotroGame game, EffectResult effectResult, PhysicalCard self) { + if (TriggerConditions.assignedAgainst(game, effectResult, null, self, Race.NAZGUL)) { + AssignAgainstResult assignedAgainst = (AssignAgainstResult) effectResult; + PhysicalCard nazgul = assignedAgainst.getAssignedCard(); + RequiredTriggerAction action = new RequiredTriggerAction(self); + action.appendEffect( + new AddUntilStartOfPhaseModifierEffect( + new RemoveKeywordModifier(self, nazgul, Keyword.FIERCE), Phase.REGROUP)); + return Collections.singletonList(action); + } + return null; + } +}