diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set40/set40-gandalf.json b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set40/set40-gandalf.json index d7b31317e..d14e21a51 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set40/set40-gandalf.json +++ b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set40/set40-gandalf.json @@ -416,6 +416,111 @@ } ] }, + "40_76": { + "title": "He's Remembered!", + "culture": "gandalf", + "cost": 0, + "type": "event", + "keyword": [ + "regroup", + "spell" + ], + "effects": { + "type": "event", + "cost": { + "type": "exert", + "filter": "choose(name(Gandalf))" + }, + "effect": { + "type": "putCardsFromDiscardIntoHand", + "filter": "choose(culture(Gandalf))" + } + } + }, + "40_77": { + "title": "*I Will Help You Bear This Burden", + "culture": "gandalf", + "cost": 2, + "type": "condition", + "strength": 1, + "resistance": 1, + "keyword": "spell", + "target": "name(Frodo)", + "effects": [ + { + "type": "extraCost", + "cost": { + "type": "exert", + "filter": "choose(name(Gandalf))" + } + }, + { + "type": "activated", + "phase": [ + "fellowship", + "regroup" + ], + "cost": { + "type": "discardFromHand", + "forced": false, + "count": 2, + "filter": "choose(culture(Gandalf))" + }, + "effect": { + "type": "removeBurdens" + } + } + ] + }, + "40_78": { + "title": "Illuminate", + "culture": "gandalf", + "cost": 1, + "type": "event", + "keyword": [ + "maneuver", + "spell" + ], + "condition": { + "type": "canSpot", + "filter": "name(Gandalf)" + }, + "effects": { + "type": "event", + "effect": [ + { + "type": "revealRandomCardsFromHand", + "hand": "shadowPlayer", + "forced": true, + "memorize": "revealedCard" + }, + { + "type": "conditional", + "condition": { + "type": "memoryMatches", + "memory": "revealedCard", + "filter": "side(free people)" + }, + "effect": { + "type": "heal", + "filter": "choose(companion)" + } + }, + { + "type": "conditional", + "condition": { + "type": "memoryMatches", + "memory": "revealedCard", + "filter": "side(shadow)" + }, + "effect": { + "type": "exert", + "filter": "choose(minion)" + } + } + ] + } + }, "40_86": { "title": "Protector of the West", "culture": "gandalf", diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/DefaultActionContext.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/DefaultActionContext.java index cfc31365d..e3ac32fa9 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/DefaultActionContext.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/DefaultActionContext.java @@ -53,8 +53,7 @@ public class DefaultActionContext implements ActionContext { @Override public Collection getCardsFromMemory(String memory) { - final Collection physicalCards = cardMemory.get(memory); - return physicalCards; + return cardMemory.get(memory); } @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 784783a3d..269409727 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 @@ -71,6 +71,7 @@ public class EffectAppenderFactory { effectAppenderProducers.put("sideplayercantplayphaseeventsorusephasespecialabilities", new SidePlayerCantPlayPhaseEventsOrUsePhaseSpecialAbilities()); effectAppenderProducers.put("shadowcanthaveinitiative", new ShadowCantHaveInitiative()); effectAppenderProducers.put("canparticipateinarcheryfireandskirmishes", new CanParticipateInArcheryFireAndSkirmishes()); + effectAppenderProducers.put("revealrandomcardsfromhand", new RevealRandomCardsFromHand()); } public EffectAppender getEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/RevealRandomCardsFromHand.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/RevealRandomCardsFromHand.java new file mode 100644 index 000000000..bb21654d7 --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/RevealRandomCardsFromHand.java @@ -0,0 +1,54 @@ +package com.gempukku.lotro.cards.build.field.effect.appender; + +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.PhysicalCard; +import com.gempukku.lotro.logic.actions.CostToEffectAction; +import com.gempukku.lotro.logic.effects.RevealRandomCardsFromHandEffect; +import com.gempukku.lotro.logic.timing.Effect; +import org.json.simple.JSONObject; + +import java.util.List; + +public class RevealRandomCardsFromHand implements EffectAppenderProducer { + @Override + public EffectAppender createEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + FieldUtils.validateAllowedFields(effectObject, "hand", "forced", "count", "memorize"); + + final String hand = FieldUtils.getString(effectObject.get("hand"), "hand", "you"); + final boolean forced = FieldUtils.getBoolean(effectObject.get("forced"), "forced"); + final String memorized = FieldUtils.getString(effectObject.get("memorize"), "memorize", "_temp"); + + final ValueSource countSource = ValueResolver.resolveEvaluator(effectObject.get("count"), 1, environment); + final PlayerSource handSource = PlayerResolver.resolvePlayer(hand, environment); + + return new DelayedAppender() { + @Override + protected Effect createEffect(boolean cost, CostToEffectAction action, ActionContext actionContext) { + final String handPlayer = handSource.getPlayer(actionContext); + final int count = countSource.getEvaluator(actionContext).evaluateExpression(actionContext.getGame(), null); + + return new RevealRandomCardsFromHandEffect(actionContext.getPerformingPlayer(), handPlayer, actionContext.getSource(), count) { + @Override + protected void cardsRevealed(List revealedCards) { + actionContext.setCardMemory(memorized, revealedCards); + } + }; + } + + @Override + public boolean isPlayableInFull(ActionContext actionContext) { + final String handPlayer = handSource.getPlayer(actionContext); + final int count = countSource.getEvaluator(actionContext).evaluateExpression(actionContext.getGame(), null); + if (actionContext.getGame().getGameState().getHand(handPlayer).size() < count) + return false; + return !forced + || actionContext.getGame().getModifiersQuerying().canLookOrRevealCardsInHand(actionContext.getGame(), handPlayer, actionContext.getPerformingPlayer()); + } + }; + } +} 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 859ca2afc..49f54307b 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 @@ -3,6 +3,7 @@ package com.gempukku.lotro.cards.build.field.effect.filter; import com.gempukku.lotro.cards.build.*; import com.gempukku.lotro.cards.build.field.effect.appender.resolver.ValueResolver; import com.gempukku.lotro.common.*; +import com.gempukku.lotro.filters.Filter; import com.gempukku.lotro.filters.Filters; import com.gempukku.lotro.logic.timing.results.CharacterLostSkirmishResult; @@ -90,7 +91,8 @@ public class FilterFactory { return (actionContext) -> Filters.attachedTo(filterableSource.getFilterable(actionContext)); }); parameterFilters.put("name", - (parameter, environment) -> (actionContext) -> Filters.name(parameter)); + (parameter, environment) -> (actionContext) -> (Filter) + (game, physicalCard) -> physicalCard.getBlueprint().getTitle().equalsIgnoreCase(parameter)); parameterFilters.put("inSkirmishAgainst", (parameter, environment) -> { final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(parameter, environment);