From d321af0110d882618712f5bb42935d3f8b9c808e Mon Sep 17 00:00:00 2001 From: "marcin.sciesinski" Date: Wed, 4 Sep 2019 03:35:50 -0700 Subject: [PATCH] Couple of Gondor cards --- .../main/web/cards/set40/set40-gondor.json | 165 ++++++++++++++++++ .../lotro/cards/set40/gondor/Card40_093.java | 51 ------ .../lotro/cards/set40/gondor/Card40_094.java | 42 ----- .../lotro/cards/set40/gondor/Card40_095.java | 58 ------ .../lotro/cards/set40/gondor/Card40_096.java | 67 ------- .../lotro/cards/set40/gondor/Card40_097.java | 67 ------- .../lotro/cards/set40/gondor/Card40_098.java | 39 ----- .../lotro/cards/set40/gondor/Card40_099.java | 45 ----- .../lotro/cards/set40/gondor/Card40_100.java | 60 ------- .../lotro/cards/set40/gondor/Card40_101.java | 53 ------ .../lotro/cards/set40/gondor/Card40_102.java | 47 ----- .../lotro/cards/set40/gondor/Card40_103.java | 63 ------- .../lotro/cards/set40/gondor/Card40_104.java | 59 ------- .../appender/resolver/ValueResolver.java | 10 ++ .../AddNoTwilightForCompanionMove.java | 22 +++ .../modifier/ModifierSourceFactory.java | 2 + .../effect/modifier/ModifyArcheryTotal.java | 28 +++ 17 files changed, 227 insertions(+), 651 deletions(-) delete mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_093.java delete mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_094.java delete mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_095.java delete mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_096.java delete mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_097.java delete mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_098.java delete mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_099.java delete mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_100.java delete mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_101.java delete mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_102.java delete mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_103.java delete mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_104.java create mode 100644 gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/AddNoTwilightForCompanionMove.java create mode 100644 gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifyArcheryTotal.java diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set40/set40-gondor.json b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set40/set40-gondor.json index c2e17bc45..a96e6b1fa 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set40/set40-gondor.json +++ b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set40/set40-gondor.json @@ -156,6 +156,171 @@ } } }, + "40_99": { + "title": "Avoid Being Seen", + "culture": "gondor", + "cost": 0, + "type": "event", + "keyword": "fellowship", + "effects": { + "type": "event", + "cost": { + "type": "exert", + "count": "0-100", + "filter": "choose(ranger)", + "memorize": "exertedRangers" + }, + "effect": { + "type": "addModifier", + "until": "endOfTurn", + "modifier": { + "type": "addNoTwilightForCompanionMove", + "filter": "memory(exertedRangers)" + } + } + } + }, + "40_100": { + "title": "*Blade of Gondor", + "subtitle": "Weapon of Honor", + "culture": "gondor", + "cost": 1, + "type": "possession", + "possession": "hand weapon", + "strength": 2, + "target": "name(Boromir)", + "effects": [ + { + "type": "modifier", + "modifier": { + "type": "addKeyword", + "filter": "bearer", + "keyword": "damage+1" + } + }, + { + "type": "activated", + "phase": "skirmish", + "cost": { + "type": "exert", + "filter": "choose(name(Boromir))" + }, + "effect": { + "type": "wound", + "filter": "choose(or(Orc,Uruk-hai),inSkirmishAgainst(not(name(Boromir)),unbound,companion))" + } + } + ] + }, + "40_101": { + "title": "*Boromir", + "subtitle": "Champion of Minas Tirith", + "culture": "gondor", + "cost": 3, + "type": "companion", + "race": "man", + "strength": 7, + "vitality": 3, + "resistance": 6, + "keyword": "ranger", + "effects": { + "type": "modifier", + "modifier": { + "type": "modifyStrength", + "filter": "self,inSkirmish", + "amount": { + "type": "forEachWound", + "filter": "character,inSkirmish" + } + } + } + }, + "40_102": { + "title": "*Boromir", + "subtitle": "Son of Denethor", + "culture": "gondor", + "cost": 3, + "type": "companion", + "race": "man", + "strength": 7, + "vitality": 3, + "resistance": 6, + "effects": { + "type": "activated", + "phase": "skirmish", + "cost": { + "type": "exert", + "filter": "self" + }, + "effect": { + "type": "modifyStrength", + "filter": "self", + "amount": 3 + } + } + }, + "40_103": { + "title": "*Boromir's Gauntlets", + "culture": "gondor", + "cost": 1, + "type": "possession", + "possession": "gauntlets", + "target": "culture(gondor),man", + "effects": { + "type": "activated", + "phase": "skirmish", + "cost": { + "type": "exert", + "filter": "choose(bearer)" + }, + "effect": { + "type": "preventable", + "effect": { + "type": "cancelSkirmish", + "filter": "bearer" + }, + "text": "Would you like to remove (1) to prevent cancellation of skirmish?", + "player": "shadowPlayer", + "cost": { + "type": "removeTwilight" + } + } + } + }, + "40_104": { + "title": "*Boromir's Shield", + "culture": "gondor", + "cost": 1, + "type": "possession", + "possession": "shield", + "target": "culture(gondor),man", + "effects": [ + { + "type": "modifier", + "modifier": { + "type": "modifyArcheryTotal", + "side": "shadow", + "amount": -1 + } + }, + { + "type": "activated", + "phase": "regroup", + "condition": { + "type": "canSpot", + "filter": "bearer,name(Boromir)" + }, + "cost": { + "type": "discard", + "filter": "self" + }, + "effect": { + "type": "discard", + "filter": "choose(side(shadow),possession)" + } + } + ] + }, "40_313": { "title": "Athelas", "subtitle": "Asëa Aranion", diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_093.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_093.java deleted file mode 100644 index e399db8f0..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_093.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.gempukku.lotro.cards.set40.gondor; - -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.cardtype.AbstractAttachable; -import com.gempukku.lotro.logic.effects.AddUntilEndOfPhaseModifierEffect; -import com.gempukku.lotro.logic.effects.choose.ChooseAndExertCharactersEffect; -import com.gempukku.lotro.logic.modifiers.StrengthModifier; -import com.gempukku.lotro.logic.timing.PlayConditions; - -import java.util.Collections; -import java.util.List; - -/** - * Title: Alliance of Old - * Set: Second Edition - * Side: Free - * Culture: Gondor - * Twilight Cost: 1 - * Type: Condition - Companion - * Card Number: 1R93 - * Game Text: Tale. Bearer must be an Elf. Skirmish: Exert a [GONDOR] Man to make bearer strength +2. - */ -public class Card40_093 extends AbstractAttachable { - public Card40_093() { - super(Side.FREE_PEOPLE, CardType.CONDITION, 1, Culture.GONDOR, null, "Alliance of Old"); - addKeyword(Keyword.TALE); - } - - @Override - public Filterable getValidTargetFilter(String playerId, LotroGame game, PhysicalCard self) { - return Race.ELF; - } - - @Override - public List getPhaseActionsInPlay(String playerId, LotroGame game, PhysicalCard self) { - if (PlayConditions.canUseFPCardDuringPhase(game, Phase.SKIRMISH, self) - && PlayConditions.canExert(self, game, Culture.GONDOR, Race.MAN)) { - ActivateCardAction action = new ActivateCardAction(self); - action.appendCost( - new ChooseAndExertCharactersEffect(action, playerId, 1, 1, Culture.GONDOR, Race.MAN)); - action.appendEffect( - new AddUntilEndOfPhaseModifierEffect( - new StrengthModifier(self, self.getAttachedTo(), 2))); - return Collections.singletonList(action); - } - return null; - } -} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_094.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_094.java deleted file mode 100644 index 2102fe9c4..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_094.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.gempukku.lotro.cards.set40.gondor; - -import com.gempukku.lotro.common.Culture; -import com.gempukku.lotro.common.Keyword; -import com.gempukku.lotro.common.Race; -import com.gempukku.lotro.filters.Filters; -import com.gempukku.lotro.game.PhysicalCard; -import com.gempukku.lotro.game.state.LotroGame; -import com.gempukku.lotro.logic.cardtype.AbstractCompanion; -import com.gempukku.lotro.logic.modifiers.KeywordModifier; -import com.gempukku.lotro.logic.modifiers.Modifier; -import com.gempukku.lotro.logic.modifiers.condition.LocationCondition; - -import java.util.Collections; -import java.util.List; - -/** - * Title: *Aragorn, Dunedain Ranger - * Set: Second Edition - * Side: Free - * Culture: Gondor - * Twilight Cost: 4 - * Type: Companion - Man - * Strength: 8 - * Vitality: 4 - * Resistance: 8 - * Card Number: 1C94 - * Game Text: Ranger. While at a site from your adventure deck, Aragorn is defender +1. - */ -public class Card40_094 extends AbstractCompanion { - public Card40_094() { - super(4, 8, 4, 8, Culture.GONDOR, Race.MAN, null, "Aragorn", "Dunedain Ranger", true); - addKeyword(Keyword.RANGER); - } - - @Override - public List getInPlayModifiers(LotroGame game, PhysicalCard self) { - KeywordModifier modifier = new KeywordModifier(self, self, - new LocationCondition(Filters.owner(self.getOwner())), Keyword.DEFENDER, 1); - return Collections.singletonList(modifier); - } -} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_095.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_095.java deleted file mode 100644 index be6aaf0f3..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_095.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.gempukku.lotro.cards.set40.gondor; - -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.PlayUtils; -import com.gempukku.lotro.logic.actions.ActivateCardAction; -import com.gempukku.lotro.logic.cardtype.AbstractCompanion; -import com.gempukku.lotro.logic.effects.HealCharactersEffect; -import com.gempukku.lotro.logic.effects.choose.ChooseCardsFromHandEffect; -import com.gempukku.lotro.logic.timing.ExtraFilters; -import com.gempukku.lotro.logic.timing.PlayConditions; - -import java.util.Collection; -import java.util.Collections; -import java.util.List; - -/** - * Title: *Aragorn, Isildur's Heir - * Set: Second Edition - * Side: Free - * Culture: Gondor - * Twilight Cost: 4 - * Type: Companion - Man - * Strength: 8 - * Vitality: 4 - * Resistance: 8 - * Card Number: 1R95 - * Game Text: Ranger. Maneuver: Play an artifact or possession on Aragorn to heal him. - */ -public class Card40_095 extends AbstractCompanion { - public Card40_095() { - super(4, 8, 4, 8, Culture.GONDOR, Race.MAN, null, "Aragorn", "Isildur's Heir", true); - addKeyword(Keyword.RANGER); - } - - @Override - public List getPhaseActionsInPlay(final String playerId, final LotroGame game, final PhysicalCard self) { - if (PlayConditions.canUseFPCardDuringPhase(game, Phase.MANEUVER, self) - && PlayConditions.canPlayFromHand(playerId, game, Filters.or(CardType.ARTIFACT, CardType.POSSESSION), ExtraFilters.attachableTo(game, self))) { - ActivateCardAction action = new ActivateCardAction(self); - action.appendCost( - new ChooseCardsFromHandEffect(playerId, 1, 1, Filters.or(CardType.ARTIFACT, CardType.POSSESSION), ExtraFilters.attachableTo(game, self)) { - @Override - protected void cardsSelected(LotroGame game, Collection cards) { - for (PhysicalCard card : cards) { - game.getActionsEnvironment().addActionToStack(PlayUtils.getPlayCardAction(game, card, 0, self, false)); - } - } - }); - action.appendEffect( - new HealCharactersEffect(self, self)); - return Collections.singletonList(action); - } - return null; - } -} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_096.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_096.java deleted file mode 100644 index fef108357..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_096.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.gempukku.lotro.cards.set40.gondor; - -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.OptionalTriggerAction; -import com.gempukku.lotro.logic.cardtype.AbstractAttachableFPPossession; -import com.gempukku.lotro.logic.effects.AddUntilEndOfPhaseModifierEffect; -import com.gempukku.lotro.logic.effects.ChooseAndWoundCharactersEffect; -import com.gempukku.lotro.logic.effects.choose.ChooseAndExertCharactersEffect; -import com.gempukku.lotro.logic.modifiers.DoesNotAddToArcheryTotalModifier; -import com.gempukku.lotro.logic.modifiers.KeywordModifier; -import com.gempukku.lotro.logic.modifiers.Modifier; -import com.gempukku.lotro.logic.timing.EffectResult; -import com.gempukku.lotro.logic.timing.PlayConditions; -import com.gempukku.lotro.logic.timing.TriggerConditions; - -import java.util.Collections; -import java.util.List; - -/** - * Title: *Aragorn's Bow, Swift and True - * Set: Second Edition - * Side: Free - * Culture: Gondor - * Twilight Cost: 1 - * Type: Possession - Ranged Weapon - * Card Number: 1R96 - * Game Text: Bearer must be Aragorn. - * He is an archer. - * At the beginning of the archery phase, you may exert Aragorn to wound a minion. If you do, Aragorn does not add - * to the fellowship archery total. - */ -public class Card40_096 extends AbstractAttachableFPPossession { - public Card40_096() { - super(1, 0, 0, Culture.GONDOR, PossessionClass.RANGED_WEAPON, "Aragorn's Bow", "Swift and True", true); - } - - @Override - public Filterable getValidTargetFilter(String playerId, LotroGame game, PhysicalCard self) { - return Filters.aragorn; - } - - @Override - public List getInPlayModifiers(LotroGame game, PhysicalCard self) { - KeywordModifier modifier = new KeywordModifier(self, Filters.hasAttached(self), Keyword.ARCHER); - return Collections.singletonList(modifier); - } - - @Override - public List getOptionalAfterTriggers(String playerId, LotroGame game, EffectResult effectResult, PhysicalCard self) { - if (TriggerConditions.startOfPhase(game, effectResult, Phase.ARCHERY) - && PlayConditions.canExert(self, game, Filters.aragorn)) { - OptionalTriggerAction action = new OptionalTriggerAction(self); - action.appendCost( - new ChooseAndExertCharactersEffect(action, playerId, 1, 1, Filters.aragorn)); - action.appendEffect( - new ChooseAndWoundCharactersEffect(action, playerId, 1, 1, CardType.MINION)); - action.appendEffect( - new AddUntilEndOfPhaseModifierEffect( - new DoesNotAddToArcheryTotalModifier(self, Filters.hasAttached(self)))); - return Collections.singletonList(action); - } - return null; - } -} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_097.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_097.java deleted file mode 100644 index d16429eca..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_097.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.gempukku.lotro.cards.set40.gondor; - -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.cardtype.AbstractAttachableFPPossession; -import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException; -import com.gempukku.lotro.logic.decisions.ForEachYouSpotDecision; -import com.gempukku.lotro.logic.effects.IncrementPhaseLimitEffect; -import com.gempukku.lotro.logic.effects.PlayoutDecisionEffect; -import com.gempukku.lotro.logic.effects.choose.ChooseAndAddUntilEOPStrengthBonusEffect; -import com.gempukku.lotro.logic.effects.choose.ChooseAndDiscardCardsFromPlayEffect; -import com.gempukku.lotro.logic.timing.PlayConditions; - -import java.util.Collections; -import java.util.List; - -/** - * Title: *Aragorn's Pipe - * Set: Second Edition - * Side: Free - * Culture: Gondor - * Twilight Cost: 1 - * Type: Possession - Pipe - * Card Number: 1U97 - * Game Text: Bearer must be a [GONDOR] Man. - * Skirmish: Discard a pipeweed possession and spot X pipes to make a companion bearing a pipe strength +X - * (limit once per phase). - */ -public class Card40_097 extends AbstractAttachableFPPossession { - public Card40_097() { - super(1, 0, 0, Culture.GONDOR, PossessionClass.PIPE, "Aragorn's Pipe", null, true); - } - - @Override - public Filterable getValidTargetFilter(String playerId, LotroGame game, PhysicalCard self) { - return Filters.and(Culture.GONDOR, Race.MAN); - } - - @Override - public List getPhaseActionsInPlay(final String playerId, final LotroGame game, final PhysicalCard self) { - if (PlayConditions.canUseFPCardDuringPhase(game, Phase.SKIRMISH, self) - && PlayConditions.canDiscardFromPlay(self, game, CardType.POSSESSION, Keyword.PIPEWEED) - && PlayConditions.checkPhaseLimit(game, self, 1)) { - final ActivateCardAction action = new ActivateCardAction(self); - action.appendCost( - new IncrementPhaseLimitEffect(self, 1)); - action.appendCost( - new ChooseAndDiscardCardsFromPlayEffect(action, playerId, 1, 1, CardType.POSSESSION, Keyword.PIPEWEED)); - action.appendEffect( - new PlayoutDecisionEffect(playerId, - new ForEachYouSpotDecision(1, "Choose number of pipes you wish to spot", game, Integer.MAX_VALUE, PossessionClass.PIPE) { - @Override - public void decisionMade(String result) throws DecisionResultInvalidException { - int spotCount = getValidatedResult(result); - action.appendEffect( - new ChooseAndAddUntilEOPStrengthBonusEffect(action, self, playerId, spotCount, CardType.COMPANION, - Filters.hasAttached(PossessionClass.PIPE))); - } - })); - return Collections.singletonList(action); - } - return null; - } -} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_098.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_098.java deleted file mode 100644 index bbd6abdd9..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_098.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.gempukku.lotro.cards.set40.gondor; - -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.cardtype.AbstractAttachableFPPossession; -import com.gempukku.lotro.logic.modifiers.CantTakeMoreThanXWoundsModifier; -import com.gempukku.lotro.logic.modifiers.Modifier; - -import java.util.Collections; -import java.util.List; - -/** - * Title: Armor - * Set: Second Edition - * Side: Free - * Culture: Gondor - * Twilight Cost: 1 - * Type: Possession - Armor - * Card Number: 1C98 - * Game Text: Bearer must be a Man. Bearer takes no more than one wound in a skirmish. - */ -public class Card40_098 extends AbstractAttachableFPPossession { - public Card40_098() { - super(1, 0, 0, Culture.GONDOR, PossessionClass.ARMOR, "Armor"); - } - - @Override - public Filterable getValidTargetFilter(String playerId, LotroGame game, PhysicalCard self) { - return Race.MAN; - } - - @Override - public List getInPlayModifiers(LotroGame game, PhysicalCard self) { - return Collections.singletonList( - new CantTakeMoreThanXWoundsModifier(self, Phase.SKIRMISH, 1, Filters.hasAttached(self))); - } -} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_099.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_099.java deleted file mode 100644 index b0f77f811..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_099.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.gempukku.lotro.cards.set40.gondor; - -import com.gempukku.lotro.common.Culture; -import com.gempukku.lotro.common.Keyword; -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 com.gempukku.lotro.logic.actions.PlayEventAction; -import com.gempukku.lotro.logic.cardtype.AbstractEvent; -import com.gempukku.lotro.logic.effects.AddUntilEndOfTurnModifierEffect; -import com.gempukku.lotro.logic.effects.choose.ChooseAndExertCharactersEffect; -import com.gempukku.lotro.logic.modifiers.AddNoTwilightForCompanionMoveModifier; - -/** - * Title: Avoid Being Seen - * Set: Second Edition - * Side: Free - * Culture: Gondor - * Twilight Cost: 0 - * Type: Event - Fellowship - * Card Number: 1R99 - * Game Text: To play, exert X Rangers. Until the end of turn, add no twilight for each exerted Ranger when the fellowship moves. - */ -public class Card40_099 extends AbstractEvent { - public Card40_099() { - super(Side.FREE_PEOPLE, 0, Culture.GONDOR, "Avoid Being Seen", Phase.FELLOWSHIP); - } - - @Override - public PlayEventAction getPlayEventCardAction(String playerId, LotroGame game, final PhysicalCard self) { - final PlayEventAction action = new PlayEventAction(self); - action.appendCost( - new ChooseAndExertCharactersEffect(action, playerId, 0, Integer.MAX_VALUE, Filters.character, Keyword.RANGER) { - @Override - protected void forEachCardExertedCallback(PhysicalCard character) { - action.appendEffect( - new AddUntilEndOfTurnModifierEffect( - new AddNoTwilightForCompanionMoveModifier(self, character))); - } - }); - return action; - } -} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_100.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_100.java deleted file mode 100644 index 22d5b1956..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_100.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.gempukku.lotro.cards.set40.gondor; - -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.cardtype.AbstractAttachableFPPossession; -import com.gempukku.lotro.logic.effects.ChooseAndWoundCharactersEffect; -import com.gempukku.lotro.logic.effects.choose.ChooseAndExertCharactersEffect; -import com.gempukku.lotro.logic.modifiers.KeywordModifier; -import com.gempukku.lotro.logic.modifiers.Modifier; -import com.gempukku.lotro.logic.timing.PlayConditions; - -import java.util.Collections; -import java.util.List; - -/** - * Title: *Blade of Gondor, Weapon of Honor - * Set: Second Edition - * Side: Free - * Culture: Gondor - * Twilight Cost: 1 - * Type: Possession - Hand Weapon - * Strength: +2 - * Card Number: 1R100 - * Game Text: Bearer must be Boromir. He is damage +1. - * Skirmish: Exert Boromir to wound an Orc or Uruk-hai skirmishing another unbound companion. - */ -public class Card40_100 extends AbstractAttachableFPPossession { - public Card40_100() { - super(1, 2, 0, Culture.GONDOR, PossessionClass.HAND_WEAPON, "Blade of Gondor", "Weapon of Honor", true); - } - - @Override - public Filterable getValidTargetFilter(String playerId, LotroGame game, PhysicalCard self) { - return Filters.boromir; - } - - @Override - public List getInPlayModifiers(LotroGame game, PhysicalCard self) { - KeywordModifier modifier = new KeywordModifier(self, Filters.hasAttached(self), Keyword.DAMAGE, 1); - return Collections.singletonList(modifier); - } - - @Override - public List getPhaseActionsInPlay(String playerId, LotroGame game, PhysicalCard self) { - if (PlayConditions.canUseFPCardDuringPhase(game, Phase.SKIRMISH, self) - && PlayConditions.canExert(self, game, Filters.boromir)) { - ActivateCardAction action = new ActivateCardAction(self); - action.appendCost( - new ChooseAndExertCharactersEffect(action, playerId, 1, 1, Filters.boromir)); - action.appendEffect( - new ChooseAndWoundCharactersEffect(action, playerId, 1, 1, - Filters.or(Race.ORC, Race.URUK_HAI), Filters.inSkirmishAgainst(Filters.not(Filters.hasAttached(self)), Filters.unboundCompanion))); - return Collections.singletonList(action); - } - return null; - } -} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_101.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_101.java deleted file mode 100644 index 4c17a5f5e..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_101.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.gempukku.lotro.cards.set40.gondor; - -import com.gempukku.lotro.common.Culture; -import com.gempukku.lotro.common.Keyword; -import com.gempukku.lotro.common.Race; -import com.gempukku.lotro.filters.Filters; -import com.gempukku.lotro.game.PhysicalCard; -import com.gempukku.lotro.game.state.LotroGame; -import com.gempukku.lotro.logic.cardtype.AbstractCompanion; -import com.gempukku.lotro.logic.modifiers.Modifier; -import com.gempukku.lotro.logic.modifiers.StrengthModifier; -import com.gempukku.lotro.logic.modifiers.evaluator.Evaluator; - -import java.util.Collections; -import java.util.List; - -/** - * Title: *Boromir, Champion of Minas Tirith - * Set: Second Edition - * Side: Free - * Culture: Gondor - * Twilight Cost: 3 - * Type: Companion - Man - * Strength: 7 - * Vitality: 3 - * Resistance: 6 - * Card Number: 1R101 - * Game Text: Ranger. Boromir is strength +1 for each wound on each character in his skirmish. - */ -public class Card40_101 extends AbstractCompanion { - public Card40_101() { - super(3, 7, 3, 6, Culture.GONDOR, Race.MAN, null, "Boromir", - "Champion of Minas Tirith", true); - addKeyword(Keyword.RANGER); - } - - @Override - public List getInPlayModifiers(LotroGame game, PhysicalCard self) { - StrengthModifier modifier = new StrengthModifier( - self, self, null, - new Evaluator() { - @Override - public int evaluateExpression(LotroGame game, PhysicalCard cardAffected) { - int woundCount = 0; - for (PhysicalCard physicalCard : Filters.filterActive(game, Filters.character, Filters.inSkirmish, Filters.wounded)) { - woundCount += game.getGameState().getWounds(physicalCard); - } - return woundCount; - } - }); - return Collections.singletonList(modifier); - } -} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_102.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_102.java deleted file mode 100644 index ee475b246..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_102.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.gempukku.lotro.cards.set40.gondor; - -import com.gempukku.lotro.common.Culture; -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.ActivateCardAction; -import com.gempukku.lotro.logic.cardtype.AbstractCompanion; -import com.gempukku.lotro.logic.effects.SelfExertEffect; -import com.gempukku.lotro.logic.effects.choose.ChooseAndAddUntilEOPStrengthBonusEffect; -import com.gempukku.lotro.logic.timing.PlayConditions; - -import java.util.Collections; -import java.util.List; - -/** - * Title: *Boromir, Son of Denethor - * Set: Second Edition - * Side: Free - * Culture: Gondor - * Twilight Cost: 3 - * Type: Companion - Man - * Strength: 7 - * Vitality: 3 - * Resistance: 6 - * Card Number: 1U102 - * Game Text: Skirmish: Exert Boromir to make a Hobbit strength +3. - */ -public class Card40_102 extends AbstractCompanion { - public Card40_102() { - super(3, 7, 3, 6, Culture.GONDOR, Race.MAN, null, "Boromir", "Son of Denethor", true); - } - - @Override - public List getPhaseActionsInPlay(String playerId, LotroGame game, final PhysicalCard self) { - if (PlayConditions.canUseFPCardDuringPhase(game, Phase.SKIRMISH, self) - && PlayConditions.canExert(self, game, self)) { - final ActivateCardAction action = new ActivateCardAction(self); - action.appendCost(new SelfExertEffect(action, self)); - action.appendEffect( - new ChooseAndAddUntilEOPStrengthBonusEffect(action, self, playerId, 3, Race.HOBBIT)); - return Collections.singletonList(action); - } - return null; - } -} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_103.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_103.java deleted file mode 100644 index 163ea49c4..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_103.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.gempukku.lotro.cards.set40.gondor; - -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.GameUtils; -import com.gempukku.lotro.logic.actions.ActivateCardAction; -import com.gempukku.lotro.logic.actions.CostToEffectAction; -import com.gempukku.lotro.logic.cardtype.AbstractAttachableFPPossession; -import com.gempukku.lotro.logic.effects.CancelSkirmishEffect; -import com.gempukku.lotro.logic.effects.PreventableEffect; -import com.gempukku.lotro.logic.effects.RemoveTwilightEffect; -import com.gempukku.lotro.logic.effects.choose.ChooseAndExertCharactersEffect; -import com.gempukku.lotro.logic.timing.Effect; -import com.gempukku.lotro.logic.timing.PlayConditions; - -import java.util.Collections; -import java.util.List; - -/** - * Title: *Boromir's Gauntlets - * Set: Second Edition - * Side: Free - * Culture: Gondor - * Twilight Cost: 1 - * Type: Possession - Gauntlets - * Card Number: 1C103 - * Game Text: Bearer must be a [GONDOR] Man. - * Skirmish: Exert bearer to cancel a skirmish involving bearer. The Shadow player may remove (1) to prevent this. - */ -public class Card40_103 extends AbstractAttachableFPPossession { - public Card40_103() { - super(1, 0, 0, Culture.GONDOR, PossessionClass.GAUNTLETS, "Boromir's Gauntlets", null, true); - } - - @Override - public Filterable getValidTargetFilter(String playerId, LotroGame game, PhysicalCard self) { - return Filters.and(Culture.GONDOR, Race.MAN); - } - - @Override - public List getPhaseActionsInPlay(String playerId, LotroGame game, PhysicalCard self) { - if (PlayConditions.canUseFPCardDuringPhase(game, Phase.SKIRMISH, self) - && PlayConditions.canExert(self, game, Filters.hasAttached(self))) { - ActivateCardAction action = new ActivateCardAction(self); - action.appendCost( - new ChooseAndExertCharactersEffect(action, playerId, 1, 1, Filters.hasAttached(self))); - action.appendEffect( - new PreventableEffect(action, - new CancelSkirmishEffect(Filters.hasAttached(self)), - GameUtils.getShadowPlayers(game), - new PreventableEffect.PreventionCost() { - @Override - public Effect createPreventionCostForPlayer(CostToEffectAction subAction, String playerId) { - return new RemoveTwilightEffect(1); - } - })); - return Collections.singletonList(action); - } - return null; - } -} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_104.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_104.java deleted file mode 100644 index f8138976a..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/gondor/Card40_104.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.gempukku.lotro.cards.set40.gondor; - -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.cardtype.AbstractAttachableFPPossession; -import com.gempukku.lotro.logic.effects.SelfDiscardEffect; -import com.gempukku.lotro.logic.effects.choose.ChooseAndDiscardCardsFromPlayEffect; -import com.gempukku.lotro.logic.modifiers.ArcheryTotalModifier; -import com.gempukku.lotro.logic.modifiers.Modifier; -import com.gempukku.lotro.logic.timing.PlayConditions; - -import java.util.Collections; -import java.util.List; - -/** - * Title: *Boromir's Shield - * Set: Second Edition - * Side: Free - * Culture: Gondor - * Twilight Cost: 1 - * Type: Possession - Shield - * Card Number: 1U104 - * Game Text: Bearer must be a [GONDOR] Man. The minion archery total is -1. - * Regroup: If bearer is Boromir, discard this possession to discard a Shadow possession. - */ -public class Card40_104 extends AbstractAttachableFPPossession { - public Card40_104() { - super(1, 0, 0, Culture.GONDOR, PossessionClass.SHIELD, "Boromir's Shield", null, true); - } - - @Override - public Filterable getValidTargetFilter(String playerId, LotroGame game, PhysicalCard self) { - return Filters.and(Culture.GONDOR, Race.MAN); - } - - @Override - public List getInPlayModifiers(LotroGame game, PhysicalCard self) { - ArcheryTotalModifier modifier = new ArcheryTotalModifier(self, Side.SHADOW, -1); - return Collections.singletonList(modifier); - } - - @Override - public List getPhaseActionsInPlay(String playerId, LotroGame game, PhysicalCard self) { - if (PlayConditions.canUseFPCardDuringPhase(game, Phase.REGROUP, self) - && PlayConditions.canSpot(game, Filters.hasAttached(self), Filters.boromir) - && PlayConditions.canSelfDiscard(self, game)) { - ActivateCardAction action = new ActivateCardAction(self); - action.appendCost( - new SelfDiscardEffect(self)); - action.appendEffect( - new ChooseAndDiscardCardsFromPlayEffect(action, playerId, 1, 1, Side.SHADOW, CardType.POSSESSION)); - return Collections.singletonList(action); - } - return null; - } -} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/ValueResolver.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/ValueResolver.java index 5c96c684b..67ad753e6 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/ValueResolver.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/ValueResolver.java @@ -67,6 +67,16 @@ public class ValueResolver { final int count = actionContext.getCardsFromMemory(memory).size(); return new ConstantEvaluator(count); }; + } else if (type.equalsIgnoreCase("forEachWound")) { + final String filter = FieldUtils.getString(object.get("filter"), "filter"); + final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(filter, environment); + return (actionContext) -> (Evaluator) (game, cardAffected) -> { + int wounds = 0; + for (PhysicalCard physicalCard : Filters.filterActive(actionContext.getGame(), filterableSource.getFilterable(actionContext))) { + wounds += actionContext.getGame().getGameState().getWounds(physicalCard); + } + return wounds; + }; } else if (type.equalsIgnoreCase("forEachKeywordOnCardInMemory")) { final String memory = FieldUtils.getString(object.get("memory"), "memory"); final Keyword keyword = FieldUtils.getEnum(Keyword.class, object.get("keyword"), "keyword"); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/AddNoTwilightForCompanionMove.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/AddNoTwilightForCompanionMove.java new file mode 100644 index 000000000..157078bb5 --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/AddNoTwilightForCompanionMove.java @@ -0,0 +1,22 @@ +package com.gempukku.lotro.cards.build.field.effect.modifier; + +import com.gempukku.lotro.cards.build.CardGenerationEnvironment; +import com.gempukku.lotro.cards.build.FilterableSource; +import com.gempukku.lotro.cards.build.InvalidCardDefinitionException; +import com.gempukku.lotro.cards.build.ModifierSource; +import com.gempukku.lotro.cards.build.field.FieldUtils; +import com.gempukku.lotro.logic.modifiers.AddNoTwilightForCompanionMoveModifier; +import org.json.simple.JSONObject; + +public class AddNoTwilightForCompanionMove implements ModifierSourceProducer { + @Override + public ModifierSource getModifierSource(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + FieldUtils.validateAllowedFields(object, "filter"); + + final String filter = FieldUtils.getString(object.get("filter"), "filter"); + + final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(filter, environment); + + return actionContext -> new AddNoTwilightForCompanionMoveModifier(actionContext.getSource(), filterableSource.getFilterable(actionContext)); + } +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifierSourceFactory.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifierSourceFactory.java index ee51027aa..c58c50e58 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifierSourceFactory.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifierSourceFactory.java @@ -22,6 +22,8 @@ public class ModifierSourceFactory { modifierProducers.put("modifyroamingpenalty", new ModifyRoamingPenalty()); modifierProducers.put("modifystrength", new ModifyStrength()); modifierProducers.put("opponentmaynotdiscard", new OpponentMayNotDiscard()); + modifierProducers.put("addnotwilightforcompanionmove", new AddNoTwilightForCompanionMove()); + modifierProducers.put("modifyarcherytotal", new ModifyArcheryTotal()); } public ModifierSource getModifier(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifyArcheryTotal.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifyArcheryTotal.java new file mode 100644 index 000000000..8f9be6b62 --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifyArcheryTotal.java @@ -0,0 +1,28 @@ +package com.gempukku.lotro.cards.build.field.effect.modifier; + +import com.gempukku.lotro.cards.build.*; +import com.gempukku.lotro.cards.build.field.FieldUtils; +import com.gempukku.lotro.cards.build.field.effect.appender.resolver.ValueResolver; +import com.gempukku.lotro.common.Side; +import com.gempukku.lotro.logic.modifiers.ArcheryTotalModifier; +import com.gempukku.lotro.logic.modifiers.evaluator.Evaluator; +import org.json.simple.JSONObject; + +public class ModifyArcheryTotal implements ModifierSourceProducer { + @Override + public ModifierSource getModifierSource(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + FieldUtils.validateAllowedFields(object, "side", "condition", "amount"); + + final ValueSource valueSource = ValueResolver.resolveEvaluator(object.get("amount"), 1, environment); + final JSONObject[] conditionArray = FieldUtils.getObjectArray(object.get("condition"), "condition"); + final Side side = FieldUtils.getEnum(Side.class, object.get("side"), "side"); + + final Requirement[] requirements = environment.getRequirementFactory().getRequirements(conditionArray, environment); + + return (actionContext) -> { + final Evaluator evaluator = valueSource.getEvaluator(actionContext); + return new ArcheryTotalModifier(actionContext.getSource(), side, + new RequirementCondition(requirements, actionContext), evaluator); + }; + } +}