Added additional cards to JSON card definition
This commit is contained in:
@@ -122,6 +122,18 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"1_158": {
|
||||
"title": "Uruk-hai Raiding Party",
|
||||
"side": "shadow",
|
||||
"culture": "isengard",
|
||||
"cost": 4,
|
||||
"type": "minion",
|
||||
"race": "uruk-hai",
|
||||
"strength": 9,
|
||||
"vitality": 3,
|
||||
"site": 5,
|
||||
"keyword": "damage+1"
|
||||
},
|
||||
"1_178": {
|
||||
"title": "Goblin Runner",
|
||||
"side": "shadow",
|
||||
@@ -144,6 +156,40 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"1_262": {
|
||||
"title": "Orc Assassin",
|
||||
"side": "shadow",
|
||||
"culture": "sauron",
|
||||
"cost": 2,
|
||||
"type": "minion",
|
||||
"race": "orc",
|
||||
"strength": 6,
|
||||
"vitality": 2,
|
||||
"site": 6,
|
||||
"keyword": "tracker",
|
||||
"effects": [
|
||||
{
|
||||
"type": "modifyRoamingPenalty",
|
||||
"filter": "culture(sauron),minion,your",
|
||||
"amount": -1
|
||||
},
|
||||
{
|
||||
"type": "activated",
|
||||
"phase": "assignment",
|
||||
"requirement": {
|
||||
"type": "canSpot",
|
||||
"filter": "hobbit,companion",
|
||||
"count": 2
|
||||
},
|
||||
"effect": {
|
||||
"type": "assignToSkirmishAgainstMinion",
|
||||
"player": "fp",
|
||||
"fpCharacter": "choose(hobbit)",
|
||||
"against": "self"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"1_297": {
|
||||
"title": "Hobbit Party Guest",
|
||||
"side": "free people",
|
||||
@@ -194,9 +240,26 @@
|
||||
"resistance": 6,
|
||||
"signet": "aragorn",
|
||||
"effects": {
|
||||
"type": "modifystrength",
|
||||
"type": "modifyStrength",
|
||||
"filter": "self,hasAttached(weapon)",
|
||||
"amount": 2
|
||||
}
|
||||
},
|
||||
"1_306": {
|
||||
"title": "Pippin",
|
||||
"subtitle": "Friend to Frodo",
|
||||
"unique": true,
|
||||
"side": "free people",
|
||||
"cost": 0,
|
||||
"type": "companion",
|
||||
"race": "hobbit",
|
||||
"strength": 3,
|
||||
"vitality": 4,
|
||||
"resistance": 6,
|
||||
"signet": "frodo",
|
||||
"effects": {
|
||||
"type": "opponentMayNotDiscard",
|
||||
"filter": "your,culture(shire),tale"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -33,6 +33,6 @@ public class Card1_306 extends AbstractCompanion {
|
||||
|
||||
@Override
|
||||
public List<? extends Modifier> getInPlayModifiers(LotroGame game, PhysicalCard self) {
|
||||
return Collections.singletonList(new CantDiscardFromPlayByPlayerModifier(self, "Can't be discarded by opponent", Filters.and(Culture.SHIRE, Keyword.TALE), self.getOwner()));
|
||||
}
|
||||
return Collections.singletonList(new CantDiscardFromPlayByPlayerModifier(self, "Can't be discarded by opponent", Filters.and(Culture.SHIRE, Keyword.TALE), self.getOwner()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,9 +8,7 @@ import com.gempukku.lotro.cards.build.field.effect.ActivatedEffectProcessor;
|
||||
import com.gempukku.lotro.cards.build.field.effect.ActivatedTriggerEffectProcessor;
|
||||
import com.gempukku.lotro.cards.build.field.effect.EventEffectProcessor;
|
||||
import com.gempukku.lotro.cards.build.field.effect.TriggerEffectProcessor;
|
||||
import com.gempukku.lotro.cards.build.field.effect.modifier.AddKeyword;
|
||||
import com.gempukku.lotro.cards.build.field.effect.modifier.ArcheryTotal;
|
||||
import com.gempukku.lotro.cards.build.field.effect.modifier.ModifyStrength;
|
||||
import com.gempukku.lotro.cards.build.field.effect.modifier.*;
|
||||
import org.json.simple.JSONObject;
|
||||
|
||||
import java.util.HashMap;
|
||||
@@ -25,8 +23,10 @@ public class EffectFieldProcessor implements FieldProcessor {
|
||||
effectProcessors.put("activated", new ActivatedEffectProcessor());
|
||||
effectProcessors.put("event", new EventEffectProcessor());
|
||||
effectProcessors.put("modifystrength", new ModifyStrength());
|
||||
effectProcessors.put("modifyroamingpenalty", new ModifyRoamingPenalty());
|
||||
effectProcessors.put("addkeyword", new AddKeyword());
|
||||
effectProcessors.put("archerytotal", new ArcheryTotal());
|
||||
effectProcessors.put("opponentmaynotdiscard", new OpponentMayNotDiscard());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -29,6 +29,7 @@ public class EffectAppenderFactory {
|
||||
effectAppenderProducers.put("replaceinskirmish", new ReplaceInSkirmish());
|
||||
effectAppenderProducers.put("canttakemorewoundsthan", new CantTakeMoreWoundsThan());
|
||||
effectAppenderProducers.put("choice", new Choice());
|
||||
effectAppenderProducers.put("assigntoskirmishagainstminion", new AssignToSkirmishAgainstMinion());
|
||||
}
|
||||
|
||||
public EffectAppender getEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
|
||||
|
||||
@@ -0,0 +1,85 @@
|
||||
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.CardResolver;
|
||||
import com.gempukku.lotro.cards.build.field.effect.appender.resolver.PlayerResolver;
|
||||
import com.gempukku.lotro.common.Filterable;
|
||||
import com.gempukku.lotro.common.Side;
|
||||
import com.gempukku.lotro.filters.Filters;
|
||||
import com.gempukku.lotro.game.PhysicalCard;
|
||||
import com.gempukku.lotro.game.state.LotroGame;
|
||||
import com.gempukku.lotro.logic.GameUtils;
|
||||
import com.gempukku.lotro.logic.actions.CostToEffectAction;
|
||||
import com.gempukku.lotro.logic.effects.AssignmentEffect;
|
||||
import com.gempukku.lotro.logic.timing.Effect;
|
||||
import com.gempukku.lotro.logic.timing.EffectResult;
|
||||
import com.gempukku.lotro.logic.timing.PlayConditions;
|
||||
import org.json.simple.JSONObject;
|
||||
|
||||
public class AssignToSkirmishAgainstMinion implements EffectAppenderProducer {
|
||||
@Override
|
||||
public EffectAppender createEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
|
||||
FieldUtils.validateAllowedFields(effectObject, "player", "fpCharacter", "against");
|
||||
|
||||
final String player = FieldUtils.getString(effectObject.get("player"), "player", "owner");
|
||||
final String fpCharacter = FieldUtils.getString(effectObject.get("fpCharacter"), "fpCharacter");
|
||||
final String against = FieldUtils.getString(effectObject.get("against"), "against");
|
||||
|
||||
final PlayerSource playerSource = PlayerResolver.resolvePlayer(player, environment);
|
||||
final FilterableSource minionFilter = environment.getFilterFactory().generateFilter(against);
|
||||
|
||||
MultiEffectAppender result = new MultiEffectAppender();
|
||||
|
||||
result.addEffectAppender(
|
||||
CardResolver.resolveCard(fpCharacter,
|
||||
(playerId, game, source, effectResult, effect) -> {
|
||||
final String assigningPlayer = playerSource.getPlayer(playerId, game, source, effectResult, effect);
|
||||
Side assigningSide = GameUtils.isFP(game, assigningPlayer) ? Side.FREE_PEOPLE : Side.SHADOW;
|
||||
final Filterable filter = minionFilter.getFilterable(playerId, game, source, effectResult, effect);
|
||||
return Filters.assignableToSkirmishAgainst(assigningSide, filter, false, false);
|
||||
}, "_tempFpCharacter", player, "Choose character to assign to minion", environment));
|
||||
result.addEffectAppender(
|
||||
new DelayedAppender() {
|
||||
@Override
|
||||
protected Effect createEffect(CostToEffectAction action, String playerId, LotroGame game, PhysicalCard self, EffectResult effectResult, Effect effect) {
|
||||
final String assigningPlayer = playerSource.getPlayer(playerId, game, self, effectResult, effect);
|
||||
final Filterable filter = minionFilter.getFilterable(playerId, game, self, effectResult, effect);
|
||||
final PhysicalCard minion = Filters.findFirstActive(game, filter);
|
||||
final PhysicalCard fpCharacter = action.getCardFromMemory("_tempFpCharacter");
|
||||
return new AssignmentEffect(assigningPlayer, fpCharacter, minion);
|
||||
}
|
||||
});
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Requirement createCostRequirement(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
|
||||
final String player = FieldUtils.getString(effectObject.get("player"), "player", "owner");
|
||||
final String type = FieldUtils.getString(effectObject.get("fpCharacter"), "fpCharacter");
|
||||
final String against = FieldUtils.getString(effectObject.get("against"), "against");
|
||||
|
||||
final PlayerSource playerSource = PlayerResolver.resolvePlayer(player, environment);
|
||||
final FilterableSource minionFilter = environment.getFilterFactory().generateFilter(against);
|
||||
|
||||
if (type.startsWith("choose(") && type.endsWith(")")) {
|
||||
final String filter = type.substring(type.indexOf("(") + 1, type.lastIndexOf(")"));
|
||||
final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(filter);
|
||||
|
||||
return (playerId, game, self, effectResult, effect) -> {
|
||||
final String assigningPlayer = playerSource.getPlayer(playerId, game, self, effectResult, effect);
|
||||
Side assigningSide = GameUtils.isFP(game, assigningPlayer) ? Side.FREE_PEOPLE : Side.SHADOW;
|
||||
|
||||
final Filterable minion = minionFilter.getFilterable(playerId, game, self, effectResult, effect);
|
||||
|
||||
return PlayConditions.isActive(game,
|
||||
filterableSource.getFilterable(playerId, game, self, effectResult, effect),
|
||||
Filters.assignableToSkirmishAgainst(assigningSide, minion, false, false));
|
||||
};
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -84,7 +84,14 @@ public class FilterFactory {
|
||||
parameterFilters.put("not",
|
||||
(parameter, filterFactory) -> {
|
||||
final FilterableSource filterableSource = filterFactory.generateFilter(parameter);
|
||||
return (FilterableSource) (playerId, game, source, effectResult, effect) -> Filters.not(filterableSource.getFilterable(playerId, game, source, effectResult, effect));
|
||||
return (playerId, game, source, effectResult, effect) -> Filters.not(filterableSource.getFilterable(playerId, game, source, effectResult, effect));
|
||||
});
|
||||
parameterFilters.put("site",
|
||||
(parameter, filterFactory) -> (playerId, game, source, effectResult, effect) -> {
|
||||
final String[] parameterSplit = parameter.split(",");
|
||||
final SitesBlock sitesBlock = Enum.valueOf(SitesBlock.class, parameterSplit[0].toUpperCase().replace('_', ' '));
|
||||
int number = Integer.parseInt(parameterSplit[1]);
|
||||
return Filters.and(Filters.siteBlock(sitesBlock), Filters.siteNumber(number));
|
||||
});
|
||||
}
|
||||
|
||||
@@ -160,16 +167,16 @@ public class FilterFactory {
|
||||
}
|
||||
|
||||
private FilterableSource lookupFilter(String name, String parameter) throws InvalidCardDefinitionException {
|
||||
FilterableSource result = simpleFilters.get(name.toLowerCase());
|
||||
if (result != null)
|
||||
return result;
|
||||
if (parameter == null) {
|
||||
FilterableSource result = simpleFilters.get(name.toLowerCase());
|
||||
if (result != null)
|
||||
return result;
|
||||
}
|
||||
|
||||
final FilterableSourceProducer filterableSourceProducer = parameterFilters.get(name);
|
||||
if (filterableSourceProducer == null)
|
||||
throw new InvalidCardDefinitionException("Unable to find filter: " + name);
|
||||
|
||||
result = filterableSourceProducer.createFilterableSource(parameter, this);
|
||||
|
||||
return result;
|
||||
return filterableSourceProducer.createFilterableSource(parameter, this);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
package com.gempukku.lotro.cards.build.field.effect.modifier;
|
||||
|
||||
import com.gempukku.lotro.cards.build.*;
|
||||
import com.gempukku.lotro.cards.build.field.EffectProcessor;
|
||||
import com.gempukku.lotro.cards.build.field.FieldUtils;
|
||||
import com.gempukku.lotro.game.PhysicalCard;
|
||||
import com.gempukku.lotro.game.state.LotroGame;
|
||||
import com.gempukku.lotro.logic.modifiers.Modifier;
|
||||
import com.gempukku.lotro.logic.modifiers.RoamingPenaltyModifier;
|
||||
import org.json.simple.JSONObject;
|
||||
|
||||
public class ModifyRoamingPenalty implements EffectProcessor {
|
||||
@Override
|
||||
public void processEffect(JSONObject value, BuiltLotroCardBlueprint blueprint, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
|
||||
FieldUtils.validateAllowedFields(value, "filter", "condition", "amount");
|
||||
|
||||
final int amount = FieldUtils.getInteger(value.get("amount"), "amount");
|
||||
final JSONObject[] conditionArray = FieldUtils.getObjectArray(value.get("condition"), "condition");
|
||||
final String filter = FieldUtils.getString(value.get("filter"), "filter", "self");
|
||||
|
||||
final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(filter);
|
||||
final Requirement[] requirements = environment.getRequirementFactory().getRequirements(conditionArray, environment);
|
||||
|
||||
blueprint.appendInPlayModifier(
|
||||
new ModifierSource() {
|
||||
@Override
|
||||
public Modifier getModifier(LotroGame game, PhysicalCard self) {
|
||||
return new RoamingPenaltyModifier(self,
|
||||
filterableSource.getFilterable(null, game, self, null, null),
|
||||
new RequirementCondition(requirements, null, self, null, null), amount);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
package com.gempukku.lotro.cards.build.field.effect.modifier;
|
||||
|
||||
import com.gempukku.lotro.cards.build.BuiltLotroCardBlueprint;
|
||||
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.field.EffectProcessor;
|
||||
import com.gempukku.lotro.cards.build.field.FieldUtils;
|
||||
import com.gempukku.lotro.logic.modifiers.CantDiscardFromPlayByPlayerModifier;
|
||||
import org.json.simple.JSONObject;
|
||||
|
||||
public class OpponentMayNotDiscard implements EffectProcessor {
|
||||
@Override
|
||||
public void processEffect(JSONObject effectObject, BuiltLotroCardBlueprint blueprint, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
|
||||
FieldUtils.validateAllowedFields(effectObject, "filter");
|
||||
|
||||
final String filter = FieldUtils.getString(effectObject.get("filter"), "filter", "self");
|
||||
final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(filter);
|
||||
|
||||
blueprint.appendInPlayModifier(
|
||||
(game, self) -> new CantDiscardFromPlayByPlayerModifier(self, "Can't be discarded by opponent",
|
||||
filterableSource.getFilterable(null, game, self, null, null),
|
||||
self.getOwner()));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user