Some FotR cards

This commit is contained in:
marcin.sciesinski
2019-09-13 16:23:53 -07:00
parent ddc470beca
commit 2c28f2d2aa
7 changed files with 243 additions and 12 deletions

View File

@@ -140,6 +140,107 @@
}
}
},
"1_34": {
"title": "*Celeborn",
"subtitle": "Lord of Lorien",
"culture": "elven",
"cost": 2,
"type": "ally",
"allyHome": "fellowship,6",
"race": "elf",
"strength": 6,
"vitality": 3,
"effects": {
"type": "activated",
"phase": "fellowship",
"cost": {
"type": "exert",
"filter": "self"
},
"effect": {
"type": "heal",
"filter": "choose(culture(elven),ally)"
}
}
},
"1_35": {
"title": "The Council of Elrond",
"culture": "elven",
"cost": 2,
"type": "event",
"keyword": "fellowship",
"condition": {
"type": "canSpot",
"filter": "elf"
},
"effects": {
"type": "event",
"effect": {
"type": "playCardFromDrawDeck",
"filter": "choose(tale)"
}
}
},
"1_36": {
"title": "Curse Their Foul Feet!",
"culture": "elven",
"cost": 0,
"type": "event",
"keyword": "fellowship",
"effects": {
"type": "event",
"cost": {
"type": "exert",
"filter": "choose(elf)"
},
"effect": [
{
"type": "revealHand",
"hand": "shadowPlayer",
"memorize": "cardsInHand"
},
{
"type": "filterCardsInMemory",
"memory": "cardsInHand",
"filter": "orc",
"memorizeMatching": "orcsInHand"
},
{
"type": "discardFromHand",
"hand": "shadowPlayer",
"forced": true,
"count": {
"type": "forEachInMemory",
"memory": "orcsInHand"
}
}
]
}
},
"1_37": {
"title": "Defiance",
"culture": "elven",
"cost": 1,
"type": "event",
"keyword": "skirmish",
"effects": {
"type": "event",
"effect": {
"type": "modifyStrength",
"filter": "choose(elf)",
"memorize": "chosenElf",
"amount": {
"type": "condition",
"condition": {
"type": "canSpot",
"filter": "memory(chosenElf),inSkirmishAgainst(nazgul)"
},
"true": 4,
"false": 2
}
}
}
},
"1_38": {
"title": "Double Shot",
"culture": "elven",
@@ -159,6 +260,77 @@
}
}
},
"1_39": {
"title": "Elf-song",
"culture": "elven",
"cost": 1,
"type": "event",
"keyword": "fellowship",
"condition": {
"type": "canSpot",
"filter": "elf"
},
"effects": {
"type": "event",
"effect": {
"type": "removeBurdens"
}
}
},
"1_40": {
"title": "*Elrond",
"subtitle": "Lord of Rivendell",
"culture": "elven",
"cost": 4,
"type": "ally",
"allyHome": "fellowship,3",
"race": "elf",
"strength": 8,
"vitality": 4,
"condition": {
"type": "canSpot",
"filter": "or(name(Gandalf),elf)"
},
"effects": [
{
"type": "trigger",
"trigger": {
"type": "startOfTurn"
},
"effect": {
"type": "heal",
"filter": "all(ally,allyHome(fellowship,3))"
}
},
{
"type": "activated",
"phase": "fellowship",
"cost": {
"type": "exert",
"filter": "self"
},
"effect": {
"type": "drawCards"
}
}
]
},
"1_41": {
"title": "Elven Bow",
"culture": "elven",
"cost": 1,
"type": "possession",
"possession": "ranged weapon",
"target": "elf",
"effects": {
"type": "modifier",
"modifier": {
"type": "addKeyword",
"filter": "bearer",
"keyword": "archer"
}
}
},
"1_48": {
"title": "*Haldir",
"subtitle": "Elf of the Golden Wood",

View File

@@ -649,7 +649,10 @@
"culture": "isengard",
"cost": 0,
"type": "condition",
"keyword": "weather",
"keyword": [
"support area",
"weather"
],
"effects": [
{
"type": "trigger",

View File

@@ -274,7 +274,7 @@
"culture": "isengard",
"cost": 0,
"type": "artifact",
"possession": "palantir",
"keyword": "support area",
"condition": {
"type": "canSpot",
"filter": "culture(isengard),minion"

View File

@@ -828,5 +828,8 @@ public class BuiltLotroCardBlueprint implements LotroCardBlueprint {
if (keywords.size() > 1 && keywords.containsKey(Keyword.TALE))
throw new InvalidCardDefinitionException("Attachment should not have keywords");
}
if (Arrays.asList(CardType.POSSESSION, CardType.CONDITION, CardType.ARTIFACT).contains(cardType)
&& targetFilters == null && (keywords == null || !keywords.containsKey(Keyword.SUPPORT_AREA)))
throw new InvalidCardDefinitionException("Possession, condition or artifact without a filter needs a SUPPORT_AREA keyword");
}
}

View File

@@ -69,7 +69,7 @@ public class EffectAppenderFactory {
effectAppenderProducers.put("preventable", new PreventableAppenderProducer());
effectAppenderProducers.put("cantbeoverwhelmedmultiplier", new CantBeOverwhelmedMultiplier());
effectAppenderProducers.put("cancelskirmish", new CancelSkirmish());
effectAppenderProducers.put("discardfromhand", new DiscardCardsFromHand());
effectAppenderProducers.put("discardfromhand", new DiscardFromHand());
effectAppenderProducers.put("chooseandremovetwilight", new ChooseAndRemoveTwilight());
effectAppenderProducers.put("removetwilight", new RemoveTwilight());
effectAppenderProducers.put("removethreats", new RemoveThreats());
@@ -110,6 +110,7 @@ public class EffectAppenderFactory {
effectAppenderProducers.put("filtercardsinmemory", new FilterCardsInMemory());
effectAppenderProducers.put("discardcardsfromdrawdeck", new DiscardCardsFromDrawDeck());
effectAppenderProducers.put("incrementperturnlimit", new IncrementPerTurnLimit());
effectAppenderProducers.put("revealhand", new RevealHand());
}
public EffectAppender getEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {

View File

@@ -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.InvalidCardDefinitionException;
import com.gempukku.lotro.cards.build.ValueSource;
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.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;
@@ -17,32 +15,34 @@ import org.json.simple.JSONObject;
import java.util.Collection;
public class DiscardCardsFromHand implements EffectAppenderProducer {
public class DiscardFromHand implements EffectAppenderProducer {
@Override
public EffectAppender createEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
FieldUtils.validateAllowedFields(effectObject, "forced", "count", "filter", "memorize");
FieldUtils.validateAllowedFields(effectObject, "forced", "count", "filter", "memorize", "hand");
final String player = FieldUtils.getString(effectObject.get("hand"), "hand", "you");
final boolean forced = FieldUtils.getBoolean(effectObject.get("forced"), "forced");
final String filter = FieldUtils.getString(effectObject.get("filter"), "filter", "choose(any)");
final String memorize = FieldUtils.getString(effectObject.get("memorize"), "memorize", "_temp");
final PlayerSource playerSource = PlayerResolver.resolvePlayer(player, environment);
final ValueSource countSource = ValueResolver.resolveEvaluator(effectObject.get("count"), 1, environment);
MultiEffectAppender result = new MultiEffectAppender();
result.addEffectAppender(
CardResolver.resolveCardsInHand(filter, countSource, memorize, "you", "Choose cards to discard", environment));
CardResolver.resolveCardsInHand(filter, countSource, memorize, player, "Choose cards to discard", environment));
result.addEffectAppender(
new DelayedAppender() {
@Override
protected Effect createEffect(boolean cost, CostToEffectAction action, ActionContext actionContext) {
final Collection<? extends PhysicalCard> cardsToDiscard = actionContext.getCardsFromMemory(memorize);
return new DiscardCardsFromHandEffect(actionContext.getSource(), actionContext.getPerformingPlayer(), cardsToDiscard, forced);
return new DiscardCardsFromHandEffect(actionContext.getSource(), playerSource.getPlayer(actionContext), cardsToDiscard, forced);
}
@Override
public boolean isPlayableInFull(ActionContext actionContext) {
return (!forced || actionContext.getGame().getModifiersQuerying().canDiscardCardsFromHand(actionContext.getGame(), actionContext.getPerformingPlayer(), actionContext.getSource()));
return (!forced || actionContext.getGame().getModifiersQuerying().canDiscardCardsFromHand(actionContext.getGame(), playerSource.getPlayer(actionContext), actionContext.getSource()));
}
});

View File

@@ -0,0 +1,52 @@
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.PlayerSource;
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;
import com.gempukku.lotro.logic.effects.RevealHandEffect;
import com.gempukku.lotro.logic.timing.Effect;
import org.json.simple.JSONObject;
import java.util.Collection;
public class RevealHand implements EffectAppenderProducer {
@Override
public EffectAppender createEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
FieldUtils.validateAllowedFields(effectObject, "hand", "memorize");
final String player = FieldUtils.getString(effectObject.get("hand"), "hand", "you");
final PlayerSource playerSource = PlayerResolver.resolvePlayer(player, environment);
final String memorize = FieldUtils.getString(effectObject.get("memorize"), "memorize");
return new DelayedAppender() {
@Override
public boolean isPlayableInFull(ActionContext actionContext) {
final LotroGame game = actionContext.getGame();
final String revealingPlayer = playerSource.getPlayer(actionContext);
return game.getModifiersQuerying().canLookOrRevealCardsInHand(game, revealingPlayer, actionContext.getPerformingPlayer());
}
@Override
protected Effect createEffect(boolean cost, CostToEffectAction action, ActionContext actionContext) {
final String revealingPlayer = playerSource.getPlayer(actionContext);
return new RevealHandEffect(actionContext.getSource(), actionContext.getPerformingPlayer(), revealingPlayer) {
@Override
protected void cardsRevealed(Collection<? extends PhysicalCard> cards) {
if (memorize != null)
actionContext.setCardMemory(memorize, cards);
}
};
}
};
}
}