From 88416afabc716ebba2c1c3ecbd8b0b9c296e5a2d Mon Sep 17 00:00:00 2001 From: "marcin.sciesinski" Date: Sat, 14 Sep 2019 20:22:40 -0700 Subject: [PATCH] Some FotR cards --- .../src/main/web/cards/set1/set1-gandalf.json | 173 ++++++++++++++++++ .../lotro/cards/set1/gandalf/Card1_069.java | 49 ----- .../lotro/cards/set1/gandalf/Card1_070.java | 55 ------ .../lotro/cards/set1/gandalf/Card1_071.java | 43 ----- .../lotro/cards/set1/gandalf/Card1_072.java | 55 ------ .../lotro/cards/set1/gandalf/Card1_073.java | 56 ------ .../effect/appender/PlayCardFromStacked.java | 2 +- .../appender/resolver/ValueResolver.java | 20 ++ 8 files changed, 194 insertions(+), 259 deletions(-) create mode 100644 gemp-lotr/gemp-lotr-async/src/main/web/cards/set1/set1-gandalf.json delete mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/gandalf/Card1_069.java delete mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/gandalf/Card1_070.java delete mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/gandalf/Card1_071.java delete mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/gandalf/Card1_072.java delete mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/gandalf/Card1_073.java diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set1/set1-gandalf.json b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set1/set1-gandalf.json new file mode 100644 index 000000000..47566e3a1 --- /dev/null +++ b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set1/set1-gandalf.json @@ -0,0 +1,173 @@ +{ + "1_69": { + "title": "*Albert Dreary", + "subtitle": "Entertainer From Bree", + "culture": "gandalf", + "cost": 1, + "type": "ally", + "allyHome": "fellowship,1", + "race": "man", + "strength": 3, + "vitality": 3, + "condition": { + "type": "canSpot", + "filter": "name(Gandalf)" + }, + "effects": { + "type": "activated", + "phase": "maneuver", + "cost": { + "type": "exert", + "filter": "self" + }, + "effect": { + "type": "discard", + "filter": "choose(condition,or(culture(isengard),culture(moria)))" + } + } + }, + "1_70": { + "title": "*Barliman Butterbur", + "subtitle": "Prancing Pony Proprietor", + "culture": "gandalf", + "cost": 0, + "type": "ally", + "allyHome": "fellowship,1", + "race": "man", + "strength": 1, + "vitality": 2, + "effects": { + "type": "activated", + "phase": "fellowship", + "cost": { + "type": "exert", + "filter": "self" + }, + "effect": { + "type": "putCardsFromDiscardIntoHand", + "filter": "choose(culture(gandalf),event)" + } + } + }, + "1_71": { + "title": "Durin's Secret", + "culture": "gandalf", + "cost": 2, + "type": "event", + "keyword": "fellowship", + "condition": [ + { + "type": "canSpot", + "filter": "name(Gandalf)" + }, + { + "type": "canSpot", + "filter": "dwarf" + }, + { + "type": "canSpot", + "filter": "elf" + } + ], + "effects": { + "type": "event", + "effect": { + "type": "addModifier", + "modifier": { + "type": "modifyMoveLimit", + "amount": 1 + }, + "until": "endOfTurn" + } + } + }, + "1_72": { + "title": "*Gandalf", + "subtitle": "Friend of the Shirefolk", + "culture": "gandalf", + "cost": 4, + "type": "companion", + "race": "wizard", + "strength": 6, + "vitality": 4, + "resistance": 6, + "signet": "Frodo", + "effects": { + "type": "modifier", + "modifier": { + "type": "modifyStrength", + "filter": "self", + "amount": { + "type": "sum", + "source": [ + { + "type": "condition", + "condition": { + "type": "canSpot", + "filter": "hobbit,companion" + }, + "true": 1, + "false": 0 + }, + { + "type": "condition", + "condition": { + "type": "canSpot", + "filter": "dwarf,companion" + }, + "true": 1, + "false": 0 + }, + { + "type": "condition", + "condition": { + "type": "canSpot", + "filter": "elf,companion" + }, + "true": 1, + "false": 0 + }, + { + "type": "condition", + "condition": { + "type": "canSpot", + "filter": "man,companion" + }, + "true": 1, + "false": 0 + } + ] + } + } + } + }, + "1_73": { + "title": "*Gandalf's Cart", + "culture": "gandalf", + "cost": 1, + "type": "possession", + "keyword": "support area", + "effects": { + "type": "activated", + "phase": "fellowship", + "effect": { + "type": "choice", + "texts": [ + "Stack a Free Peoples artifact (or possession)", + "Play a card stacked here" + ], + "effects": [ + { + "type": "stackCardsFromHand", + "filter": "choose(side(free people),or(artifact,possession))", + "where": "self" + }, + { + "type": "playCardFromStacked", + "on": "self" + } + ] + } + } + } +} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/gandalf/Card1_069.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/gandalf/Card1_069.java deleted file mode 100644 index 6714fbf90..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/gandalf/Card1_069.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.gempukku.lotro.cards.set1.gandalf; - -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.AbstractAlly; -import com.gempukku.lotro.logic.effects.SelfExertEffect; -import com.gempukku.lotro.logic.effects.choose.ChooseAndDiscardCardsFromPlayEffect; -import com.gempukku.lotro.logic.timing.PlayConditions; - -import java.util.Collections; -import java.util.List; - -/** - * Set: The Fellowship of the Ring - * Side: Free - * Culture: Gandalf - * Twilight Cost: 1 - * Type: Ally • Home 1 • Man - * Strength: 3 - * Vitality: 3 - * Site: 1 - * Game Text: To play, spot Gandalf. Maneuver: Exert Albert Dreary to discard a [ISENGARD] or [MORIA] condition. - */ -public class Card1_069 extends AbstractAlly { - public Card1_069() { - super(1, SitesBlock.FELLOWSHIP, 1, 3, 3, Race.MAN, Culture.GANDALF, "Albert Dreary", "Entertainer From Bree", true); - } - - @Override - public boolean checkPlayRequirements(LotroGame game, PhysicalCard self) { - return Filters.canSpot(game, Filters.gandalf); - } - - @Override - public List getPhaseActionsInPlay(String playerId, LotroGame game, final PhysicalCard self) { - if (PlayConditions.canUseFPCardDuringPhase(game, Phase.MANEUVER, self) - && PlayConditions.canExert(self, game, self)) { - final ActivateCardAction action = new ActivateCardAction(self); - action.appendCost(new SelfExertEffect(action, self)); - action.appendEffect( - new ChooseAndDiscardCardsFromPlayEffect(action, playerId, 1, 1, Filters.or(Culture.ISENGARD, Culture.MORIA), CardType.CONDITION)); - return Collections.singletonList(action); - } - return null; - } -} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/gandalf/Card1_070.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/gandalf/Card1_070.java deleted file mode 100644 index 39e8b4dbf..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/gandalf/Card1_070.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.gempukku.lotro.cards.set1.gandalf; - -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.AbstractAlly; -import com.gempukku.lotro.logic.effects.ChooseArbitraryCardsEffect; -import com.gempukku.lotro.logic.effects.PutCardFromDiscardIntoHandEffect; -import com.gempukku.lotro.logic.effects.SelfExertEffect; -import com.gempukku.lotro.logic.timing.PlayConditions; - -import java.util.Collection; -import java.util.Collections; -import java.util.List; - -/** - * Set: The Fellowship of the Ring - * Side: Free - * Culture: Gandalf - * Twilight Cost: 0 - * Type: Ally • Home 1 • Man - * Strength: 1 - * Vitality: 2 - * Site: 1 - * Game Text: Fellowship: Exert Barliman Butterbur to take a [GANDALF] event into hand from your discard pile. - */ -public class Card1_070 extends AbstractAlly { - public Card1_070() { - super(0, SitesBlock.FELLOWSHIP, 1, 1, 2, Race.MAN, Culture.GANDALF, "Barliman Butterbur", "Prancing Pony Proprietor", true); - } - - @Override - public List getPhaseActionsInPlay(String playerId, LotroGame game, PhysicalCard self) { - if (PlayConditions.canUseFPCardDuringPhase(game, Phase.FELLOWSHIP, self) - && PlayConditions.canExert(self, game, self)) { - final ActivateCardAction action = new ActivateCardAction(self); - action.appendCost(new SelfExertEffect(action, self)); - action.appendEffect( - new ChooseArbitraryCardsEffect(playerId, "Choose GANDALF event", game.getGameState().getDiscard(playerId), Filters.and(Culture.GANDALF, CardType.EVENT), 1, 1) { - @Override - protected void cardsSelected(LotroGame game, Collection selectedCards) { - for (PhysicalCard selectedCard : selectedCards) { - action.appendEffect( - new PutCardFromDiscardIntoHandEffect(selectedCard)); - } - } - } - ); - return Collections.singletonList(action); - } - return null; - } -} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/gandalf/Card1_071.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/gandalf/Card1_071.java deleted file mode 100644 index edf93ec78..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/gandalf/Card1_071.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.gempukku.lotro.cards.set1.gandalf; - -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.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.modifiers.MoveLimitModifier; - -/** - * Set: The Fellowship of the Ring - * Side: Free - * Culture: Gandalf - * Twilight Cost: 2 - * Type: Event - * Game Text: Fellowship: Spot Gandalf, a Dwarf, and an Elf to make the move limit for this turn +1. - */ -public class Card1_071 extends AbstractEvent { - public Card1_071() { - super(Side.FREE_PEOPLE, 2, Culture.GANDALF, "Durin's Secret", Phase.FELLOWSHIP); - } - - @Override - public PlayEventAction getPlayEventCardAction(String playerId, LotroGame game, PhysicalCard self) { - PlayEventAction action = new PlayEventAction(self); - action.appendEffect( - new AddUntilEndOfTurnModifierEffect( - new MoveLimitModifier(self, 1))); - return action; - } - - @Override - public boolean checkPlayRequirements(LotroGame game, PhysicalCard self) { - return Filters.canSpot(game, Filters.gandalf) - && Filters.canSpot(game, Race.DWARF) - && Filters.canSpot(game, Race.ELF); - } -} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/gandalf/Card1_072.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/gandalf/Card1_072.java deleted file mode 100644 index 12aaa5bca..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/gandalf/Card1_072.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.gempukku.lotro.cards.set1.gandalf; - -import com.gempukku.lotro.common.CardType; -import com.gempukku.lotro.common.Culture; -import com.gempukku.lotro.common.Race; -import com.gempukku.lotro.common.Signet; -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; - -/** - * Set: The Fellowship of the Ring - * Side: Free - * Culture: Gandalf - * Twilight Cost: 4 - * Type: Companion • Wizard - * Strength: 6 - * Vitality: 4 - * Resistance: 6 - * Signet: Frodo - * Game Text: Gandalf is strength +1 for each of these races you can spot in the fellowship: Hobbit, Dwarf, Elf, and - * Man. - */ -public class Card1_072 extends AbstractCompanion { - public Card1_072() { - super(4, 6, 4, 6, Culture.GANDALF, Race.WIZARD, Signet.FRODO, "Gandalf", "Friend of the Shirefolk", true); - } - - @Override - public List getInPlayModifiers(LotroGame game, PhysicalCard self) { - return Collections.singletonList(new StrengthModifier(self, self, null, - new Evaluator() { - @Override - public int evaluateExpression(LotroGame game, PhysicalCard self) { - int result = 0; - if (Filters.canSpot(game, CardType.COMPANION, Race.HOBBIT)) - result++; - if (Filters.canSpot(game, CardType.COMPANION, Race.DWARF)) - result++; - if (Filters.canSpot(game, CardType.COMPANION, Race.ELF)) - result++; - if (Filters.canSpot(game, CardType.COMPANION, Race.MAN)) - result++; - return result; - } - })); - } -} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/gandalf/Card1_073.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/gandalf/Card1_073.java deleted file mode 100644 index 7d6282bd6..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/gandalf/Card1_073.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.gempukku.lotro.cards.set1.gandalf; - -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 com.gempukku.lotro.logic.actions.ActivateCardAction; -import com.gempukku.lotro.logic.cardtype.AbstractPermanent; -import com.gempukku.lotro.logic.effects.ChoiceEffect; -import com.gempukku.lotro.logic.effects.choose.ChooseAndPlayCardFromStackedEffect; -import com.gempukku.lotro.logic.effects.choose.ChooseAndStackCardsFromHandEffect; -import com.gempukku.lotro.logic.timing.Effect; -import com.gempukku.lotro.logic.timing.PlayConditions; - -import java.util.Collections; -import java.util.LinkedList; -import java.util.List; - -/** - * Set: The Fellowship of the Ring - * Side: Free - * Culture: Gandalf - * Twilight Cost: 1 - * Type: Possession - * Game Text: Plays to your support area. Fellowship: Stack a Free Peoples artifact (or possession) from hand on this - * card, or play a card stacked here as if played from hand. - */ -public class Card1_073 extends AbstractPermanent { - public Card1_073() { - super(Side.FREE_PEOPLE, 1, CardType.POSSESSION, Culture.GANDALF, "Gandalf's Cart", null, true); - } - - @Override - public List getPhaseActionsInPlay(final String playerId, final LotroGame game, final PhysicalCard self) { - if (PlayConditions.canUseFPCardDuringPhase(game, Phase.FELLOWSHIP, self) - && ( - Filters.filter(game.getGameState().getStackedCards(self), game, Filters.playable(game)).size() > 0 - || Filters.filter(game.getGameState().getHand(playerId), game, Side.FREE_PEOPLE, Filters.or(CardType.ARTIFACT, CardType.POSSESSION)).size() > 0)) { - final ActivateCardAction action = new ActivateCardAction(self); - - List possibleChoices = new LinkedList(); - possibleChoices.add( - new ChooseAndStackCardsFromHandEffect(action, playerId, 1, 1, self, Side.FREE_PEOPLE, Filters.or(CardType.ARTIFACT, CardType.POSSESSION))); - possibleChoices.add( - new ChooseAndPlayCardFromStackedEffect(playerId, self, Filters.any)); - action.appendEffect( - new ChoiceEffect(action, playerId, possibleChoices)); - - 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/PlayCardFromStacked.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PlayCardFromStacked.java index 7b5e5a3f2..05dc1ad46 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PlayCardFromStacked.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PlayCardFromStacked.java @@ -26,7 +26,7 @@ public class PlayCardFromStacked implements EffectAppenderProducer { public EffectAppender createEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { FieldUtils.validateAllowedFields(effectObject, "filter", "on", "removedTwilight"); - final String filter = FieldUtils.getString(effectObject.get("filter"), "filter"); + final String filter = FieldUtils.getString(effectObject.get("filter"), "filter", "choose(any)"); final String onFilter = FieldUtils.getString(effectObject.get("on"), "on"); final int removedTwilight = FieldUtils.getInteger(effectObject.get("removedTwilight"), "removedTwilight", 0); 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 fc3d0cf1c..3772d012a 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 @@ -246,6 +246,26 @@ public class ValueResolver { final int second = secondNumber.getEvaluator(actionContext).evaluateExpression(actionContext.getGame(), null); return first - second; }; + } else if (type.equalsIgnoreCase("sum")) { + FieldUtils.validateAllowedFields(object, "source"); + final JSONObject[] sourceArray = FieldUtils.getObjectArray(object.get("source"), "source"); + ValueSource[] sources = new ValueSource[sourceArray.length]; + for (int i = 0; i < sources.length; i++) + sources[i] = ValueResolver.resolveEvaluator(sourceArray[i], 0, environment); + + return actionContext -> { + Evaluator[] evaluators = new Evaluator[sources.length]; + for (int i = 0; i < sources.length; i++) + evaluators[i] = sources[i].getEvaluator(actionContext); + + return (game, cardAffected) -> { + int sum = 0; + for (Evaluator evaluator : evaluators) + sum += evaluator.evaluateExpression(game, cardAffected); + + return sum; + }; + }; } else if (type.equalsIgnoreCase("twilightCostInMemory")) { FieldUtils.validateAllowedFields(object, "multiplier", "memory"); final int multiplier = FieldUtils.getInteger(object.get("multiplier"), "multiplier", 1);