From 132278e3a0b8bbe92bec1863fe9bb31f15911473 Mon Sep 17 00:00:00 2001 From: "marcin.sciesinski" Date: Thu, 29 Aug 2019 20:10:27 -0700 Subject: [PATCH] CantBeExerted --- .../src/main/web/cards/set40.json | 17 +++++++++++ .../lotro/cards/set40/dwarven/Card40_029.java | 2 +- .../build/field/EffectFieldProcessor.java | 1 + .../field/effect/filter/FilterFactory.java | 7 +++++ .../field/effect/modifier/CantBeExerted.java | 30 +++++++++++++++++++ .../logic/modifiers/AbstractModifier.java | 2 +- .../modifiers/CantExertWithCardModifier.java | 4 +-- .../lotro/logic/modifiers/Modifier.java | 2 +- .../lotro/logic/modifiers/ModifiersLogic.java | 8 ++--- .../logic/modifiers/ModifiersQuerying.java | 2 +- 10 files changed, 65 insertions(+), 10 deletions(-) create mode 100644 gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/CantBeExerted.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 b08212856..718632698 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 @@ -840,6 +840,23 @@ } ] }, + "40_29": { + "title": "*Staunch Defenders", + "side": "free people", + "culture": "dwarven", + "cost": 2, + "type": "condition", + "keyword": "support area", + "effects": { + "type": "cantBeExerted", + "condition": { + "type": "canSpot", + "filter": "self,hasStackedCount(3,any)" + }, + "filter": "dwarf", + "by": "side(shadow)" + } + }, "40_184": { "title": "Black Steed", "subtitle": "Bred to Serve", diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/dwarven/Card40_029.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/dwarven/Card40_029.java index d4a62a9ae..3a7754c44 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/dwarven/Card40_029.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/dwarven/Card40_029.java @@ -33,7 +33,7 @@ public class Card40_029 extends AbstractPermanent{ @Override public List getInPlayModifiers(LotroGame game, PhysicalCard self) { CantExertWithCardModifier modifier = new CantExertWithCardModifier( - self, Side.SHADOW, new CardStackedCondition(3, self, Filters.any), Race.DWARF); + self, Race.DWARF, new CardStackedCondition(3, self, Filters.any), Side.SHADOW); return Collections.singletonList(modifier); } } 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 14c9a5520..ddc7988f4 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 @@ -29,6 +29,7 @@ public class EffectFieldProcessor implements FieldProcessor { effectProcessors.put("opponentmaynotdiscard", new OpponentMayNotDiscard()); effectProcessors.put("modifyowncost", new ModifyOwnCost()); effectProcessors.put("canttakemorewoundsthan", new CantTakeMoreWoundsThan()); + effectProcessors.put("cantbeexerted", new CantBeExerted()); } @Override 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 3db85689f..269b0382b 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 @@ -64,6 +64,13 @@ public class FilterFactory { final FilterableSource filterableSource = filterFactory.generateFilter(parameter); return (playerId, game, source, effectResult, effect) -> Filters.hasStacked(filterableSource.getFilterable(playerId, game, source, effectResult, effect)); }); + parameterFilters.put("hasStackedCount", + (parameter, filterFactory) -> { + String[] parameterSplit = parameter.split(",", 2); + int count = Integer.parseInt(parameterSplit[0]); + final FilterableSource filterableSource = filterFactory.generateFilter(parameterSplit[1]); + return (playerId, game, source, effectResult, effect) -> Filters.hasStacked(count, filterableSource.getFilterable(playerId, game, source, effectResult, effect)); + }); parameterFilters.put("attachedTo", (parameter, filterFactory) -> { final FilterableSource filterableSource = filterFactory.generateFilter(parameter); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/CantBeExerted.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/CantBeExerted.java new file mode 100644 index 000000000..114b48ce5 --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/CantBeExerted.java @@ -0,0 +1,30 @@ +package com.gempukku.lotro.cards.build.field.effect.modifier; + +import com.gempukku.lotro.cards.build.*; +import com.gempukku.lotro.cards.build.field.EffectProcessor; +import com.gempukku.lotro.cards.build.field.FieldUtils; +import com.gempukku.lotro.logic.modifiers.CantExertWithCardModifier; +import org.json.simple.JSONObject; + +public class CantBeExerted implements EffectProcessor { + @Override + public void processEffect(JSONObject value, BuiltLotroCardBlueprint blueprint, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + FieldUtils.validateAllowedFields(value, "filter", "condition", "by"); + + final JSONObject[] conditionArray = FieldUtils.getObjectArray(value.get("condition"), "condition"); + final String filter = FieldUtils.getString(value.get("filter"), "filter", "self"); + final String byFilter = FieldUtils.getString(value.get("by"), "by", "any"); + + final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(filter); + final FilterableSource byFilterableSource = environment.getFilterFactory().generateFilter(byFilter); + final Requirement[] requirements = environment.getRequirementFactory().getRequirements(conditionArray, environment); + + blueprint.appendInPlayModifier( + (game, self) -> + new CantExertWithCardModifier(self, + filterableSource.getFilterable(null, game, self, null, null), + new RequirementCondition(requirements, null, self, null, null), + byFilterableSource.getFilterable(null, game, self, null, null))); + + } +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/AbstractModifier.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/AbstractModifier.java index 385decd87..1ef003630 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/AbstractModifier.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/AbstractModifier.java @@ -159,7 +159,7 @@ public abstract class AbstractModifier implements Modifier { } @Override - public boolean canBeExerted(LotroGame game, PhysicalCard exertionSource, PhysicalCard card) { + public boolean canBeExerted(LotroGame game, PhysicalCard exertionSource, PhysicalCard exertedCard) { return true; } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/CantExertWithCardModifier.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/CantExertWithCardModifier.java index 5892cd914..0d75ce5c5 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/CantExertWithCardModifier.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/CantExertWithCardModifier.java @@ -19,8 +19,8 @@ public class CantExertWithCardModifier extends AbstractModifier { } @Override - public boolean canBeExerted(LotroGame game, PhysicalCard source, PhysicalCard card) { - if (_preventExertWithFilter.accepts(game, source)) + public boolean canBeExerted(LotroGame game, PhysicalCard exertionSource, PhysicalCard exertedCard) { + if (_preventExertWithFilter.accepts(game, exertionSource)) return false; return true; } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/Modifier.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/Modifier.java index 41a0e661e..5e998106a 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/Modifier.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/Modifier.java @@ -65,7 +65,7 @@ public interface Modifier { public boolean canTakeArcheryWound(LotroGame game, PhysicalCard physicalCard); - public boolean canBeExerted(LotroGame game, PhysicalCard source, PhysicalCard card); + public boolean canBeExerted(LotroGame game, PhysicalCard exertionSource, PhysicalCard exertedCard); public boolean isAllyParticipateInArcheryFire(LotroGame game, PhysicalCard card); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersLogic.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersLogic.java index b2ba1a6ce..d34e1ae44 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersLogic.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersLogic.java @@ -590,11 +590,11 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying { } @Override - public boolean canBeExerted(LotroGame game, PhysicalCard source, PhysicalCard card) { - LoggingThreadLocal.logMethodStart(card, "canBeExerted"); + public boolean canBeExerted(LotroGame game, PhysicalCard exertionSource, PhysicalCard exertedCard) { + LoggingThreadLocal.logMethodStart(exertedCard, "canBeExerted"); try { - for (Modifier modifier : getModifiersAffectingCard(game, ModifierEffect.WOUND_MODIFIER, card)) { - if (!modifier.canBeExerted(game, source, card)) + for (Modifier modifier : getModifiersAffectingCard(game, ModifierEffect.WOUND_MODIFIER, exertedCard)) { + if (!modifier.canBeExerted(game, exertionSource, exertedCard)) return false; } return true; diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersQuerying.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersQuerying.java index 71cc8a36a..c98f70dd0 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersQuerying.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersQuerying.java @@ -77,7 +77,7 @@ public interface ModifiersQuerying { public boolean canTakeArcheryWound(LotroGame game, PhysicalCard card); - public boolean canBeExerted(LotroGame game, PhysicalCard exertionSource, PhysicalCard card); + public boolean canBeExerted(LotroGame game, PhysicalCard exertionSource, PhysicalCard exertedCard); public boolean canBeHealed(LotroGame game, PhysicalCard card);