Some FotR cards
This commit is contained in:
@@ -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",
|
||||
|
||||
@@ -649,7 +649,10 @@
|
||||
"culture": "isengard",
|
||||
"cost": 0,
|
||||
"type": "condition",
|
||||
"keyword": "weather",
|
||||
"keyword": [
|
||||
"support area",
|
||||
"weather"
|
||||
],
|
||||
"effects": [
|
||||
{
|
||||
"type": "trigger",
|
||||
|
||||
@@ -274,7 +274,7 @@
|
||||
"culture": "isengard",
|
||||
"cost": 0,
|
||||
"type": "artifact",
|
||||
"possession": "palantir",
|
||||
"keyword": "support area",
|
||||
"condition": {
|
||||
"type": "canSpot",
|
||||
"filter": "culture(isengard),minion"
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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()));
|
||||
}
|
||||
});
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user