From b8673a43eacd1e7c73ee4369cc5aab5e70b5222c Mon Sep 17 00:00:00 2001 From: "marcin.sciesinski" Date: Sat, 24 Aug 2019 20:06:14 -0700 Subject: [PATCH] Few more migrated cards --- .../src/main/web/cards/set40.json | 61 +++++++++++++++++++ .../build/InvalidCardDefinitionException.java | 4 ++ .../build/field/EffectFieldProcessor.java | 2 + .../field/effect/EffectAppenderFactory.java | 3 + .../field/effect/EventEffectProcessor.java | 17 ++++++ .../field/effect/appender/AddKeyword.java | 54 ++++++++++++++++ .../field/effect/appender/AddStrength.java | 11 ++-- .../effect/appender/DiscardFromPlay.java | 11 ++-- .../appender/DiscardTopCardFromDeck.java | 1 + .../build/field/effect/appender/Exert.java | 11 ++-- .../appender/PreventCardEffectAppender.java | 6 +- .../effect/appender/ReplaceInSkirmish.java | 40 ++++++++++++ .../appender/StackTopCardOfDrawDeck.java | 2 + .../build/field/effect/appender/Wound.java | 46 ++++++++++++++ .../appender/{ => resolver}/CardResolver.java | 11 ++-- .../appender/resolver/CountResolver.java | 50 +++++++++++++++ .../{ => resolver}/PlayerResolver.java | 3 +- .../field/effect/filter/FilterFactory.java | 18 +++--- .../gempukku/lotro/logic/timing/PlayUtil.java | 5 -- 19 files changed, 318 insertions(+), 38 deletions(-) create mode 100644 gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/EventEffectProcessor.java create mode 100644 gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/AddKeyword.java create mode 100644 gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ReplaceInSkirmish.java create mode 100644 gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/Wound.java rename gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/{ => resolver}/CardResolver.java (91%) create mode 100644 gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/CountResolver.java rename gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/{ => resolver}/PlayerResolver.java (94%) delete mode 100644 gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/PlayUtil.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 10a5324c6..a6f7efe5f 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 @@ -43,5 +43,66 @@ } } ] + }, + "40_4": { + "title": "Balin's Revenge", + "side": "free people", + "culture": "dwarven", + "cost": 0, + "type": "event", + "keyword": "skirmish", + "effects": { + "type": "event", + "requirement": { + "type": "canExert", + "filter": "dwarf" + }, + "cost": { + "type": "exert", + "filter": "choose(dwarf)" + }, + "effect": { + "type": "wound", + "count": "0-2", + "filter": "choose(goblin)" + } + } + }, + "40_5": { + "title": "Battle Fever", + "side": "free people", + "culture": "dwarven", + "cost": 2, + "type": "event", + "keyword": "skirmish", + "effects": { + "type": "event", + "requirement": { + "type": "canExert", + "filter": "name(Gimli)" + }, + "cost": { + "type": "exert", + "filter": "choose(name(Gimli))", + "memory": "exertedGimli" + }, + "effect": [ + { + "type": "replaceInSkirmish", + "filter": "unbound,companion", + "with": "memory(exertedGimli)" + }, + { + "type": "addStrength", + "filter": "memory(exertedGimli)", + "amount": 2 + }, + { + "type": "addKeyword", + "filter": "memory(exertedGimli)", + "keyword": "damage+1" + } + ] + } } } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/InvalidCardDefinitionException.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/InvalidCardDefinitionException.java index dabd808d2..4652ae550 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/InvalidCardDefinitionException.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/InvalidCardDefinitionException.java @@ -4,4 +4,8 @@ public class InvalidCardDefinitionException extends Exception { public InvalidCardDefinitionException(String message) { super(message); } + + public InvalidCardDefinitionException(String message, Throwable cause) { + super(message, cause); + } } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/EffectFieldProcessor.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/EffectFieldProcessor.java index 5a019b5b0..c76e37d4d 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/EffectFieldProcessor.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/EffectFieldProcessor.java @@ -6,6 +6,7 @@ import com.gempukku.lotro.cards.build.FieldProcessor; import com.gempukku.lotro.cards.build.InvalidCardDefinitionException; import com.gempukku.lotro.cards.build.field.effect.ActivatedEffectProcessor; import com.gempukku.lotro.cards.build.field.effect.ActivatedTriggerEffectProcessor; +import com.gempukku.lotro.cards.build.field.effect.EventEffectProcessor; import com.gempukku.lotro.cards.build.field.effect.TriggerEffectProcessor; import org.json.simple.JSONObject; @@ -19,6 +20,7 @@ public class EffectFieldProcessor implements FieldProcessor { effectProcessors.put("trigger", new TriggerEffectProcessor()); effectProcessors.put("activatedtrigger", new ActivatedTriggerEffectProcessor()); effectProcessors.put("activated", new ActivatedEffectProcessor()); + effectProcessors.put("event", new EventEffectProcessor()); } @Override 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 1a49a2e84..0999e517d 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 @@ -18,8 +18,11 @@ public class EffectAppenderFactory { effectAppenderProducers.put("preventdiscardfromplay", new PreventCardEffectAppender()); effectAppenderProducers.put("exert", new Exert()); effectAppenderProducers.put("addstrength", new AddStrength()); + effectAppenderProducers.put("addkeyword", new AddStrength()); effectAppenderProducers.put("discardtopcardfromdeck", new DiscardTopCardFromDeck()); effectAppenderProducers.put("addtwilight", new AddTwilight()); + effectAppenderProducers.put("wound", new Wound()); + effectAppenderProducers.put("replaceinskirmish", new ReplaceInSkirmish()); } 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/EventEffectProcessor.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/EventEffectProcessor.java new file mode 100644 index 000000000..6bf7c3b0b --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/EventEffectProcessor.java @@ -0,0 +1,17 @@ +package com.gempukku.lotro.cards.build.field.effect; + +import com.gempukku.lotro.cards.build.BuiltLotroCardBlueprint; +import com.gempukku.lotro.cards.build.CardGenerationEnvironment; +import com.gempukku.lotro.cards.build.InvalidCardDefinitionException; +import com.gempukku.lotro.cards.build.field.EffectProcessor; +import org.json.simple.JSONObject; + +public class EventEffectProcessor implements EffectProcessor { + @Override + public void processEffect(JSONObject value, BuiltLotroCardBlueprint blueprint, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + DefaultActionSource actionSource = new DefaultActionSource(); + EffectUtils.processRequirementsCostsAndEffects(value, environment, actionSource); + + blueprint.setPlayEventAction(actionSource); + } +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/AddKeyword.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/AddKeyword.java new file mode 100644 index 000000000..3da038682 --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/AddKeyword.java @@ -0,0 +1,54 @@ +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.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.cards.build.field.effect.appender.resolver.CountResolver; +import com.gempukku.lotro.common.Keyword; +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.AddUntilEndOfPhaseModifierEffect; +import com.gempukku.lotro.logic.modifiers.KeywordModifier; +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 AddKeyword implements EffectAppenderProducer { + @Override + public EffectAppender createEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + final CountResolver.Count count = CountResolver.resolveCount(effectObject.get("count"), 1); + final String filter = FieldUtils.getString(effectObject.get("filter"), "filter"); + final String memory = FieldUtils.getString(effectObject.get("memory"), "memory", "_temp"); + final String keywordString = FieldUtils.getString(effectObject.get("keyword"), "keyword"); + + final String[] keywordSplit = keywordString.split("\\+"); + Keyword keyword = FieldUtils.getEnum(Keyword.class, keywordSplit[0], "keyword"); + int value = 1; + if (keywordSplit.length == 2) + value = Integer.parseInt(keywordSplit[1]); + final int keywordValue = value; + + MultiEffectAppender result = new MultiEffectAppender(); + + result.addEffectAppender( + CardResolver.resolveCards(filter, count.getMin(), count.getMax(), memory, "Choose cards to add keywork to", environment)); + result.addEffectAppender( + new DelayedAppender() { + @Override + protected Effect createEffect(CostToEffectAction action, String playerId, LotroGame game, PhysicalCard self, EffectResult effectResult, Effect effect) { + final Collection cardsFromMemory = action.getCardsFromMemory(memory); + return new AddUntilEndOfPhaseModifierEffect( + new KeywordModifier(self, Filters.in(cardsFromMemory), keyword, keywordValue)); + } + }); + + return result; + } +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/AddStrength.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/AddStrength.java index 6daf52d44..b73718997 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/AddStrength.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/AddStrength.java @@ -5,6 +5,8 @@ import com.gempukku.lotro.cards.build.InvalidCardDefinitionException; 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.cards.build.field.effect.appender.resolver.CountResolver; import com.gempukku.lotro.filters.Filters; import com.gempukku.lotro.game.PhysicalCard; import com.gempukku.lotro.game.state.LotroGame; @@ -21,20 +23,19 @@ public class AddStrength implements EffectAppenderProducer { @Override public EffectAppender createEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { final int amount = FieldUtils.getInteger(effectObject.get("amount"), "amount"); - final int count = FieldUtils.getInteger(effectObject.get("count"), "count"); + final CountResolver.Count count = CountResolver.resolveCount(effectObject.get("count"), 1); final String filter = FieldUtils.getString(effectObject.get("filter"), "filter"); + final String memory = FieldUtils.getString(effectObject.get("memory"), "memory", "_temp"); MultiEffectAppender result = new MultiEffectAppender(); - String discardMemory = "_temp"; - result.addEffectAppender( - CardResolver.resolveCards(filter, count, discardMemory, "Choose cards to add strength to", environment)); + CardResolver.resolveCards(filter, count.getMin(), count.getMax(), memory, "Choose cards to add strength to", environment)); result.addEffectAppender( new DelayedAppender() { @Override protected Effect createEffect(CostToEffectAction action, String playerId, LotroGame game, PhysicalCard self, EffectResult effectResult, Effect effect) { - final Collection cardsFromMemory = action.getCardsFromMemory(discardMemory); + final Collection cardsFromMemory = action.getCardsFromMemory(memory); return new AddUntilEndOfPhaseModifierEffect( new StrengthModifier(self, Filters.in(cardsFromMemory), amount)); } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/DiscardFromPlay.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/DiscardFromPlay.java index 55cbf2bcc..b7a00fc9f 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/DiscardFromPlay.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/DiscardFromPlay.java @@ -5,6 +5,8 @@ import com.gempukku.lotro.cards.build.InvalidCardDefinitionException; 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.cards.build.field.effect.appender.resolver.CountResolver; import com.gempukku.lotro.filters.Filters; import com.gempukku.lotro.game.PhysicalCard; import com.gempukku.lotro.game.state.LotroGame; @@ -19,22 +21,21 @@ import java.util.Collection; public class DiscardFromPlay implements EffectAppenderProducer { @Override public EffectAppender createEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { - final int count = FieldUtils.getInteger(effectObject.get("count"), "count", 1); + final CountResolver.Count count = CountResolver.resolveCount(effectObject.get("count"), 1); final String filter = FieldUtils.getString(effectObject.get("filter"), "filter"); + final String memory = FieldUtils.getString(effectObject.get("memory"), "memory", "_temp"); MultiEffectAppender result = new MultiEffectAppender(); - String discardMemory = "_temp"; - result.addEffectAppender( CardResolver.resolveCards(filter, (playerId, game, source, effectResult, effect) -> Filters.canBeDiscarded(playerId, source), - count, discardMemory, "Choose cards to discard", environment)); + count.getMin(), count.getMax(), memory, "Choose cards to discard", environment)); result.addEffectAppender( new DelayedAppender() { @Override protected Effect createEffect(CostToEffectAction action, String playerId, LotroGame game, PhysicalCard self, EffectResult effectResult, Effect effect) { - final Collection cardsFromMemory = action.getCardsFromMemory(discardMemory); + final Collection cardsFromMemory = action.getCardsFromMemory(memory); return new DiscardCardsFromPlayEffect(playerId, self, Filters.in(cardsFromMemory)); } }); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/DiscardTopCardFromDeck.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/DiscardTopCardFromDeck.java index a2c4400a3..96d653aae 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/DiscardTopCardFromDeck.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/DiscardTopCardFromDeck.java @@ -5,6 +5,7 @@ import com.gempukku.lotro.cards.build.InvalidCardDefinitionException; 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.PlayerResolver; import com.gempukku.lotro.game.PhysicalCard; import com.gempukku.lotro.game.state.LotroGame; import com.gempukku.lotro.logic.actions.CostToEffectAction; diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/Exert.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/Exert.java index caebe5fab..d6c766412 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/Exert.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/Exert.java @@ -5,6 +5,8 @@ import com.gempukku.lotro.cards.build.InvalidCardDefinitionException; 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.cards.build.field.effect.appender.resolver.CountResolver; import com.gempukku.lotro.filters.Filters; import com.gempukku.lotro.game.PhysicalCard; import com.gempukku.lotro.game.state.LotroGame; @@ -19,23 +21,22 @@ import java.util.Collection; public class Exert implements EffectAppenderProducer { @Override public EffectAppender createEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { - final int count = FieldUtils.getInteger(effectObject.get("count"), "count", 1); + final CountResolver.Count count = CountResolver.resolveCount(effectObject.get("count"), 1); final int times = FieldUtils.getInteger(effectObject.get("times"), "times", 1); final String filter = FieldUtils.getString(effectObject.get("filter"), "filter"); + final String memory = FieldUtils.getString(effectObject.get("memory"), "memory", "_temp"); MultiEffectAppender result = new MultiEffectAppender(); - String discardMemory = "_temp"; - result.addEffectAppender( CardResolver.resolveCards(filter, (playerId, game, source, effectResult, effect) -> Filters.canExert(source, times), - count, discardMemory, "Choose cards to exert", environment)); + count.getMin(), count.getMax(), memory, "Choose cards to exert", environment)); result.addEffectAppender( new DelayedAppender() { @Override protected Effect createEffect(CostToEffectAction action, String playerId, LotroGame game, PhysicalCard self, EffectResult effectResult, Effect effect) { - final Collection cardsFromMemory = action.getCardsFromMemory(discardMemory); + final Collection cardsFromMemory = action.getCardsFromMemory(memory); return new ExertCharactersEffect(action, self, cardsFromMemory.toArray(new PhysicalCard[0])); } }); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PreventCardEffectAppender.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PreventCardEffectAppender.java index b692f6a91..fcdd09609 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PreventCardEffectAppender.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PreventCardEffectAppender.java @@ -5,6 +5,7 @@ import com.gempukku.lotro.cards.build.InvalidCardDefinitionException; 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; @@ -19,17 +20,18 @@ public class PreventCardEffectAppender implements EffectAppenderProducer { @Override public EffectAppender createEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { String filter = FieldUtils.getString(effectObject.get("filter"), "filter"); + final String memory = FieldUtils.getString(effectObject.get("memory"), "memory", "_temp"); MultiEffectAppender result = new MultiEffectAppender(); result.addEffectAppender( CardResolver.resolveCard(filter, (playerId, game, source, effectResult, effect) -> Filters.in(((PreventableCardEffect) effect).getAffectedCardsMinusPrevented(game)), - "_temp", "Choose card to prevent effect on", environment)); + memory, "Choose card to prevent effect on", environment)); result.addEffectAppender( new DelayedAppender() { @Override protected Effect createEffect(CostToEffectAction action, String playerId, LotroGame game, PhysicalCard self, EffectResult effectResult, Effect effect) { - return new PreventCardEffect((PreventableCardEffect) effect, action.getCardFromMemory("_temp")); + return new PreventCardEffect((PreventableCardEffect) effect, action.getCardFromMemory(memory)); } }); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ReplaceInSkirmish.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ReplaceInSkirmish.java new file mode 100644 index 000000000..794e8d656 --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ReplaceInSkirmish.java @@ -0,0 +1,40 @@ +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.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.game.PhysicalCard; +import com.gempukku.lotro.game.state.LotroGame; +import com.gempukku.lotro.logic.actions.CostToEffectAction; +import com.gempukku.lotro.logic.effects.ReplaceInSkirmishEffect; +import com.gempukku.lotro.logic.timing.Effect; +import com.gempukku.lotro.logic.timing.EffectResult; +import org.json.simple.JSONObject; + +public class ReplaceInSkirmish implements EffectAppenderProducer { + @Override + public EffectAppender createEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + final String filter = FieldUtils.getString(effectObject.get("filter"), "filter"); + final String with = FieldUtils.getString(effectObject.get("with"), "with"); + + final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(filter); + + MultiEffectAppender result = new MultiEffectAppender(); + result.addEffectAppender( + CardResolver.resolveCard(with, "_temp", "Choose character to replace with in skirmish", environment)); + result.addEffectAppender( + new DelayedAppender() { + @Override + protected Effect createEffect(CostToEffectAction action, String playerId, LotroGame game, PhysicalCard self, EffectResult effectResult, Effect effect) { + final PhysicalCard card = action.getCardFromMemory("_temp"); + return new ReplaceInSkirmishEffect(card, filterableSource.getFilterable(playerId, game, self, effectResult, effect)); + } + }); + + return result; + } +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/StackTopCardOfDrawDeck.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/StackTopCardOfDrawDeck.java index 754d3bdbd..e9a94c6b0 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/StackTopCardOfDrawDeck.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/StackTopCardOfDrawDeck.java @@ -5,6 +5,8 @@ import com.gempukku.lotro.cards.build.InvalidCardDefinitionException; 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.cards.build.field.effect.appender.resolver.PlayerResolver; import com.gempukku.lotro.game.PhysicalCard; import com.gempukku.lotro.game.state.LotroGame; import com.gempukku.lotro.logic.actions.CostToEffectAction; diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/Wound.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/Wound.java new file mode 100644 index 000000000..53b803f26 --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/Wound.java @@ -0,0 +1,46 @@ +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.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.cards.build.field.effect.appender.resolver.CountResolver; +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.WoundCharactersEffect; +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 Wound implements EffectAppenderProducer { + @Override + public EffectAppender createEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + final CountResolver.Count count = CountResolver.resolveCount(effectObject.get("count"), 1); + final int times = FieldUtils.getInteger(effectObject.get("times"), "times", 1); + final String filter = FieldUtils.getString(effectObject.get("filter"), "filter"); + final String memory = FieldUtils.getString(effectObject.get("memory"), "memory", "_temp"); + + MultiEffectAppender result = new MultiEffectAppender(); + + result.addEffectAppender( + CardResolver.resolveCards(filter, + (playerId, game, source, effectResult, effect) -> Filters.canTakeWounds(source, times), + count.getMin(), count.getMax(), memory, "Choose cards to wound", environment)); + result.addEffectAppender( + new DelayedAppender() { + @Override + protected Effect createEffect(CostToEffectAction action, String playerId, LotroGame game, PhysicalCard self, EffectResult effectResult, Effect effect) { + final Collection cardsFromMemory = action.getCardsFromMemory(memory); + return new WoundCharactersEffect(self, cardsFromMemory.toArray(new PhysicalCard[0])); + } + }); + + return result; + } +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/CardResolver.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/CardResolver.java similarity index 91% rename from gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/CardResolver.java rename to gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/CardResolver.java index 72b79c39e..b150ce642 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/CardResolver.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/CardResolver.java @@ -1,9 +1,10 @@ -package com.gempukku.lotro.cards.build.field.effect.appender; +package com.gempukku.lotro.cards.build.field.effect.appender.resolver; 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.field.effect.EffectAppender; +import com.gempukku.lotro.cards.build.field.effect.appender.AbstractEffectAppender; import com.gempukku.lotro.common.Filterable; import com.gempukku.lotro.filters.Filters; import com.gempukku.lotro.game.PhysicalCard; @@ -70,7 +71,7 @@ public class CardResolver { return resolveCard(type, null, memory, choiceText, environment); } - public static EffectAppender resolveCards(String type, FilterableSource additionalFilter, int count, String memory, String choiceText, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + public static EffectAppender resolveCards(String type, FilterableSource additionalFilter, int min, int max, String memory, String choiceText, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { if (type.equals("self")) { return new AbstractEffectAppender() { @Override @@ -106,7 +107,7 @@ public class CardResolver { Filterable additionalFilterable = Filters.any; if (additionalFilter != null) additionalFilterable = additionalFilter.getFilterable(playerId, game, self, effectResult, effect); - return new ChooseActiveCardsEffect(self, playerId, choiceText, count, count, filterable, additionalFilterable) { + return new ChooseActiveCardsEffect(self, playerId, choiceText, min, max, filterable, additionalFilterable) { @Override protected void cardsSelected(LotroGame game, Collection cards) { action.setCardMemory(memory, cards); @@ -118,7 +119,7 @@ public class CardResolver { throw new RuntimeException("Unable to resolve card resolver of type: " + type); } - public static EffectAppender resolveCards(String type, int count, String memory, String choiceText, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { - return resolveCards(type, null, count, memory, choiceText, environment); + public static EffectAppender resolveCards(String type, int min, int max, String memory, String choiceText, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + return resolveCards(type, null, min, max, memory, choiceText, environment); } } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/CountResolver.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/CountResolver.java new file mode 100644 index 000000000..268df77af --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/CountResolver.java @@ -0,0 +1,50 @@ +package com.gempukku.lotro.cards.build.field.effect.appender.resolver; + +import com.gempukku.lotro.cards.build.InvalidCardDefinitionException; + +public class CountResolver { + public static Count resolveCount(Object value, int defaultValue) throws InvalidCardDefinitionException { + if (value == null) + return new Count(defaultValue, defaultValue); + + try { + if (value instanceof String) { + String stringValue = (String) value; + if (stringValue.contains("-")) { + final String[] split = stringValue.split("-", 2); + final int min = Integer.parseInt(split[0]); + final int max = Integer.parseInt(split[1]); + if (min > max || min < 0 || max < 1) + throw new InvalidCardDefinitionException("Unable to resolve count: " + value); + return new Count(min, max); + } else { + int v = Integer.parseInt(stringValue); + return new Count(v, v); + } + } else if (value instanceof Number) { + return new Count(((Number) value).intValue(), ((Number) value).intValue()); + } + } catch (NumberFormatException exp) { + throw new InvalidCardDefinitionException("Unable to resolve count: " + value, exp); + } + throw new InvalidCardDefinitionException("Unable to resolve count: " + value); + } + + public static class Count { + private int min; + private int max; + + private Count(int min, int max) { + this.min = min; + this.max = max; + } + + public int getMin() { + return min; + } + + public int getMax() { + return max; + } + } +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PlayerResolver.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/PlayerResolver.java similarity index 94% rename from gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PlayerResolver.java rename to gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/PlayerResolver.java index 8b7a8d521..81108c6c8 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PlayerResolver.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/PlayerResolver.java @@ -1,9 +1,10 @@ -package com.gempukku.lotro.cards.build.field.effect.appender; +package com.gempukku.lotro.cards.build.field.effect.appender.resolver; 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.field.effect.EffectAppender; +import com.gempukku.lotro.cards.build.field.effect.appender.AbstractEffectAppender; import com.gempukku.lotro.common.Filterable; import com.gempukku.lotro.filters.Filters; import com.gempukku.lotro.game.PhysicalCard; diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/filter/FilterFactory.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/filter/FilterFactory.java index c687bd370..b8d7f32e1 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/filter/FilterFactory.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/filter/FilterFactory.java @@ -4,10 +4,6 @@ import com.gempukku.lotro.cards.build.FilterableSource; import com.gempukku.lotro.cards.build.InvalidCardDefinitionException; 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.timing.Effect; -import com.gempukku.lotro.logic.timing.EffectResult; import com.gempukku.lotro.logic.timing.results.CharacterLostSkirmishResult; import java.util.HashMap; @@ -34,13 +30,13 @@ public class FilterFactory { simpleFilters.put("self", (playerId, game, source, effectResult, effect) -> source); simpleFilters.put("your", (playerId, game, source, effectResult, effect) -> Filters.owner(source.getOwner())); simpleFilters.put("skirmishloser", - new FilterableSource() { - @Override - public Filterable getFilterable(String playerId, LotroGame game, PhysicalCard source, EffectResult effectResult, Effect effect) { - final CharacterLostSkirmishResult lostSkirmish = (CharacterLostSkirmishResult) effectResult; - return lostSkirmish.getLoser(); - } + (playerId, game, source, effectResult, effect) -> { + final CharacterLostSkirmishResult lostSkirmish = (CharacterLostSkirmishResult) effectResult; + return lostSkirmish.getLoser(); }); + simpleFilters.put("unbound", + (playerId, game, source, effectResult, effect) -> Filters.not(Keyword.RING_BOUND)); + parameterFilters.put("culture", (parameter, filterFactory) -> { final Culture culture = Culture.valueOf(parameter.toUpperCase()); if (culture == null) @@ -53,6 +49,8 @@ public class FilterFactory { final FilterableSource filterableSource = filterFactory.generateFilter(parameter); return (playerId, game, source, effectResult, effect) -> Filters.hasAttached(filterableSource.getFilterable(playerId, game, source, effectResult, effect)); }); + parameterFilters.put("name", + (parameter, filterFactory) -> (playerId, game, source, effectResult, effect) -> Filters.name(parameter)); } private void appendFilter(Filterable value) { diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/PlayUtil.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/PlayUtil.java deleted file mode 100644 index 8fb09aa71..000000000 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/PlayUtil.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.gempukku.lotro.logic.timing; - -public class PlayUtil { - -}