From 2d8932bd2b81ba273aeb4d2828ef9484b0c789bc Mon Sep 17 00:00:00 2001 From: "marcin.sciesinski" Date: Wed, 25 Sep 2019 23:41:53 -0700 Subject: [PATCH] Some FotR cards --- .../src/main/web/cards/set1/set1-sauron.json | 144 ++++++++++++++++++ .../lotro/cards/set1/sauron/Card1_263.java | 42 ----- .../lotro/cards/set1/sauron/Card1_264.java | 34 ----- .../lotro/cards/set1/sauron/Card1_265.java | 46 ------ .../lotro/cards/set1/sauron/Card1_266.java | 47 ------ .../lotro/cards/set1/sauron/Card1_267.java | 47 ------ .../lotro/cards/set1/sauron/Card1_268.java | 42 ----- .../appender/resolver/ValueResolver.java | 7 +- .../trigger/PlayedTriggerCheckerProducer.java | 12 +- 9 files changed, 158 insertions(+), 263 deletions(-) delete mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/sauron/Card1_263.java delete mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/sauron/Card1_264.java delete mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/sauron/Card1_265.java delete mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/sauron/Card1_266.java delete mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/sauron/Card1_267.java delete mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/sauron/Card1_268.java diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set1/set1-sauron.json b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set1/set1-sauron.json index fe8011a27..810475512 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set1/set1-sauron.json +++ b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set1/set1-sauron.json @@ -671,5 +671,149 @@ } } ] + }, + "1_263": { + "title": "Orc Banner", + "culture": "sauron", + "cost": 1, + "type": "condition", + "keyword": "support area", + "effects": { + "type": "trigger", + "trigger": { + "type": "losesSkirmish", + "filter": "or(companion,ally)", + "against": "culture(sauron),orc" + }, + "effect": { + "type": "modifyStrength", + "filter": "all(culture(sauron),orc)", + "amount": 1, + "until": "start(regroup)" + } + } + }, + "1_264": { + "title": "Orc Bowmen", + "culture": "sauron", + "cost": 3, + "type": "condition", + "keyword": "support area", + "effects": { + "type": "modifier", + "modifier": { + "type": "modifyArcheryTotal", + "side": "shadow", + "condition": { + "type": "canSpot", + "filter": "culture(sauron),orc" + }, + "amount": 1 + } + } + }, + "1_265": { + "title": "Orc Butchery", + "culture": "sauron", + "cost": 0, + "type": "event", + "keyword": "response", + "condition": { + "type": "canSpot", + "filter": "culture(sauron),orc,inSkirmish" + }, + "effects": { + "type": "responseEvent", + "trigger": { + "type": "killed", + "filter": "companion" + }, + "effect": { + "type": "discardTopCardsFromDeck", + "deck": "fp", + "forced": true, + "count": { + "type": "forEachInDeadPile", + "multiplier": 3 + } + } + } + }, + "1_266": { + "title": "Orc Chieftain", + "culture": "sauron", + "cost": 2, + "type": "minion", + "race": "orc", + "strength": 7, + "vitality": 2, + "site": 6, + "effects": { + "type": "trigger", + "trigger": { + "type": "played", + "filter": "your,weapon", + "on": "self" + }, + "condition": { + "type": "perTurnLimit", + "limit": 1 + }, + "effect": [ + { + "type": "incrementPerTurnLimit", + "limit": 1 + }, + { + "type": "addTwilight", + "amount": 2 + } + ] + } + }, + "1_267": { + "title": "Orc Hunters", + "culture": "sauron", + "cost": 3, + "type": "minion", + "race": "orc", + "strength": 9, + "vitality": 2, + "site": 6, + "effects": { + "type": "activated", + "phase": "skirmish", + "cost": { + "type": "exert", + "filter": "self" + }, + "effect": { + "type": "wound", + "filter": "choose(character,inSkirmishAgainst(self))" + } + } + }, + "1_268": { + "title": "Orc Inquisitor", + "culture": "sauron", + "cost": 3, + "type": "minion", + "race": "orc", + "strength": 9, + "vitality": 3, + "site": 6, + "effects": { + "type": "trigger", + "optional": true, + "trigger": { + "type": "played", + "filter": "self" + }, + "effect": { + "type": "discardCardAtRandomFromHand", + "hand": "fp", + "forced": true + } + } } } \ No newline at end of file diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/sauron/Card1_263.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/sauron/Card1_263.java deleted file mode 100644 index 52b829ebe..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/sauron/Card1_263.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.gempukku.lotro.cards.set1.sauron; - -import com.gempukku.lotro.logic.cardtype.AbstractPermanent; -import com.gempukku.lotro.logic.timing.TriggerConditions; -import com.gempukku.lotro.logic.effects.AddUntilStartOfPhaseModifierEffect; -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.RequiredTriggerAction; -import com.gempukku.lotro.logic.modifiers.StrengthModifier; -import com.gempukku.lotro.logic.timing.EffectResult; - -import java.util.Collections; -import java.util.List; - -/** - * Set: The Fellowship of the Ring - * Side: Shadow - * Culture: Sauron - * Twilight Cost: 1 - * Type: Condition - * Game Text: Plays to your support area. Each time a companion or ally loses a skirmish that involves a [SAURON] Orc, - * each [SAURON] Orc is strength +1 until the regroup phase. - */ -public class Card1_263 extends AbstractPermanent { - public Card1_263() { - super(Side.SHADOW, 1, CardType.CONDITION, Culture.SAURON, "Orc Banner"); - } - - @Override - public List getRequiredAfterTriggers(LotroGame game, EffectResult effectResult, PhysicalCard self) { - if (TriggerConditions.losesSkirmishInvolving(game, effectResult, Filters.or(CardType.ALLY, CardType.COMPANION), Filters.and(Culture.SAURON, Race.ORC))) { - RequiredTriggerAction action = new RequiredTriggerAction(self); - action.appendEffect( - new AddUntilStartOfPhaseModifierEffect( - new StrengthModifier(self, Filters.and(Culture.SAURON, Race.ORC), 1), Phase.REGROUP)); - return Collections.singletonList(action); - } - return null; - } -} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/sauron/Card1_264.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/sauron/Card1_264.java deleted file mode 100644 index 6dc14eceb..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/sauron/Card1_264.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.gempukku.lotro.cards.set1.sauron; - -import com.gempukku.lotro.common.CardType; -import com.gempukku.lotro.common.Culture; -import com.gempukku.lotro.common.Race; -import com.gempukku.lotro.common.Side; -import com.gempukku.lotro.game.PhysicalCard; -import com.gempukku.lotro.game.state.LotroGame; -import com.gempukku.lotro.logic.cardtype.AbstractPermanent; -import com.gempukku.lotro.logic.modifiers.ArcheryTotalModifier; -import com.gempukku.lotro.logic.modifiers.Modifier; -import com.gempukku.lotro.logic.modifiers.SpotCondition; - -import java.util.Collections; -import java.util.List; - -/** - * Set: The Fellowship of the Ring - * Side: Shadow - * Culture: Sauron - * Twilight Cost: 3 - * Type: Condition - * Game Text: Plays to your support area. While you can spot a [SAURON] Orc, add 1 to the minion archery total. - */ -public class Card1_264 extends AbstractPermanent { - public Card1_264() { - super(Side.SHADOW, 3, CardType.CONDITION, Culture.SAURON, "Orc Bowmen"); - } - - @Override - public List getInPlayModifiers(LotroGame game, PhysicalCard self) { -return Collections.singletonList(new ArcheryTotalModifier(self, Side.SHADOW, new SpotCondition(Culture.SAURON, Race.ORC), 1)); -} -} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/sauron/Card1_265.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/sauron/Card1_265.java deleted file mode 100644 index 27b93a47a..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/sauron/Card1_265.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.gempukku.lotro.cards.set1.sauron; - -import com.gempukku.lotro.common.CardType; -import com.gempukku.lotro.common.Culture; -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.PlayUtils; -import com.gempukku.lotro.logic.actions.PlayEventAction; -import com.gempukku.lotro.logic.cardtype.AbstractResponseEvent; -import com.gempukku.lotro.logic.effects.DiscardTopCardFromDeckEffect; -import com.gempukku.lotro.logic.timing.EffectResult; -import com.gempukku.lotro.logic.timing.TriggerConditions; - -import java.util.Collections; -import java.util.List; - -/** - * Set: The Fellowship of the Ring - * Side: Shadow - * Culture: Sauron - * Twilight Cost: 0 - * Type: Event - * Game Text: Response: If a companion is killed by a [SAURON] Orc, the Free Peoples player must discard 3 cards from - * the top of his draw deck for each card in the dead pile. - */ -public class Card1_265 extends AbstractResponseEvent { - public Card1_265() { - super(Side.SHADOW, 0, Culture.SAURON, "Orc Butchery"); - } - - @Override - public List getOptionalInHandAfterActions(String playerId, LotroGame game, EffectResult effectResult, PhysicalCard self) { - if (TriggerConditions.forEachKilledBy(game, effectResult, Filters.and(Culture.SAURON, Race.ORC), CardType.COMPANION) - && PlayUtils.checkPlayRequirements(game, self, Filters.any, 0, 0, false, false)) { - PlayEventAction action = new PlayEventAction(self); - int deadPileCount = game.getGameState().getDeadPile(game.getGameState().getCurrentPlayerId()).size(); - if (deadPileCount > 0) - action.appendEffect(new DiscardTopCardFromDeckEffect(self, game.getGameState().getCurrentPlayerId(), deadPileCount * 3, true)); - return Collections.singletonList(action); - } - return null; - } -} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/sauron/Card1_266.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/sauron/Card1_266.java deleted file mode 100644 index 514141d16..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/sauron/Card1_266.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.gempukku.lotro.cards.set1.sauron; - -import com.gempukku.lotro.logic.cardtype.AbstractMinion; -import com.gempukku.lotro.logic.timing.TriggerConditions; -import com.gempukku.lotro.logic.effects.CheckTurnLimitEffect; -import com.gempukku.lotro.common.Culture; -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.actions.RequiredTriggerAction; -import com.gempukku.lotro.logic.effects.AddTwilightEffect; -import com.gempukku.lotro.logic.timing.EffectResult; - -import java.util.Collections; -import java.util.List; - -/** - * Set: The Fellowship of the Ring - * Side: Shadow - * Culture: Sauron - * Twilight Cost: 2 - * Type: Minion • Orc - * Strength: 7 - * Vitality: 2 - * Site: 6 - * Game Text: When you play a weapon on this minion, add (2) (limit once per turn). - */ -public class Card1_266 extends AbstractMinion { - public Card1_266() { - super(2, 7, 2, 6, Race.ORC, Culture.SAURON, "Orc Chieftain"); - } - - @Override - public List getRequiredAfterTriggers(LotroGame game, EffectResult effectResult, final PhysicalCard self) { - if (TriggerConditions.playedOn(game, effectResult, self, Filters.owner(self.getOwner()), Filters.weapon)) { - RequiredTriggerAction action = new RequiredTriggerAction(self); - action.appendEffect( - new CheckTurnLimitEffect(action, self, 1, - new AddTwilightEffect(self, 2))); - return Collections.singletonList(action); - } - return null; - } - - -} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/sauron/Card1_267.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/sauron/Card1_267.java deleted file mode 100644 index 2e0a3942e..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/sauron/Card1_267.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.gempukku.lotro.cards.set1.sauron; - -import com.gempukku.lotro.common.Culture; -import com.gempukku.lotro.common.Phase; -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.actions.ActivateCardAction; -import com.gempukku.lotro.logic.cardtype.AbstractMinion; -import com.gempukku.lotro.logic.effects.SelfExertEffect; -import com.gempukku.lotro.logic.effects.WoundCharactersEffect; -import com.gempukku.lotro.logic.timing.PlayConditions; - -import java.util.Collections; -import java.util.List; - -/** - * Set: The Fellowship of the Ring - * Side: Shadow - * Culture: Sauron - * Twilight Cost: 3 - * Type: Minion • Orc - * Strength: 9 - * Vitality: 2 - * Site: 6 - * Game Text: Skirmish: Exert this minion to wound a character he is skirmishing. - */ -public class Card1_267 extends AbstractMinion { - public Card1_267() { - super(3, 9, 2, 6, Race.ORC, Culture.SAURON, "Orc Hunters"); - } - - @Override - public List getPhaseActionsInPlay(String playerId, LotroGame game, PhysicalCard self) { - if (PlayConditions.canUseShadowCardDuringPhase(game, Phase.SKIRMISH, self, 0) - && PlayConditions.canExert(self, game, self)) { - ActivateCardAction action = new ActivateCardAction(self); - action.appendCost( - new SelfExertEffect(action, self)); - action.appendEffect( - new WoundCharactersEffect(self, Filters.inSkirmishAgainst(self))); - return Collections.singletonList(action); - } - return null; - } -} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/sauron/Card1_268.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/sauron/Card1_268.java deleted file mode 100644 index 63de1c1f5..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/sauron/Card1_268.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.gempukku.lotro.cards.set1.sauron; - -import com.gempukku.lotro.logic.cardtype.AbstractMinion; -import com.gempukku.lotro.logic.timing.TriggerConditions; -import com.gempukku.lotro.logic.effects.DiscardCardAtRandomFromHandEffect; -import com.gempukku.lotro.common.Culture; -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.OptionalTriggerAction; -import com.gempukku.lotro.logic.timing.EffectResult; - -import java.util.Collections; -import java.util.List; - -/** - * Set: The Fellowship of the Ring - * Side: Shadow - * Culture: Sauron - * Twilight Cost: 3 - * Type: Minion • Orc - * Strength: 9 - * Vitality: 3 - * Site: 6 - * Game Text: When you play this minion, you may make the Free Peoples player discard a card at random from hand. - */ -public class Card1_268 extends AbstractMinion { - public Card1_268() { - super(3, 9, 3, 6, Race.ORC, Culture.SAURON, "Orc Inquisitor"); - } - - @Override - public List getOptionalAfterTriggers(String playerId, LotroGame game, EffectResult effectResult, PhysicalCard self) { - if (TriggerConditions.played(game, effectResult, self)) { - OptionalTriggerAction action = new OptionalTriggerAction(self); - action.appendEffect( - new DiscardCardAtRandomFromHandEffect(self, game.getGameState().getCurrentPlayerId(), true)); - 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 03e706ed3..cc80fffc6 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 @@ -210,11 +210,12 @@ public class ValueResolver { (Evaluator) (game, cardAffected) -> Filters.filter(game.getGameState().getHand(actionContext.getPerformingPlayer()), game, filterableSource.getFilterable(actionContext)).size(); } else if (type.equalsIgnoreCase("forEachInDeadPile")) { - FieldUtils.validateAllowedFields(object, "filter"); - final String filter = FieldUtils.getString(object.get("filter"), "filter"); + FieldUtils.validateAllowedFields(object, "filter", "multiplier"); + final String filter = FieldUtils.getString(object.get("filter"), "filter", "any"); + final int multiplier = FieldUtils.getInteger(object.get("multiplier"), "multiplier", 1); final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(filter, environment); return actionContext -> - (Evaluator) (game, cardAffected) -> Filters.filter(game.getGameState().getDeadPile(actionContext.getPerformingPlayer()), + (Evaluator) (game, cardAffected) -> multiplier * Filters.filter(game.getGameState().getDeadPile(actionContext.getPerformingPlayer()), game, filterableSource.getFilterable(actionContext)).size(); } else if (type.equalsIgnoreCase("fromMemory")) { FieldUtils.validateAllowedFields(object, "memory", "multiplier"); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/PlayedTriggerCheckerProducer.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/PlayedTriggerCheckerProducer.java index ea5a10b1c..a38eb2e35 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/PlayedTriggerCheckerProducer.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/PlayedTriggerCheckerProducer.java @@ -14,16 +14,24 @@ import org.json.simple.JSONObject; public class PlayedTriggerCheckerProducer implements TriggerCheckerProducer { @Override public TriggerChecker getTriggerChecker(JSONObject value, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { - FieldUtils.validateAllowedFields(value, "filter", "memorize"); + FieldUtils.validateAllowedFields(value, "filter", "on", "memorize"); final String filterString = FieldUtils.getString(value.get("filter"), "filter"); + final String onString = FieldUtils.getString(value.get("on"), "on"); final String memorize = FieldUtils.getString(value.get("memorize"), "memorize"); final FilterableSource filter = environment.getFilterFactory().generateFilter(filterString, environment); + final FilterableSource onFilter = (onString != null) ? environment.getFilterFactory().generateFilter(filterString, environment) : null; return new TriggerChecker() { @Override public boolean accepts(ActionContext actionContext) { final Filterable filterable = filter.getFilterable(actionContext); - final boolean played = TriggerConditions.played(actionContext.getGame(), actionContext.getEffectResult(), filterable); + boolean played; + if (onFilter != null) { + final Filterable onFilterable = onFilter.getFilterable(actionContext); + played = TriggerConditions.playedOn(actionContext.getGame(), actionContext.getEffectResult(), onFilterable, filterable); + } else { + played = TriggerConditions.played(actionContext.getGame(), actionContext.getEffectResult(), filterable); + } if (played && memorize != null) { PhysicalCard playedCard = ((PlayCardResult) actionContext.getEffectResult()).getPlayedCard(); actionContext.setCardMemory(memorize, playedCard);