From b81748271f59a4b03213732103a8f48fd9bc0080 Mon Sep 17 00:00:00 2001 From: "marcin.sciesinski" Date: Wed, 28 Aug 2019 14:25:19 -0700 Subject: [PATCH] Few extra cards --- .../src/main/web/cards/set40.json | 84 +++++++++++++++++++ .../field/effect/EffectAppenderFactory.java | 2 + .../build/field/effect/appender/Memorize.java | 51 +++++++++++ .../field/effect/appender/PreventWound.java | 61 ++++++++++++++ 4 files changed, 198 insertions(+) create mode 100644 gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/Memorize.java create mode 100644 gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PreventWound.java diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set40.json b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set40.json index 9153df320..36936777a 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set40.json +++ b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set40.json @@ -295,6 +295,90 @@ } } }, + "40_9": { + "title": "Dwarf Soldier", + "side": "free people", + "culture": "dwarven", + "cost": 2, + "type": "companion", + "race": "dwarf", + "strength": 5, + "vitality": 3, + "resistance": 6, + "keyword": "damage+1", + "effects": { + "type": "activated", + "phase": "skirmish", + "cost": { + "type": "discardStackedCards", + "count": 1, + "on": "culture(dwarven),condition" + }, + "effect": { + "type": "modifyStrength", + "filter": "self", + "amount": 1 + } + } + }, + "40_10": { + "title": "Dwarven Battle Axe", + "side": "free people", + "type": "possession", + "possession": "hand weapon", + "cost": 0, + "strength": 1, + "vitality": 1, + "target": "dwarf", + "effects": { + "type": "trigger", + "trigger": { + "type": "winsSkirmish", + "filter": "hasAttached(self)" + }, + "cost": { + "type": "discardStackedCards", + "on": "culture(dwarven),condition", + "count": 1 + }, + "effect": { + "type": "wound", + "filter": "choose(minion)" + } + } + }, + "40_11": { + "title": "Dwarven Bracers", + "side": "free people", + "culture": "dwarven", + "cost": 1, + "type": "possession", + "possession": "bracers", + "strength": 1, + "target": "dwarf", + "effects": { + "type": "activatedTrigger", + "trigger": { + "type": "aboutToTakeWound", + "filter": "hasAttached(self)" + }, + "cost": [ + { + "type": "memorize", + "filter": "hasAttached(self)", + "memory": "bearer" + }, + { + "type": "discard", + "filter": "self" + } + ], + "effect": { + "type": "preventWound", + "filter": "memory(bearer)" + } + } + }, "40_184": { "title": "Black Steed", "subtitle": "Bred to Serve", diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/EffectAppenderFactory.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/EffectAppenderFactory.java index 36235950f..c88aad659 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/EffectAppenderFactory.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/EffectAppenderFactory.java @@ -36,6 +36,8 @@ public class EffectAppenderFactory { effectAppenderProducers.put("discardcardatrandomfromhand", new DiscardCardAtRandomFromHand()); effectAppenderProducers.put("putonring", new PutOnRing()); effectAppenderProducers.put("discardstackedcards", new DiscardStackedCards()); + effectAppenderProducers.put("memorize", new Memorize()); + effectAppenderProducers.put("preventwound", new PreventWound()); } public EffectAppender getEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/Memorize.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/Memorize.java new file mode 100644 index 000000000..24e0344d9 --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/Memorize.java @@ -0,0 +1,51 @@ +package com.gempukku.lotro.cards.build.field.effect.appender; + +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.Requirement; +import com.gempukku.lotro.cards.build.field.FieldUtils; +import com.gempukku.lotro.cards.build.field.effect.EffectAppender; +import com.gempukku.lotro.cards.build.field.effect.EffectAppenderProducer; +import com.gempukku.lotro.common.Filterable; +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.CostToEffectAction; +import com.gempukku.lotro.logic.timing.Effect; +import com.gempukku.lotro.logic.timing.EffectResult; +import com.gempukku.lotro.logic.timing.UnrespondableEffect; +import org.json.simple.JSONObject; + +import java.util.Collection; + +public class Memorize implements EffectAppenderProducer { + @Override + public EffectAppender createEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + FieldUtils.validateAllowedFields(effectObject, "filter", "memory"); + + final String filter = FieldUtils.getString(effectObject.get("filter"), "filter"); + final String memory = FieldUtils.getString(effectObject.get("memory"), "memory"); + + final FilterableSource filterSource = environment.getFilterFactory().generateFilter(filter); + + return new DelayedAppender() { + @Override + protected Effect createEffect(CostToEffectAction action, String playerId, LotroGame game, PhysicalCard self, EffectResult effectResult, Effect effect) { + return new UnrespondableEffect() { + @Override + protected void doPlayEffect(LotroGame game) { + final Filterable filterable = filterSource.getFilterable(playerId, game, self, effectResult, effect); + final Collection physicalCards = Filters.filterActive(game, filterable); + action.setCardMemory(memory, physicalCards); + } + }; + } + }; + } + + @Override + public Requirement createCostRequirement(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + return null; + } +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PreventWound.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PreventWound.java new file mode 100644 index 000000000..99061066a --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PreventWound.java @@ -0,0 +1,61 @@ +package com.gempukku.lotro.cards.build.field.effect.appender; + +import com.gempukku.lotro.cards.build.CardGenerationEnvironment; +import com.gempukku.lotro.cards.build.InvalidCardDefinitionException; +import com.gempukku.lotro.cards.build.Requirement; +import com.gempukku.lotro.cards.build.field.FieldUtils; +import com.gempukku.lotro.cards.build.field.effect.EffectAppender; +import com.gempukku.lotro.cards.build.field.effect.EffectAppenderProducer; +import com.gempukku.lotro.cards.build.field.effect.appender.resolver.CardResolver; +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.CostToEffectAction; +import com.gempukku.lotro.logic.effects.PreventCardEffect; +import com.gempukku.lotro.logic.effects.WoundCharactersEffect; +import com.gempukku.lotro.logic.modifiers.ModifierFlag; +import com.gempukku.lotro.logic.timing.Effect; +import com.gempukku.lotro.logic.timing.EffectResult; +import org.json.simple.JSONObject; + +import java.util.Collection; + +public class PreventWound implements EffectAppenderProducer { + @Override + public EffectAppender createEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + FieldUtils.validateAllowedFields(effectObject, "filter"); + + final String filter = FieldUtils.getString(effectObject.get("filter"), "filter", "all(any)"); + + MultiEffectAppender result = new MultiEffectAppender(); + + result.addEffectAppender( + CardResolver.resolveCards(filter, + (playerId, game, source, effectResult, effect) -> { + final WoundCharactersEffect woundEffect = (WoundCharactersEffect) effect; + return Filters.in(woundEffect.getAffectedCardsMinusPrevented(game)); + }, 1, 1, "_temp", "owner", "Choose characters to prevent wound to", environment)); + result.addEffectAppender( + new DelayedAppender() { + @Override + protected Effect createEffect(CostToEffectAction action, String playerId, LotroGame game, PhysicalCard self, EffectResult effectResult, Effect effect) { + final Collection cards = action.getCardsFromMemory("_temp"); + final WoundCharactersEffect woundEffect = (WoundCharactersEffect) effect; + + return new PreventCardEffect(woundEffect, Filters.in(cards)); + } + + @Override + public boolean isPlayableInFull(String playerId, LotroGame game, PhysicalCard self, EffectResult effectResult, Effect effect) { + return !game.getModifiersQuerying().hasFlagActive(game, ModifierFlag.CANT_PREVENT_WOUNDS); + } + }); + + return result; + } + + @Override + public Requirement createCostRequirement(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + return (playerId, game, self, effectResult, effect) -> !game.getModifiersQuerying().hasFlagActive(game, ModifierFlag.CANT_PREVENT_WOUNDS); + } +}