diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set16.json b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set16.json new file mode 100644 index 000000000..17bc5fabc --- /dev/null +++ b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set16.json @@ -0,0 +1,226 @@ +{ + "16_1": { + "title": "*Barrow-wight Stalker", + "culture": "wraith", + "cost": 5, + "type": "minion", + "race": "wraith", + "strength": 11, + "vitality": 4, + "site": 2, + "keyword": "enduring", + "effects": [ + { + "type": "modifier", + "modifier": { + "type": "cantTakeWounds", + "filter": "culture(wraith),wraith", + "condition": { + "type": "not", + "condition": { + "type": "phase", + "phase": "skirmish" + } + } + } + }, + { + "type": "activated", + "phase": "shadow", + "cost": { + "type": "removeBurdens" + }, + "effect": { + "type": "play", + "filter": "choose(culture(wraith),wraith)", + "cost": -2 + } + } + ] + }, + "16_2": { + "title": "Candle Corpses", + "culture": "wraith", + "cost": 3, + "type": "minion", + "race": "wraith", + "strength": 8, + "vitality": 2, + "site": 3, + "keyword": "enduring", + "effects": { + "type": "trigger", + "optional": true, + "trigger": { + "type": "assignedToSkirmish", + "side": "free people", + "filter": "self", + "against": "companion", + "memorizeAgainst": "assignedToCompanion" + }, + "condition": { + "type": "canSpot", + "filter": "another,culture(wraith),wraith" + }, + "cost": { + "type": "removeTwilight", + "amount": 2 + }, + "effect": { + "type": "wound", + "filter": "memory(assignedToCompanion)" + } + } + }, + "16_3": { + "title": "*Covetous Wisp", + "culture": "wraith", + "cost": 2, + "type": "minion", + "race": "wraith", + "strength": 4, + "vitality": 2, + "site": 3, + "keyword": "enduring", + "effects": { + "type": "trigger", + "optional": true, + "trigger": { + "type": "assignedToSkirmish", + "side": "free people", + "filter": "self", + "against": "companion" + }, + "condition": { + "type": "canSpot", + "filter": "another,culture(wraith),wraith" + }, + "cost": { + "type": "removeTwilight", + "amount": 2 + }, + "effect": { + "type": "addBurdens" + } + } + }, + "16_4": { + "title": "Dead Faces", + "culture": "wraith", + "cost": 2, + "type": "minion", + "race": "wraith", + "strength": 4, + "vitality": 2, + "site": 3, + "keyword": "enduring", + "effects": { + "type": "trigger", + "optional": true, + "trigger": { + "type": "assignedToSkirmish", + "side": "free people", + "filter": "self", + "against": "companion" + }, + "condition": { + "type": "canSpot", + "filter": "another,culture(wraith),wraith" + }, + "cost": { + "type": "removeTwilight", + "amount": 2 + }, + "effect": { + "type": "discard", + "filter": "choose(condition)" + } + } + }, + "16_5": { + "title": "*Spirit of Dread", + "culture": "wraith", + "cost": 7, + "type": "minion", + "race": "wraith", + "strength": 14, + "vitality": 3, + "site": 2, + "keyword": "enduring", + "effects": [ + { + "type": "modifier", + "modifier": { + "type": "cantHeal", + "condition": { + "type": "canSpot", + "filter": "another,culture(wraith),wraith" + }, + "filter": "any" + } + }, + { + "type": "modifier", + "modifier": { + "type": "cantRemoveBurdens", + "condition": { + "type": "canSpot", + "filter": "another,culture(wraith),wraith" + }, + "filter": "not(wraith)" + } + }, + { + "type": "activated", + "phase": "skirmish", + "cost": { + "type": "exert", + "filter": "self" + }, + "effect": { + "type": "modifyStrength", + "filter": "choose(another,culture(wraith),wraith)", + "amount": 1 + } + } + ] + }, + "16_6": { + "title": "*Undead of Angmar", + "culture": "wraith", + "cost": 4, + "type": "minion", + "race": "wraith", + "strength": 9, + "vitality": 3, + "site": 2, + "keyword": "enduring", + "effects": [ + { + "type": "modifier", + "modifier": { + "type": "modifyResistance", + "filter": "wounded,companion", + "condition": { + "type": "canSpot", + "filter": "another,culture(wraith),wraith" + }, + "amount": -2 + } + }, + { + "type": "activated", + "phase": "shadow", + "cost": { + "type": "exert", + "filter": "self", + "times": 2 + }, + "effect": { + "type": "playCardFromDrawDeck", + "filter": "choose(culture(wraith),wraith)" + } + } + ] + } +} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set16/wraith/Card16_001.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set16/wraith/Card16_001.java deleted file mode 100644 index 160144fce..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set16/wraith/Card16_001.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.gempukku.lotro.cards.set16.wraith; - -import com.gempukku.lotro.common.Culture; -import com.gempukku.lotro.common.Keyword; -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.RemoveBurdenEffect; -import com.gempukku.lotro.logic.effects.choose.ChooseAndPlayCardFromHandEffect; -import com.gempukku.lotro.logic.modifiers.CantTakeWoundsModifier; -import com.gempukku.lotro.logic.modifiers.Modifier; -import com.gempukku.lotro.logic.modifiers.condition.NotCondition; -import com.gempukku.lotro.logic.modifiers.condition.PhaseCondition; -import com.gempukku.lotro.logic.timing.PlayConditions; - -import java.util.Collections; -import java.util.List; - -/** - * Set: The Wraith Collection - * Side: Shadow - * Culture: Wraith - * Twilight Cost: 5 - * Type: Minion • Wraith - * Strength: 11 - * Vitality: 4 - * Site: 2 - * Game Text: Enduring. Each [WRAITH] Wraith cannot take wounds (except during skirmishes). - * Shadow: Remove a burden to play a [WRAITH] Wraith. That minion's twilight cost is -2. - */ -public class Card16_001 extends AbstractMinion { - public Card16_001() { - super(5, 11, 4, 2, Race.WRAITH, Culture.WRAITH, "Barrow-wight Stalker", null, true); - addKeyword(Keyword.ENDURING); - } - - @Override - public List getInPlayModifiers(LotroGame game, PhysicalCard self) { -return Collections.singletonList(new CantTakeWoundsModifier(self, new NotCondition(new PhaseCondition(Phase.SKIRMISH)), Filters.and(Culture.WRAITH, Race.WRAITH))); -} - - @Override - public List getPhaseActionsInPlay(String playerId, LotroGame game, PhysicalCard self) { - if (PlayConditions.canUseShadowCardDuringPhase(game, Phase.SHADOW, self, 0) - && PlayConditions.canRemoveBurdens(game, self, 1) - && PlayConditions.canPlayFromHand(playerId, game, -2, Culture.WRAITH, Race.WRAITH)) { - ActivateCardAction action = new ActivateCardAction(self); - action.appendCost( - new RemoveBurdenEffect(playerId, self, 1)); - action.appendEffect( - new ChooseAndPlayCardFromHandEffect(playerId, game, -2, Culture.WRAITH, Race.WRAITH)); - return Collections.singletonList(action); - } - return null; - } -} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set16/wraith/Card16_002.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set16/wraith/Card16_002.java deleted file mode 100644 index 9626c10fc..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set16/wraith/Card16_002.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.gempukku.lotro.cards.set16.wraith; - -import com.gempukku.lotro.logic.cardtype.AbstractMinion; -import com.gempukku.lotro.logic.timing.PlayConditions; -import com.gempukku.lotro.logic.timing.TriggerConditions; -import com.gempukku.lotro.logic.effects.RemoveTwilightEffect; -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.OptionalTriggerAction; -import com.gempukku.lotro.logic.effects.WoundCharactersEffect; -import com.gempukku.lotro.logic.timing.EffectResult; -import com.gempukku.lotro.logic.timing.results.AssignAgainstResult; - -import java.util.Collections; -import java.util.List; - -/** - * Set: The Wraith Collection - * Side: Shadow - * Culture: Wraith - * Twilight Cost: 3 - * Type: Minion • Wraith - * Strength: 8 - * Vitality: 2 - * Site: 3 - * Game Text: Enduring. Each time the Free Peoples player assigns this minion to a companion, you may spot another - * [WRAITH] Wraith and remove (2) to wound that companion. - */ -public class Card16_002 extends AbstractMinion { - public Card16_002() { - super(3, 8, 2, 3, Race.WRAITH, Culture.WRAITH, "Candle Corpses"); - addKeyword(Keyword.ENDURING); - } - - @Override - public List getOptionalAfterTriggers(String playerId, LotroGame game, EffectResult effectResult, PhysicalCard self) { - if (TriggerConditions.assignedAgainst(game, effectResult, Side.FREE_PEOPLE, CardType.COMPANION, self) - && PlayConditions.canSpot(game, Filters.not(self), Culture.WRAITH, Race.WRAITH) - && game.getGameState().getTwilightPool() >= 2) { - AssignAgainstResult assignmentResult = (AssignAgainstResult) effectResult; - OptionalTriggerAction action = new OptionalTriggerAction(self); - action.appendCost( - new RemoveTwilightEffect(2)); - action.appendEffect( - new WoundCharactersEffect(self, Filters.in(assignmentResult.getAgainst()))); - return Collections.singletonList(action); - } - return null; - } -} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set16/wraith/Card16_003.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set16/wraith/Card16_003.java deleted file mode 100644 index 10b383f30..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set16/wraith/Card16_003.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.gempukku.lotro.cards.set16.wraith; - -import com.gempukku.lotro.logic.cardtype.AbstractMinion; -import com.gempukku.lotro.logic.timing.PlayConditions; -import com.gempukku.lotro.logic.timing.TriggerConditions; -import com.gempukku.lotro.logic.effects.AddBurdenEffect; -import com.gempukku.lotro.logic.effects.RemoveTwilightEffect; -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.OptionalTriggerAction; -import com.gempukku.lotro.logic.timing.EffectResult; - -import java.util.Collections; -import java.util.List; - -/** - * Set: The Wraith Collection - * Side: Shadow - * Culture: Wraith - * Twilight Cost: 2 - * Type: Minion • Wraith - * Strength: 4 - * Vitality: 2 - * Site: 3 - * Game Text: Enduring. Each time the Free Peoples player assigns Covetous Wisp to a companion, you may spot another - * [WRAITH] Wraith and remove (2) to add a burden. - */ -public class Card16_003 extends AbstractMinion { - public Card16_003() { - super(2, 4, 2, 3, Race.WRAITH, Culture.WRAITH, "Covetous Wisp", null, true); - addKeyword(Keyword.ENDURING); - } - - @Override - public List getOptionalAfterTriggers(String playerId, LotroGame game, EffectResult effectResult, PhysicalCard self) { - if (TriggerConditions.assignedAgainst(game, effectResult, Side.FREE_PEOPLE, CardType.COMPANION, self) - && PlayConditions.canSpot(game, Filters.not(self), Culture.WRAITH, Race.WRAITH) - && game.getGameState().getTwilightPool() >= 2) { - OptionalTriggerAction action = new OptionalTriggerAction(self); - action.appendCost( - new RemoveTwilightEffect(2)); - action.appendEffect( - new AddBurdenEffect(self.getOwner(), self, 1)); - return Collections.singletonList(action); - } - return null; - } -} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set16/wraith/Card16_004.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set16/wraith/Card16_004.java deleted file mode 100644 index 6b7f3486a..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set16/wraith/Card16_004.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.gempukku.lotro.cards.set16.wraith; - -import com.gempukku.lotro.logic.cardtype.AbstractMinion; -import com.gempukku.lotro.logic.timing.PlayConditions; -import com.gempukku.lotro.logic.timing.TriggerConditions; -import com.gempukku.lotro.logic.effects.RemoveTwilightEffect; -import com.gempukku.lotro.logic.effects.choose.ChooseAndDiscardCardsFromPlayEffect; -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.OptionalTriggerAction; -import com.gempukku.lotro.logic.timing.EffectResult; - -import java.util.Collections; -import java.util.List; - -/** - * Set: The Wraith Collection - * Side: Shadow - * Culture: Wraith - * Twilight Cost: 2 - * Type: Minion • Wraith - * Strength: 4 - * Vitality: 2 - * Site: 3 - * Game Text: Enduring. Each time the Free Peoples player assigns this minion to a companion, you may spot another - * [WRAITH] Wraith and remove (2) to discard a condition. - */ -public class Card16_004 extends AbstractMinion { - public Card16_004() { - super(2, 4, 2, 3, Race.WRAITH, Culture.WRAITH, "Dead Faces"); - addKeyword(Keyword.ENDURING); - } - - @Override - public List getOptionalAfterTriggers(String playerId, LotroGame game, EffectResult effectResult, PhysicalCard self) { - if (TriggerConditions.assignedAgainst(game, effectResult, Side.FREE_PEOPLE, CardType.COMPANION, self) - && PlayConditions.canSpot(game, Filters.not(self), Culture.WRAITH, Race.WRAITH) - && game.getGameState().getTwilightPool() >= 2) { - OptionalTriggerAction action = new OptionalTriggerAction(self); - action.appendCost( - new RemoveTwilightEffect(2)); - action.appendEffect( - new ChooseAndDiscardCardsFromPlayEffect(action, playerId, 1, 1, CardType.CONDITION)); - return Collections.singletonList(action); - } - return null; - } -} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set16/wraith/Card16_005.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set16/wraith/Card16_005.java deleted file mode 100644 index cd7f720ff..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set16/wraith/Card16_005.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.gempukku.lotro.cards.set16.wraith; - -import com.gempukku.lotro.common.Culture; -import com.gempukku.lotro.common.Keyword; -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.choose.ChooseAndAddUntilEOPStrengthBonusEffect; -import com.gempukku.lotro.logic.modifiers.CantHealModifier; -import com.gempukku.lotro.logic.modifiers.CantRemoveBurdensModifier; -import com.gempukku.lotro.logic.modifiers.Modifier; -import com.gempukku.lotro.logic.modifiers.SpotCondition; -import com.gempukku.lotro.logic.timing.PlayConditions; - -import java.util.Collections; -import java.util.LinkedList; -import java.util.List; - -/** - * Set: The Wraith Collection - * Side: Shadow - * Culture: Wraith - * Twilight Cost: 7 - * Type: Minion • Wraith - * Strength: 14 - * Vitality: 3 - * Site: 2 - * Game Text: Enduring. While you can spot another [WRAITH] Wraith, wounds cannot be healed and burdens can - * not be removed (except by Wraiths). Skirmish: Exert Spirit of Dread to make another [WRAITH] Wraith strength +1. - */ -public class Card16_005 extends AbstractMinion { - public Card16_005() { - super(7, 14, 3, 2, Race.WRAITH, Culture.WRAITH, "Spirit of Dread", null, true); - addKeyword(Keyword.ENDURING); - } - - @Override - public List getInPlayModifiers(LotroGame game, PhysicalCard self) { - List modifiers = new LinkedList(); - modifiers.add( - new CantHealModifier(self, new SpotCondition(Filters.not(self), Culture.WRAITH, Race.WRAITH), Filters.any)); - modifiers.add( - new CantRemoveBurdensModifier(self, new SpotCondition(Filters.not(self), Culture.WRAITH, Race.WRAITH), Filters.not(Race.WRAITH))); - return modifiers; - } - - @Override - public List getPhaseActionsInPlay(String playerId, LotroGame game, PhysicalCard self) { - if (PlayConditions.canUseShadowCardDuringPhase(game, Phase.SKIRMISH, self, 0) - && PlayConditions.canSelfExert(self, game)) { - ActivateCardAction action = new ActivateCardAction(self); - action.appendCost( - new SelfExertEffect(action, self)); - action.appendEffect( - new ChooseAndAddUntilEOPStrengthBonusEffect( - action, self, playerId, 1, Filters.not(self), Culture.WRAITH, Race.WRAITH)); - return Collections.singletonList(action); - } - return null; - } -} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set16/wraith/Card16_006.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set16/wraith/Card16_006.java deleted file mode 100644 index d284a071b..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set16/wraith/Card16_006.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.gempukku.lotro.cards.set16.wraith; - -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.AbstractMinion; -import com.gempukku.lotro.logic.effects.SelfExertEffect; -import com.gempukku.lotro.logic.effects.choose.ChooseAndPlayCardFromDeckEffect; -import com.gempukku.lotro.logic.modifiers.Modifier; -import com.gempukku.lotro.logic.modifiers.ResistanceModifier; -import com.gempukku.lotro.logic.modifiers.SpotCondition; -import com.gempukku.lotro.logic.timing.PlayConditions; - -import java.util.Collections; -import java.util.List; - -/** - * Set: The Wraith Collection - * Side: Shadow - * Culture: Wraith - * Twilight Cost: 4 - * Type: Minion • Wraith - * Strength: 9 - * Vitality: 3 - * Site: 2 - * Game Text: Enduring. While you can spot another [WRAITH] Wraith, each wounded companion is resistance -2. - * Shadow: Exert Undead of Angmar twice to play a [WRAITH] Wraith from your draw deck, then reshuffle. - */ -public class Card16_006 extends AbstractMinion { - public Card16_006() { - super(4, 9, 3, 2, Race.WRAITH, Culture.WRAITH, "Undead of Angmar", null, true); - addKeyword(Keyword.ENDURING); - } - - @Override - public List getInPlayModifiers(LotroGame game, PhysicalCard self) { -return Collections.singletonList(new ResistanceModifier(self, Filters.and(CardType.COMPANION, Filters.wounded), new SpotCondition(Filters.not(self), Culture.WRAITH, Race.WRAITH), -2)); -} - - @Override - public List getPhaseActionsInPlay(String playerId, LotroGame game, PhysicalCard self) { - if (PlayConditions.canUseShadowCardDuringPhase(game, Phase.SHADOW, self, 0) - && PlayConditions.canSelfExert(self, 2, game)) { - ActivateCardAction action = new ActivateCardAction(self); - action.appendCost( - new SelfExertEffect(action, self)); - action.appendCost( - new SelfExertEffect(action, self)); - action.appendEffect( - new ChooseAndPlayCardFromDeckEffect(playerId, Culture.WRAITH, Race.WRAITH)); - return Collections.singletonList(action); - } - return null; - } -} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/setConfig.json b/gemp-lotr/gemp-lotr-cards/src/main/resources/setConfig.json index 846a60844..2de3f2048 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/setConfig.json +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/setConfig.json @@ -84,7 +84,8 @@ { "setId":"16", "setName":"The Wraith Collection", - "rarityFile":"/set16-rarity.txt" + "rarityFile": "/set16-rarity.txt", + "needsLoading": false }, { "setId":"17", diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PlayCardFromHand.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PlayCardFromHand.java index 846f46629..0929aacc2 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PlayCardFromHand.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PlayCardFromHand.java @@ -1,13 +1,11 @@ package com.gempukku.lotro.cards.build.field.effect.appender; -import com.gempukku.lotro.cards.build.ActionContext; -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.*; 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.ValueResolver; import com.gempukku.lotro.common.Filterable; import com.gempukku.lotro.filters.Filters; import com.gempukku.lotro.game.PhysicalCard; @@ -26,10 +24,11 @@ import java.util.Collection; public class PlayCardFromHand implements EffectAppenderProducer { @Override public EffectAppender createEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { - FieldUtils.validateAllowedFields(effectObject, "filter", "on"); + FieldUtils.validateAllowedFields(effectObject, "filter", "on", "cost"); final String filter = FieldUtils.getString(effectObject.get("filter"), "filter"); final String onFilter = FieldUtils.getString(effectObject.get("on"), "on"); + final ValueSource costModifierSource = ValueResolver.resolveEvaluator(effectObject.get("cost"), 0, environment); final FilterableSource onFilterableSource = (onFilter != null) ? environment.getFilterFactory().generateFilter(onFilter, environment) : null; @@ -39,11 +38,13 @@ public class PlayCardFromHand implements EffectAppenderProducer { result.addEffectAppender( CardResolver.resolveCardsInHand(filter, (actionContext) -> { + final LotroGame game = actionContext.getGame(); + final int costModifier = costModifierSource.getEvaluator(actionContext).evaluateExpression(game, actionContext.getSource()); if (onFilterableSource != null) { final Filterable onFilterable = onFilterableSource.getFilterable(actionContext); - return Filters.and(Filters.playable(actionContext.getGame()), ExtraFilters.attachableTo(actionContext.getGame(), onFilterable)); + return Filters.and(Filters.playable(game, costModifier), ExtraFilters.attachableTo(game, onFilterable)); } - return Filters.playable(actionContext.getGame()); + return Filters.playable(game, costModifier); }, new ConstantEvaluator(1), "_temp", "you", "Choose card to play", environment)); result.addEffectAppender( @@ -52,9 +53,12 @@ public class PlayCardFromHand implements EffectAppenderProducer { protected Effect createEffect(boolean cost, CostToEffectAction action, ActionContext actionContext) { final Collection cardsToPlay = actionContext.getCardsFromMemory("_temp"); if (cardsToPlay.size() == 1) { + final LotroGame game = actionContext.getGame(); + final int costModifier = costModifierSource.getEvaluator(actionContext).evaluateExpression(game, actionContext.getSource()); + Filterable onFilterable = (onFilterableSource != null) ? onFilterableSource.getFilterable(actionContext) : Filters.any; - final CostToEffectAction playCardAction = PlayUtils.getPlayCardAction(actionContext.getGame(), cardsToPlay.iterator().next(), 0, onFilterable, false); + final CostToEffectAction playCardAction = PlayUtils.getPlayCardAction(game, cardsToPlay.iterator().next(), costModifier, onFilterable, false); return new StackActionEffect(playCardAction); } else { return new UnrespondableEffect() { diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/CantHeal.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/CantHeal.java new file mode 100644 index 000000000..0df59b457 --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/CantHeal.java @@ -0,0 +1,25 @@ +package com.gempukku.lotro.cards.build.field.effect.modifier; + +import com.gempukku.lotro.cards.build.*; +import com.gempukku.lotro.cards.build.field.FieldUtils; +import com.gempukku.lotro.logic.modifiers.CantHealModifier; +import org.json.simple.JSONObject; + +public class CantHeal implements ModifierSourceProducer { + @Override + public ModifierSource getModifierSource(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + FieldUtils.validateAllowedFields(object, "filter", "condition"); + + final JSONObject[] conditionArray = FieldUtils.getObjectArray(object.get("condition"), "condition"); + final String filter = FieldUtils.getString(object.get("filter"), "filter", "self"); + + final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(filter, environment); + final Requirement[] requirements = environment.getRequirementFactory().getRequirements(conditionArray, environment); + + return (actionContext) -> { + return new CantHealModifier(actionContext.getSource(), + new RequirementCondition(requirements, actionContext), + filterableSource.getFilterable(actionContext)); + }; + } +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/CantRemoveBurdens.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/CantRemoveBurdens.java new file mode 100644 index 000000000..14c792714 --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/CantRemoveBurdens.java @@ -0,0 +1,25 @@ +package com.gempukku.lotro.cards.build.field.effect.modifier; + +import com.gempukku.lotro.cards.build.*; +import com.gempukku.lotro.cards.build.field.FieldUtils; +import com.gempukku.lotro.logic.modifiers.CantRemoveBurdensModifier; +import org.json.simple.JSONObject; + +public class CantRemoveBurdens implements ModifierSourceProducer { + @Override + public ModifierSource getModifierSource(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + FieldUtils.validateAllowedFields(object, "filter", "condition"); + + final JSONObject[] conditionArray = FieldUtils.getObjectArray(object.get("condition"), "condition"); + final String filter = FieldUtils.getString(object.get("filter"), "filter", "self"); + + final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(filter, environment); + final Requirement[] requirements = environment.getRequirementFactory().getRequirements(conditionArray, environment); + + return (actionContext) -> { + return new CantRemoveBurdensModifier(actionContext.getSource(), + new RequirementCondition(requirements, actionContext), + filterableSource.getFilterable(actionContext)); + }; + } +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifierSourceFactory.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifierSourceFactory.java index 047b99ce6..fee0cd271 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifierSourceFactory.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifierSourceFactory.java @@ -24,6 +24,7 @@ public class ModifierSourceFactory { modifierProducers.put("modifyplayoncost", new ModifyPlayOnCost()); modifierProducers.put("modifyroamingpenalty", new ModifyRoamingPenalty()); modifierProducers.put("modifystrength", new ModifyStrength()); + modifierProducers.put("modifyresistance", new ModifyResistance()); modifierProducers.put("opponentmaynotdiscard", new OpponentMayNotDiscard()); modifierProducers.put("addnotwilightforcompanionmove", new AddNoTwilightForCompanionMove()); modifierProducers.put("modifyarcherytotal", new ModifyArcheryTotal()); @@ -31,6 +32,8 @@ public class ModifierSourceFactory { modifierProducers.put("cantusespecialabilities", new CantUseSpecialAbilities()); modifierProducers.put("skipphase", new SkipPhase()); modifierProducers.put("modifymovelimit", new ModifyMoveLimit()); + modifierProducers.put("cantheal", new CantHeal()); + modifierProducers.put("cantremoveburdens", new CantRemoveBurdens()); } public ModifierSource getModifier(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifyResistance.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifyResistance.java new file mode 100644 index 000000000..715d7a18b --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifyResistance.java @@ -0,0 +1,29 @@ +package com.gempukku.lotro.cards.build.field.effect.modifier; + +import com.gempukku.lotro.cards.build.*; +import com.gempukku.lotro.cards.build.field.FieldUtils; +import com.gempukku.lotro.cards.build.field.effect.appender.resolver.ValueResolver; +import com.gempukku.lotro.logic.modifiers.ResistanceModifier; +import com.gempukku.lotro.logic.modifiers.evaluator.Evaluator; +import org.json.simple.JSONObject; + +public class ModifyResistance implements ModifierSourceProducer { + @Override + public ModifierSource getModifierSource(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + FieldUtils.validateAllowedFields(object, "filter", "condition", "amount"); + + final ValueSource valueSource = ValueResolver.resolveEvaluator(object.get("amount"), 1, environment); + final JSONObject[] conditionArray = FieldUtils.getObjectArray(object.get("condition"), "condition"); + final String filter = FieldUtils.getString(object.get("filter"), "filter", "self"); + + final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(filter, environment); + final Requirement[] requirements = environment.getRequirementFactory().getRequirements(conditionArray, environment); + + return (actionContext) -> { + final Evaluator evaluator = valueSource.getEvaluator(actionContext); + return new ResistanceModifier(actionContext.getSource(), + filterableSource.getFilterable(actionContext), + new RequirementCondition(requirements, actionContext), evaluator); + }; + } +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/AssignedToSkirmish.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/AssignedToSkirmish.java index 70801f27b..20328276f 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/AssignedToSkirmish.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/AssignedToSkirmish.java @@ -6,6 +6,7 @@ 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.common.Filterable; +import com.gempukku.lotro.common.Side; import com.gempukku.lotro.logic.timing.TriggerConditions; import com.gempukku.lotro.logic.timing.results.AssignAgainstResult; import org.json.simple.JSONObject; @@ -13,11 +14,12 @@ import org.json.simple.JSONObject; public class AssignedToSkirmish implements TriggerCheckerProducer { @Override public TriggerChecker getTriggerChecker(JSONObject value, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { - FieldUtils.validateAllowedFields(value, "filter", "against", "memorizeAgainst"); + FieldUtils.validateAllowedFields(value, "filter", "side", "against", "memorizeAgainst"); final String filter = FieldUtils.getString(value.get("filter"), "filter", "any"); final String against = FieldUtils.getString(value.get("against"), "against", "any"); final String memorizeAgainst = FieldUtils.getString(value.get("memorizeAgainst"), "memorizeAgainst"); + final Side side = FieldUtils.getEnum(Side.class, value.get("side"), "side"); final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(filter, environment); final FilterableSource againstSource = environment.getFilterFactory().generateFilter(against, environment); @@ -32,7 +34,7 @@ public class AssignedToSkirmish implements TriggerCheckerProducer { public boolean accepts(ActionContext actionContext) { final Filterable assignedFilterable = filterableSource.getFilterable(actionContext); final Filterable againstFilterable = againstSource.getFilterable(actionContext); - final boolean result = TriggerConditions.assignedAgainst(actionContext.getGame(), actionContext.getEffectResult(), null, + final boolean result = TriggerConditions.assignedAgainst(actionContext.getGame(), actionContext.getEffectResult(), side, againstFilterable, assignedFilterable); if (result && memorizeAgainst!=null) { AssignAgainstResult assignmentResult = (AssignAgainstResult) actionContext.getEffectResult();