diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set1/set1-elven.json b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set1/set1-elven.json new file mode 100644 index 000000000..afbc27a20 --- /dev/null +++ b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set1/set1-elven.json @@ -0,0 +1,167 @@ +{ + "1_29": { + "title": "Ancient Enmity", + "culture": "elven", + "cost": 0, + "type": "event", + "keyword": "skirmish", + "effects": { + "type": "event", + "effect": [ + { + "type": "modifyStrength", + "filter": "choose(elf)", + "amount": 1, + "memorize": "chosenElf" + }, + { + "type": "addTrigger", + "trigger": { + "type": "losesSkirmish", + "filter": "minion", + "against": "memory(chosenElf)", + "memorize": "losingMinion" + }, + "effect": { + "type": "discardCardAtRandomFromHand", + "player": "ownerFromMemory(losingMinion)", + "count": 2, + "forced": true + } + } + ] + } + }, + "1_30": { + "title": "*Arwen", + "subtitle": "Daughter of Elrond", + "culture": "elven", + "cost": 2, + "type": "companion", + "race": "elf", + "strength": 6, + "vitality": 3, + "resistance": 6, + "signet": "aragorn", + "keyword": "ranger", + "effects": { + "type": "modifier", + "modifier": { + "type": "modifyStrength", + "amount": 3, + "filter": "self,inSkirmishAgainst(nazgul)" + } + } + }, + "1_38": { + "title": "Double Shot", + "culture": "elven", + "cost": 0, + "type": "event", + "keyword": "archery", + "condition": { + "type": "canSpot", + "filter": "elf,archer,companion" + }, + "effects": { + "type": "event", + "effect": { + "type": "modifyArcheryTotal", + "side": "free people", + "amount": 1 + } + } + }, + "1_48": { + "title": "*Haldir", + "subtitle": "Elf of the Golden Wood", + "culture": "elven", + "cost": 2, + "type": "companion", + "race": "elf", + "strength": 5, + "vitality": 3, + "resistance": 6, + "condition": { + "type": "canSpot", + "filter": "elf" + }, + "effects": { + "type": "modifier", + "modifier": { + "type": "modifyStrength", + "amount": 2, + "condition": { + "type": "location", + "filter": "siteBlock(fellowship),or(siteNumber(6),siteNumber(7),siteNumber(8))" + } + } + } + }, + "1_50": { + "title": "*Legolas", + "subtitle": "Greenleaf", + "culture": "elven", + "cost": 2, + "type": "companion", + "race": "elf", + "strength": 6, + "vitality": 3, + "resistance": 6, + "signet": "frodo", + "keyword": "archer", + "effects": { + "type": "activated", + "phase": "archery", + "cost": { + "type": "exert", + "filter": "self" + }, + "effect": [ + { + "type": "wound", + "filter": "choose(minion)" + }, + { + "type": "doesNotAddToArcheryTotal", + "filter": "self" + } + ] + } + }, + "1_51": { + "title": "*Legolas", + "subtitle": "Prince of Mirkwood", + "culture": "elven", + "cost": 2, + "type": "companion", + "race": "elf", + "strength": 6, + "vitality": 3, + "resistance": 6, + "signet": "gandalf", + "keyword": "archer", + "effects": { + "type": "modifier", + "modifier": { + "type": "modifyStrength", + "filter": "self,inSkirmishAgainst(nazgul)", + "amount": 3 + } + } + }, + "1_53": { + "title": "Lorien Elf", + "culture": "elven", + "cost": 1, + "type": "companion", + "race": "elf", + "strength": 4, + "vitality": 2, + "resistance": 6, + "condition": { + "type": "canSpot", + "filter": "elf" + } + } +} \ No newline at end of file diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set1/set1.json b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set1/set1.json index 60804c262..522561ec3 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set1/set1.json +++ b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set1/set1.json @@ -1,136 +1,4 @@ { - "1_30": { - "title": "*Arwen", - "subtitle": "Daughter of Elrond", - "culture": "elven", - "cost": 2, - "type": "companion", - "race": "elf", - "strength": 6, - "vitality": 3, - "resistance": 6, - "signet": "aragorn", - "keyword": "ranger", - "effects": { - "type": "modifier", - "modifier": { - "type": "modifyStrength", - "amount": 3, - "filter": "self,inSkirmishAgainst(nazgul)" - } - } - }, - "1_38": { - "title": "Double Shot", - "culture": "elven", - "cost": 0, - "type": "event", - "keyword": "archery", - "condition": { - "type": "canSpot", - "filter": "elf,archer,companion" - }, - "effects": { - "type": "event", - "effect": { - "type": "modifyArcheryTotal", - "side": "free people", - "amount": 1 - } - } - }, - "1_48": { - "title": "*Haldir", - "subtitle": "Elf of the Golden Wood", - "culture": "elven", - "cost": 2, - "type": "companion", - "race": "elf", - "strength": 5, - "vitality": 3, - "resistance": 6, - "condition": { - "type": "canSpot", - "filter": "elf" - }, - "effects": { - "type": "modifier", - "modifier": { - "type": "modifyStrength", - "amount": 2, - "condition": { - "type": "location", - "filter": "siteBlock(fellowship),or(siteNumber(6),siteNumber(7),siteNumber(8))" - } - } - } - }, - "1_50": { - "title": "*Legolas", - "subtitle": "Greenleaf", - "culture": "elven", - "cost": 2, - "type": "companion", - "race": "elf", - "strength": 6, - "vitality": 3, - "resistance": 6, - "signet": "frodo", - "keyword": "archer", - "effects": { - "type": "activated", - "phase": "archery", - "cost": { - "type": "exert", - "filter": "self" - }, - "effect": [ - { - "type": "wound", - "filter": "choose(minion)" - }, - { - "type": "doesNotAddToArcheryTotal", - "filter": "self" - } - ] - } - }, - "1_51": { - "title": "*Legolas", - "subtitle": "Prince of Mirkwood", - "culture": "elven", - "cost": 2, - "type": "companion", - "race": "elf", - "strength": 6, - "vitality": 3, - "resistance": 6, - "signet": "gandalf", - "keyword": "archer", - "effects": { - "type": "modifier", - "modifier": { - "type": "modifyStrength", - "filter": "self,inSkirmishAgainst(nazgul)", - "amount": 3 - } - } - }, - "1_53": { - "title": "Lorien Elf", - "culture": "elven", - "cost": 1, - "type": "companion", - "race": "elf", - "strength": 4, - "vitality": 2, - "resistance": 6, - "condition": { - "type": "canSpot", - "filter": "elf" - } - }, "1_94": { "title": "Athelas", "culture": "gondor", diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/DiscardCardAtRandomFromHand.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/DiscardCardAtRandomFromHand.java index 4fda9bb12..a3bdb9254 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/DiscardCardAtRandomFromHand.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/DiscardCardAtRandomFromHand.java @@ -1,35 +1,49 @@ 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.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.PlayerResolver; +import com.gempukku.lotro.cards.build.field.effect.appender.resolver.ValueResolver; import com.gempukku.lotro.game.state.LotroGame; import com.gempukku.lotro.logic.actions.CostToEffectAction; import com.gempukku.lotro.logic.effects.DiscardCardAtRandomFromHandEffect; import com.gempukku.lotro.logic.timing.Effect; import org.json.simple.JSONObject; +import java.util.LinkedList; +import java.util.List; + public class DiscardCardAtRandomFromHand implements EffectAppenderProducer { @Override public EffectAppender createEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { - FieldUtils.validateAllowedFields(effectObject, "forced"); + FieldUtils.validateAllowedFields(effectObject, "player", "count", "forced"); + final String player = FieldUtils.getString(effectObject.get("player"), "player", "you"); + final PlayerSource playerSource = PlayerResolver.resolvePlayer(player, environment); + final ValueSource countSource = ValueResolver.resolveEvaluator(effectObject.get("count"), 1, environment); final boolean forced = FieldUtils.getBoolean(effectObject.get("forced"), "forced"); return new DelayedAppender() { @Override - protected Effect createEffect(boolean cost, CostToEffectAction action, ActionContext actionContext) { - return new DiscardCardAtRandomFromHandEffect(actionContext.getSource(), actionContext.getPerformingPlayer(), forced); + protected List createEffects(boolean cost, CostToEffectAction action, ActionContext actionContext) { + final String playerId = playerSource.getPlayer(actionContext); + final int count = countSource.getEvaluator(actionContext).evaluateExpression(actionContext.getGame(), null); + + List result = new LinkedList<>(); + for (int i = 0; i < count; i++) + result.add(new DiscardCardAtRandomFromHandEffect(actionContext.getSource(), playerId, forced)); + + return result; } @Override public boolean isPlayableInFull(ActionContext actionContext) { final LotroGame game = actionContext.getGame(); - final String playerId = actionContext.getPerformingPlayer(); - return game.getGameState().getHand(playerId).size() >= 1 + final String playerId = playerSource.getPlayer(actionContext); + final int count = countSource.getEvaluator(actionContext).evaluateExpression(game, null); + return game.getGameState().getHand(playerId).size() >= count && (!forced || game.getModifiersQuerying().canDiscardCardsFromHand(game, playerId, actionContext.getSource())); } };