Added additional cards to JSON card definition

This commit is contained in:
marcin.sciesinski
2019-08-26 19:22:24 -07:00
parent 57c80ff09a
commit 18025c65fd
51 changed files with 408 additions and 91 deletions

View File

@@ -47,7 +47,7 @@
"filter": "self"
},
"effect": {
"type": "addStrength",
"type": "modifyStrength",
"filter": "self",
"amount": 2
}
@@ -67,12 +67,32 @@
"effects": {
"type": "event",
"effect": {
"type": "addArcheryTotal",
"type": "modifyArcheryTotal",
"side": "free people",
"amount": 1
}
}
},
"1_51": {
"title": "Legolas",
"subtitle": "Prince of Mirkwood",
"unique": true,
"side": "free people",
"culture": "elven",
"cost": 2,
"type": "companion",
"race": "elf",
"strength": 6,
"vitality": 3,
"resistance": 6,
"signet": "gandalf",
"keyword": "archer",
"effects": {
"type": "modifyStrength",
"filter": "self,inSkirmishAgainst(nazgul)",
"amount": 3
}
},
"1_94": {
"title": "Athelas",
"side": "free people",

View File

@@ -0,0 +1,17 @@
{
"10_121": {
"title": "Frodo",
"subtitle": "Resolute Hobbit",
"unique": true,
"side": "free people",
"culture": "shire",
"cost": 0,
"type": "companion",
"race": "hobbit",
"strength": 3,
"vitality": 4,
"resistance": 12,
"signet": "frodo",
"keyword": "can start with ring"
}
}

View File

@@ -0,0 +1,71 @@
{
"4_138": {
"title": "Band of Uruk Bowmen",
"side": "shadow",
"culture": "isengard",
"cost": 5,
"type": "minion",
"race": "uruk-hai",
"strength": 7,
"vitality": 3,
"site": 5,
"keyword": [
"archer",
"damage+1"
],
"effects": {
"type": "archeryTotal",
"condition": {
"type": "controlsSite",
"player": "owner"
},
"side": "shadow",
"amount": 1
}
},
"4_218": {
"title": "Desert Legion",
"unique": true,
"side": "shadow",
"culture": "raider",
"cost": 6,
"type": "minion",
"race": "man",
"strength": 13,
"vitality": 3,
"site": 4,
"keyword": [
"southron",
"ambush+1"
],
"effects": [
{
"type": "modifyStrength",
"condition": {
"type": "canSpotBurdens",
"amount": 4
},
"filter": "self",
"amount": 5
},
{
"type": "addKeyword",
"condition": {
"type": "canSpotBurdens",
"amount": 5
},
"filter": "self",
"keyword": "fierce"
},
{
"type": "addKeyword",
"condition": {
"type": "canSpotBurdens",
"amount": 6
},
"filter": "self",
"keyword": "damage+1"
}
]
}
}

View File

@@ -93,7 +93,7 @@
"with": "memory(exertedGimli)"
},
{
"type": "addStrength",
"type": "modifyStrength",
"filter": "memory(exertedGimli)",
"amount": 2
},
@@ -144,7 +144,7 @@
"strength": 2,
"target": "nazgul",
"effects": {
"type": "addStrength",
"type": "modifyStrength",
"filter": "hasAttached(self),inSkirmishAgainst(companion,resistanceLessThan(4))",
"amount": 2
}

View File

@@ -0,0 +1,29 @@
{
"5_7": {
"title": "Gimli",
"subtitle": "Skilled Defender",
"unique": true,
"side": "free people",
"culture": "dwarven",
"cost": 2,
"type": "companion",
"race": "dwarf",
"strength": 6,
"vitality": 3,
"resistance": 6,
"signet": "theoden",
"keyword": "damage+1",
"effects": {
"type": "trigger",
"optional": true,
"trigger": {
"type": "winsSkirmish",
"filter": "self"
},
"effect": {
"type": "wound",
"filter": "choose(minion,assignedToSkirmish(unbound,companion))"
}
}
}
}

View File

@@ -28,7 +28,7 @@ import java.util.List;
*/
public class Card4_089 extends AbstractCompanion {
public Card4_089() {
super(4, 7, 4, 6, Culture.GANDALF, Race.WIZARD, Signet.THÉODEN, "Gandalf", "Greyhame", true);
super(4, 7, 4, 6, Culture.GANDALF, Race.WIZARD, Signet.THEODEN, "Gandalf", "Greyhame", true);
}
@Override

View File

@@ -31,7 +31,7 @@ import java.util.List;
*/
public class Card4_267 extends AbstractCompanion {
public Card4_267() {
super(3, 7, 3, 6, Culture.ROHAN, Race.MAN, Signet.THÉODEN, Names.eomer, "Third Marshal of Riddermark", true);
super(3, 7, 3, 6, Culture.ROHAN, Race.MAN, Signet.THEODEN, Names.eomer, "Third Marshal of Riddermark", true);
}
@Override

View File

@@ -1,19 +1,15 @@
package com.gempukku.lotro.cards.set4.rohan;
import com.gempukku.lotro.logic.cardtype.AbstractCompanion;
import com.gempukku.lotro.logic.timing.PlayConditions;
import com.gempukku.lotro.logic.timing.TriggerConditions;
import com.gempukku.lotro.logic.effects.PreventCardEffect;
import com.gempukku.lotro.logic.effects.SelfExertEffect;
import com.gempukku.lotro.common.*;
import com.gempukku.lotro.filters.Filters;
import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.game.state.LotroGame;
import com.gempukku.lotro.logic.actions.ActivateCardAction;
import com.gempukku.lotro.logic.effects.AddTwilightEffect;
import com.gempukku.lotro.logic.effects.ChooseActiveCardEffect;
import com.gempukku.lotro.logic.effects.WoundCharactersEffect;
import com.gempukku.lotro.logic.cardtype.AbstractCompanion;
import com.gempukku.lotro.logic.effects.*;
import com.gempukku.lotro.logic.timing.Effect;
import com.gempukku.lotro.logic.timing.PlayConditions;
import com.gempukku.lotro.logic.timing.TriggerConditions;
import java.util.Collections;
import java.util.List;
@@ -33,7 +29,7 @@ import java.util.List;
*/
public class Card4_270 extends AbstractCompanion {
public Card4_270() {
super(2, 6, 3, 6, Culture.ROHAN, Race.MAN, Signet.THÉODEN, Names.eowyn, "Lady of Rohan", true);
super(2, 6, 3, 6, Culture.ROHAN, Race.MAN, Signet.THEODEN, Names.eowyn, "Lady of Rohan", true);
addKeyword(Keyword.VALIANT);
}

View File

@@ -36,7 +36,7 @@ public class Card4_275 extends AbstractEvent {
action.appendCost(
new ChooseAndExertCharactersEffect(action, playerId, 1, 1, Filters.name(Names.theoden)));
action.appendEffect(
new ChooseActiveCardEffect(self, playerId, "Choose companion", CardType.COMPANION, Signet.THÉODEN) {
new ChooseActiveCardEffect(self, playerId, "Choose companion", CardType.COMPANION, Signet.THEODEN) {
@Override
protected void cardSelected(LotroGame game, PhysicalCard card) {
action.insertEffect(

View File

@@ -35,7 +35,7 @@ import java.util.List;
*/
public class Card4_365 extends AbstractCompanion {
public Card4_365() {
super(2, 6, 2, 6, Culture.ROHAN, Race.MAN, Signet.THÉODEN, Names.theoden, "Lord of the Mark", true);
super(2, 6, 2, 6, Culture.ROHAN, Race.MAN, Signet.THEODEN, Names.theoden, "Lord of the Mark", true);
}
@Override

View File

@@ -1,14 +1,14 @@
package com.gempukku.lotro.cards.set5.dwarven;
import com.gempukku.lotro.logic.cardtype.AbstractCompanion;
import com.gempukku.lotro.logic.timing.TriggerConditions;
import com.gempukku.lotro.common.*;
import com.gempukku.lotro.filters.Filters;
import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.game.state.LotroGame;
import com.gempukku.lotro.logic.actions.OptionalTriggerAction;
import com.gempukku.lotro.logic.cardtype.AbstractCompanion;
import com.gempukku.lotro.logic.effects.ChooseAndWoundCharactersEffect;
import com.gempukku.lotro.logic.timing.EffectResult;
import com.gempukku.lotro.logic.timing.TriggerConditions;
import java.util.Collections;
import java.util.List;
@@ -28,7 +28,7 @@ import java.util.List;
*/
public class Card5_007 extends AbstractCompanion {
public Card5_007() {
super(2, 6, 3, 6, Culture.DWARVEN, Race.DWARF, Signet.THÉODEN, "Gimli", "Skilled Defender", true);
super(2, 6, 3, 6, Culture.DWARVEN, Race.DWARF, Signet.THEODEN, "Gimli", "Skilled Defender", true);
addKeyword(Keyword.DAMAGE, 1);
}

View File

@@ -1,14 +1,14 @@
package com.gempukku.lotro.cards.set5.elven;
import com.gempukku.lotro.logic.cardtype.AbstractCompanion;
import com.gempukku.lotro.logic.timing.TriggerConditions;
import com.gempukku.lotro.common.*;
import com.gempukku.lotro.filters.Filters;
import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.game.state.LotroGame;
import com.gempukku.lotro.logic.actions.OptionalTriggerAction;
import com.gempukku.lotro.logic.cardtype.AbstractCompanion;
import com.gempukku.lotro.logic.effects.ChooseAndHealCharactersEffect;
import com.gempukku.lotro.logic.timing.EffectResult;
import com.gempukku.lotro.logic.timing.TriggerConditions;
import java.util.Collections;
import java.util.List;
@@ -27,7 +27,7 @@ import java.util.List;
*/
public class Card5_121 extends AbstractCompanion {
public Card5_121() {
super(2, 6, 3, 6, Culture.ELVEN, Race.ELF, Signet.THÉODEN, "Legolas", "Archer of Mirkwood", true);
super(2, 6, 3, 6, Culture.ELVEN, Race.ELF, Signet.THEODEN, "Legolas", "Archer of Mirkwood", true);
addKeyword(Keyword.ARCHER);
}

View File

@@ -34,9 +34,9 @@ public class Card5_084 extends AbstractEvent {
action.appendCost(
new ChooseAndExertCharactersEffect(action, playerId, 1, 1, 2, Filters.name(Names.theoden)));
action.appendEffect(
new HealCharactersEffect(self, Filters.and(CardType.COMPANION, Filters.not(Filters.name(Names.theoden)), Signet.THÉODEN)));
new HealCharactersEffect(self, Filters.and(CardType.COMPANION, Filters.not(Filters.name(Names.theoden)), Signet.THEODEN)));
action.appendEffect(
new HealCharactersEffect(self, Filters.and(CardType.COMPANION, Filters.not(Filters.name(Names.theoden)), Signet.THÉODEN)));
new HealCharactersEffect(self, Filters.and(CardType.COMPANION, Filters.not(Filters.name(Names.theoden)), Signet.THEODEN)));
return action;
}
}

View File

@@ -33,7 +33,7 @@ import java.util.List;
*/
public class Card6_050 extends AbstractCompanion {
public Card6_050() {
super(4, 8, 4, 6, Culture.GONDOR, Race.MAN, Signet.THÉODEN, "Aragorn", "Defender of Free Peoples", true);
super(4, 8, 4, 6, Culture.GONDOR, Race.MAN, Signet.THEODEN, "Aragorn", "Defender of Free Peoples", true);
}
@Override

View File

@@ -33,7 +33,7 @@ public class Card6_118 extends AbstractSite {
@Override
public List<? extends ActivateCardAction> getPhaseActionsInPlay(String playerId, LotroGame game, PhysicalCard self) {
if (PlayConditions.canUseSiteDuringPhase(game, Phase.FELLOWSHIP, self)
&& PlayConditions.canSpot(game, 3, CardType.COMPANION, Signet.THÉODEN)) {
&& PlayConditions.canSpot(game, 3, CardType.COMPANION, Signet.THEODEN)) {
ActivateCardAction action = new ActivateCardAction(self);
Set<PhysicalCard> hand = new HashSet<PhysicalCard>(game.getGameState().getHand(playerId));
action.appendCost(

View File

@@ -25,7 +25,7 @@ import java.util.List;
*/
public class Card7_006 extends AbstractCompanion {
public Card7_006() {
super(2, 6, 3, 6, Culture.DWARVEN, Race.DWARF, Signet.THÉODEN, "Gimli", "Faithful Companion", true);
super(2, 6, 3, 6, Culture.DWARVEN, Race.DWARF, Signet.THEODEN, "Gimli", "Faithful Companion", true);
addKeyword(Keyword.DAMAGE, 1);
}

View File

@@ -27,7 +27,7 @@ import java.util.List;
*/
public class Card7_026 extends AbstractCompanion {
public Card7_026() {
super(2, 6, 3, 6, Culture.ELVEN, Race.ELF, Signet.THÉODEN, "Legolas", "Nimble Warrior", true);
super(2, 6, 3, 6, Culture.ELVEN, Race.ELF, Signet.THEODEN, "Legolas", "Nimble Warrior", true);
addKeyword(Keyword.ARCHER);
}

View File

@@ -38,7 +38,7 @@ import java.util.List;
*/
public class Card7_037 extends AbstractCompanion {
public Card7_037() {
super(4, 7, 4, 6, Culture.GANDALF, Race.WIZARD, Signet.THÉODEN, "Gandalf", "Manager of Wizards", true);
super(4, 7, 4, 6, Culture.GANDALF, Race.WIZARD, Signet.THEODEN, "Gandalf", "Manager of Wizards", true);
}
@Override

View File

@@ -30,7 +30,7 @@ import java.util.List;
*/
public class Card7_090 extends AbstractCompanion {
public Card7_090() {
super(3, 7, 3, 6, Culture.GONDOR, Race.MAN, Signet.THÉODEN, "Faramir", "Stout Captain", true);
super(3, 7, 3, 6, Culture.GONDOR, Race.MAN, Signet.THEODEN, "Faramir", "Stout Captain", true);
addKeyword(Keyword.RANGER);
}

View File

@@ -26,7 +26,7 @@ import java.util.List;
*/
public class Card7_228 extends AbstractCompanion {
public Card7_228() {
super(2, 6, 3, 6, Culture.ROHAN, Race.MAN, Signet.THÉODEN, Names.eowyn, "Dernhelm", true);
super(2, 6, 3, 6, Culture.ROHAN, Race.MAN, Signet.THEODEN, Names.eowyn, "Dernhelm", true);
addKeyword(Keyword.VALIANT);
}

View File

@@ -1,15 +1,15 @@
package com.gempukku.lotro.cards.set7.rohan;
import com.gempukku.lotro.logic.cardtype.AbstractCompanion;
import com.gempukku.lotro.logic.timing.PlayConditions;
import com.gempukku.lotro.logic.timing.TriggerConditions;
import com.gempukku.lotro.logic.effects.choose.ChooseAndExertCharactersEffect;
import com.gempukku.lotro.common.*;
import com.gempukku.lotro.filters.Filters;
import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.game.state.LotroGame;
import com.gempukku.lotro.logic.actions.OptionalTriggerAction;
import com.gempukku.lotro.logic.cardtype.AbstractCompanion;
import com.gempukku.lotro.logic.effects.choose.ChooseAndExertCharactersEffect;
import com.gempukku.lotro.logic.timing.EffectResult;
import com.gempukku.lotro.logic.timing.PlayConditions;
import com.gempukku.lotro.logic.timing.TriggerConditions;
import java.util.Collections;
import java.util.List;
@@ -29,7 +29,7 @@ import java.util.List;
*/
public class Card7_254 extends AbstractCompanion {
public Card7_254() {
super(3, 7, 3, 6, Culture.ROHAN, Race.MAN, Signet.THÉODEN, Names.theoden, "Leader of Spears", true);
super(3, 7, 3, 6, Culture.ROHAN, Race.MAN, Signet.THEODEN, Names.theoden, "Leader of Spears", true);
addKeyword(Keyword.VALIANT);
}

View File

@@ -30,7 +30,7 @@ import java.util.List;
*/
public class Card7_365 extends AbstractCompanion {
public Card7_365() {
super(3, 7, 3, 6, Culture.ROHAN, Race.MAN, Signet.THÉODEN, Names.eomer, "Valiant Warchief", true);
super(3, 7, 3, 6, Culture.ROHAN, Race.MAN, Signet.THEODEN, Names.eomer, "Valiant Warchief", true);
addKeyword(Keyword.VALIANT);
}

View File

@@ -31,7 +31,7 @@ import java.util.List;
*/
public class Card7_321 extends AbstractCompanion {
public Card7_321() {
super(1, 3, 4, 6, Culture.SHIRE, Race.HOBBIT, Signet.THÉODEN, "Merry", "Swordthain", true);
super(1, 3, 4, 6, Culture.SHIRE, Race.HOBBIT, Signet.THEODEN, "Merry", "Swordthain", true);
}
@Override

View File

@@ -32,7 +32,7 @@ public class Card8_090 extends AbstractEvent {
PlayEventAction action = new PlayEventAction(self);
action.appendCost(
new ChooseAndExertCharactersEffect(action, playerId, 1, 1, Filters.name(Names.theoden)));
int count = Filters.countActive(game, CardType.COMPANION, Signet.THÉODEN);
int count = Filters.countActive(game, CardType.COMPANION, Signet.THEODEN);
for (int i = 0; i < count; i++)
action.appendEffect(
new ChooseAndExertCharactersEffect(action, playerId, 1, 1, CardType.MINION));

View File

@@ -43,7 +43,7 @@ public class Card9_045 extends AbstractAttachableFPPossession {
@Override
public List<? extends Modifier> getInPlayModifiers(LotroGame game, PhysicalCard self) {
return Collections.singletonList(
new AddSignetModifier(self, Filters.hasAttached(self), Signet.THÉODEN));
new AddSignetModifier(self, Filters.hasAttached(self), Signet.THEODEN));
}
@Override

View File

@@ -1,5 +1,15 @@
package com.gempukku.lotro.common;
public enum Signet implements Filterable {
ARAGORN, FRODO, GANDALF, THÉODEN
}
package com.gempukku.lotro.common;
public enum Signet implements Filterable {
ARAGORN("Aragorn"), FRODO("Frodo"), GANDALF("Gandalf"), THEODEN("Théoden");
private String displayText;
Signet(String displayText) {
this.displayText = displayText;
}
public String toString() {
return displayText;
}
}

View File

@@ -37,7 +37,7 @@ public class BuiltLotroCardBlueprint implements LotroCardBlueprint {
private Set<PossessionClass> possessionClasses;
private Direction direction;
private List<PlayRequirement> playRequirements;
private List<Requirement> requirements;
private List<FilterableSource> targetFilters;
private List<ActionSource> requiredBeforeTriggers;
@@ -98,10 +98,10 @@ public class BuiltLotroCardBlueprint implements LotroCardBlueprint {
optionalAfterTriggers.add(actionSource);
}
public void appendPlayRequirement(PlayRequirement playRequirement) {
if (playRequirements == null)
playRequirements = new LinkedList<>();
playRequirements.add(playRequirement);
public void appendPlayRequirement(Requirement requirement) {
if (requirements == null)
requirements = new LinkedList<>();
requirements.add(requirement);
}
public void appendInPlayModifier(ModifierSource modifierSource) {
@@ -368,11 +368,11 @@ public class BuiltLotroCardBlueprint implements LotroCardBlueprint {
@Override
public boolean checkPlayRequirements(LotroGame game, PhysicalCard self) {
if (playRequirements == null)
if (requirements == null)
return true;
for (PlayRequirement playRequirement : playRequirements) {
if (!playRequirement.accepts(null, game, self, null, null))
for (Requirement requirement : requirements) {
if (!requirement.accepts(null, game, self, null, null))
return false;
}

View File

@@ -5,6 +5,6 @@ import com.gempukku.lotro.game.state.LotroGame;
import com.gempukku.lotro.logic.timing.Effect;
import com.gempukku.lotro.logic.timing.EffectResult;
public interface PlayRequirement {
public interface Requirement {
boolean accepts(String playerId, LotroGame game, PhysicalCard self, EffectResult effectResult, Effect effect);
}

View File

@@ -8,7 +8,9 @@ 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.AddStrength;
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 org.json.simple.JSONObject;
import java.util.HashMap;
@@ -22,7 +24,9 @@ public class EffectFieldProcessor implements FieldProcessor {
effectProcessors.put("activatedtrigger", new ActivatedTriggerEffectProcessor());
effectProcessors.put("activated", new ActivatedEffectProcessor());
effectProcessors.put("event", new EventEffectProcessor());
effectProcessors.put("addstrength", new AddStrength());
effectProcessors.put("modifystrength", new ModifyStrength());
effectProcessors.put("addkeyword", new AddKeyword());
effectProcessors.put("archerytotal", new ArcheryTotal());
}
@Override

View File

@@ -56,7 +56,7 @@ public class FieldUtils {
if (value == null)
return null;
final String string = getString(value, key);
return Enum.valueOf(enumClass, string.toUpperCase().replace(' ', '_'));
return Enum.valueOf(enumClass, string.toUpperCase().replace(' ', '_').replace('-', '_'));
}
public static JSONObject[] getObjectArray(Object value, String key) throws InvalidCardDefinitionException {

View File

@@ -8,8 +8,8 @@ public class RequirementFieldProcessor implements FieldProcessor {
public void processField(String key, Object value, BuiltLotroCardBlueprint blueprint, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
final JSONObject[] requirementsArray = FieldUtils.getObjectArray(value, key);
for (JSONObject requirement : requirementsArray) {
final PlayRequirement playRequirement = environment.getRequirementFactory().getRequirement(requirement, environment);
blueprint.appendPlayRequirement(playRequirement);
final Requirement conditionRequirement = environment.getRequirementFactory().getRequirement(requirement, environment);
blueprint.appendPlayRequirement(conditionRequirement);
}
}
}

View File

@@ -1,7 +1,7 @@
package com.gempukku.lotro.cards.build.field.effect;
import com.gempukku.lotro.cards.build.ActionSource;
import com.gempukku.lotro.cards.build.PlayRequirement;
import com.gempukku.lotro.cards.build.Requirement;
import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.game.state.LotroGame;
import com.gempukku.lotro.logic.actions.CostToEffectAction;
@@ -12,13 +12,13 @@ import java.util.LinkedList;
import java.util.List;
public class DefaultActionSource implements ActionSource {
private List<PlayRequirement> playRequirements = new LinkedList<>();
private List<Requirement> requirements = new LinkedList<>();
private List<EffectAppender> costs = new LinkedList<>();
private List<EffectAppender> effects = new LinkedList<>();
public void addPlayRequirement(PlayRequirement playRequirement) {
this.playRequirements.add(playRequirement);
public void addPlayRequirement(Requirement requirement) {
this.requirements.add(requirement);
}
public void addCost(EffectAppender effectAppender) {
@@ -31,8 +31,8 @@ public class DefaultActionSource implements ActionSource {
@Override
public boolean isValid(String playerId, LotroGame game, PhysicalCard self, EffectResult effectResult, Effect effect) {
for (PlayRequirement playRequirement : playRequirements) {
if (!playRequirement.accepts(playerId, game, self, effectResult, effect))
for (Requirement requirement : requirements) {
if (!requirement.accepts(playerId, game, self, effectResult, effect))
return false;
}
return true;

View File

@@ -17,9 +17,9 @@ public class EffectAppenderFactory {
effectAppenderProducers.put("discard", new DiscardFromPlay());
effectAppenderProducers.put("preventdiscard", new PreventCardEffectAppender());
effectAppenderProducers.put("exert", new Exert());
effectAppenderProducers.put("addstrength", new AddStrength());
effectAppenderProducers.put("modifystrength", new ModifyStrength());
effectAppenderProducers.put("addkeyword", new AddKeyword());
effectAppenderProducers.put("addarcherytotal", new AddArcheryTotal());
effectAppenderProducers.put("modifyarcherytotal", new ModifyArcheryTotal());
effectAppenderProducers.put("addburden", new AddBurden());
effectAppenderProducers.put("discardtopcardfromdeck", new DiscardTopCardFromDeck());
effectAppenderProducers.put("addtwilight", new AddTwilight());

View File

@@ -2,7 +2,7 @@ package com.gempukku.lotro.cards.build.field.effect;
import com.gempukku.lotro.cards.build.CardGenerationEnvironment;
import com.gempukku.lotro.cards.build.InvalidCardDefinitionException;
import com.gempukku.lotro.cards.build.PlayRequirement;
import com.gempukku.lotro.cards.build.Requirement;
import com.gempukku.lotro.cards.build.field.FieldUtils;
import com.gempukku.lotro.cards.build.field.effect.trigger.TriggerChecker;
import org.json.simple.JSONObject;
@@ -19,8 +19,8 @@ public class EffectUtils {
public static void processRequirementsCostsAndEffects(JSONObject value, CardGenerationEnvironment environment, DefaultActionSource actionSource) throws InvalidCardDefinitionException {
final JSONObject[] requirementArray = FieldUtils.getObjectArray(value.get("requirement"), "requirement");
for (JSONObject requirement : requirementArray) {
final PlayRequirement playRequirement = environment.getRequirementFactory().getRequirement(requirement, environment);
actionSource.addPlayRequirement(playRequirement);
final Requirement conditionRequirement = environment.getRequirementFactory().getRequirement(requirement, environment);
actionSource.addPlayRequirement(conditionRequirement);
}
processCostsAndEffects(value, environment, actionSource);

View File

@@ -15,7 +15,7 @@ import com.gempukku.lotro.logic.timing.Effect;
import com.gempukku.lotro.logic.timing.EffectResult;
import org.json.simple.JSONObject;
public class AddArcheryTotal implements EffectAppenderProducer {
public class ModifyArcheryTotal implements EffectAppenderProducer {
@Override
public EffectAppender createEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
FieldUtils.validateAllowedFields(effectObject, "amount", "side");

View File

@@ -19,7 +19,7 @@ import org.json.simple.JSONObject;
import java.util.Collection;
public class AddStrength implements EffectAppenderProducer {
public class ModifyStrength implements EffectAppenderProducer {
@Override
public EffectAppender createEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
FieldUtils.validateAllowedFields(effectObject, "amount", "count", "filter", "memory");

View File

@@ -70,6 +70,11 @@ public class FilterFactory {
final FilterableSource filterableSource = filterFactory.generateFilter(parameter);
return (playerId, game, source, effectResult, effect) -> Filters.inSkirmishAgainst(filterableSource.getFilterable(playerId, game, source, effectResult, effect));
});
parameterFilters.put("assignedToSkirmish",
(parameter, filterFactory) -> {
final FilterableSource filterableSource = filterFactory.generateFilter(parameter);
return (playerId, game, source, effectResult, effect) -> Filters.assignedToSkirmishAgainst(filterableSource.getFilterable(playerId, game, source, effectResult, effect));
});
parameterFilters.put("resistanceLessThan",
(parameter, filterFactory) -> {
int amount = Integer.parseInt(parameter);

View File

@@ -0,0 +1,42 @@
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.common.Keyword;
import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.game.state.LotroGame;
import com.gempukku.lotro.logic.modifiers.KeywordModifier;
import com.gempukku.lotro.logic.modifiers.Modifier;
import org.json.simple.JSONObject;
public class AddKeyword implements EffectProcessor {
@Override
public void processEffect(JSONObject effectObject, BuiltLotroCardBlueprint blueprint, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
FieldUtils.validateAllowedFields(effectObject, "filter", "condition", "keyword");
final JSONObject[] conditionArray = FieldUtils.getObjectArray(effectObject.get("condition"), "condition");
final String filter = FieldUtils.getString(effectObject.get("filter"), "filter", "self");
final String keywordString = FieldUtils.getString(effectObject.get("keyword"), "keyword");
final String[] keywordSplit = keywordString.split("\\+");
Keyword keyword = FieldUtils.getEnum(Keyword.class, keywordSplit[0], "keyword");
int value = 1;
if (keywordSplit.length == 2)
value = Integer.parseInt(keywordSplit[1]);
final int keywordValue = value;
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 KeywordModifier(self,
filterableSource.getFilterable(null, game, self, null, null),
new RequirementCondition(requirements, null, self, null, null), keyword, keywordValue);
}
});
}
}

View File

@@ -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.common.Side;
import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.game.state.LotroGame;
import com.gempukku.lotro.logic.modifiers.ArcheryTotalModifier;
import com.gempukku.lotro.logic.modifiers.Modifier;
import org.json.simple.JSONObject;
public class ArcheryTotal implements EffectProcessor {
@Override
public void processEffect(JSONObject effectObject, BuiltLotroCardBlueprint blueprint, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
FieldUtils.validateAllowedFields(effectObject, "amount", "condition", "side");
final JSONObject[] conditionArray = FieldUtils.getObjectArray(effectObject.get("condition"), "condition");
final int amount = FieldUtils.getInteger(effectObject.get("amount"), "amount");
final Side side = FieldUtils.getEnum(Side.class, effectObject.get("side"), "side");
final Requirement[] requirements = environment.getRequirementFactory().getRequirements(conditionArray, environment);
blueprint.appendInPlayModifier(
new ModifierSource() {
@Override
public Modifier getModifier(LotroGame game, PhysicalCard self) {
return new ArcheryTotalModifier(self, side,
new RequirementCondition(requirements, null, self, null, null),
amount);
}
});
}
}

View File

@@ -9,22 +9,25 @@ import com.gempukku.lotro.logic.modifiers.Modifier;
import com.gempukku.lotro.logic.modifiers.StrengthModifier;
import org.json.simple.JSONObject;
public class AddStrength implements EffectProcessor {
public class ModifyStrength implements EffectProcessor {
@Override
public void processEffect(JSONObject value, BuiltLotroCardBlueprint blueprint, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
FieldUtils.validateAllowedFields(value, "filter", "amount");
FieldUtils.validateAllowedFields(value, "filter", "condition", "amount");
final int amount = FieldUtils.getInteger(value.get("amount"), "amount");
final String filter = FieldUtils.getString(value.get("filter"), "filter");
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 StrengthModifier(self,
filterableSource.getFilterable(null, game, self, null, null), amount);
filterableSource.getFilterable(null, game, self, null, null),
new RequirementCondition(requirements, null, self, null, null), amount);
}
});
}

View File

@@ -0,0 +1,34 @@
package com.gempukku.lotro.cards.build.field.effect.modifier;
import com.gempukku.lotro.cards.build.Requirement;
import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.game.state.LotroGame;
import com.gempukku.lotro.logic.modifiers.Condition;
import com.gempukku.lotro.logic.timing.Effect;
import com.gempukku.lotro.logic.timing.EffectResult;
public class RequirementCondition implements Condition {
private Requirement[] requirements;
private String playerId;
private PhysicalCard self;
private EffectResult effectResult;
private Effect effect;
public RequirementCondition(Requirement[] requirements, String playerId, PhysicalCard self, EffectResult effectResult, Effect effect) {
this.requirements = requirements;
this.playerId = playerId;
this.self = self;
this.effectResult = effectResult;
this.effect = effect;
}
@Override
public boolean isFullfilled(LotroGame game) {
for (Requirement requirement : requirements) {
if (!requirement.accepts(playerId, game, self, effectResult, effect))
return false;
}
return true;
}
}

View File

@@ -3,7 +3,7 @@ package com.gempukku.lotro.cards.build.field.effect.requirement;
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.PlayRequirement;
import com.gempukku.lotro.cards.build.Requirement;
import com.gempukku.lotro.cards.build.field.FieldUtils;
import com.gempukku.lotro.common.Filterable;
import com.gempukku.lotro.logic.timing.PlayConditions;
@@ -11,7 +11,7 @@ import org.json.simple.JSONObject;
public class CanDiscardFromPlay implements RequirementProducer {
@Override
public PlayRequirement getPlayRequirement(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
public Requirement getPlayRequirement(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
FieldUtils.validateAllowedFields(object, "count", "filter");
final int count = FieldUtils.getInteger(object.get("count"), "count", 1);

View File

@@ -3,7 +3,7 @@ package com.gempukku.lotro.cards.build.field.effect.requirement;
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.PlayRequirement;
import com.gempukku.lotro.cards.build.Requirement;
import com.gempukku.lotro.cards.build.field.FieldUtils;
import com.gempukku.lotro.common.Filterable;
import com.gempukku.lotro.logic.timing.PlayConditions;
@@ -11,7 +11,7 @@ import org.json.simple.JSONObject;
public class CanExert implements RequirementProducer {
@Override
public PlayRequirement getPlayRequirement(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
public Requirement getPlayRequirement(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
FieldUtils.validateAllowedFields(object, "count", "times", "filter");
final int count = FieldUtils.getInteger(object.get("count"), "count", 1);

View File

@@ -3,7 +3,7 @@ package com.gempukku.lotro.cards.build.field.effect.requirement;
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.PlayRequirement;
import com.gempukku.lotro.cards.build.Requirement;
import com.gempukku.lotro.cards.build.field.FieldUtils;
import com.gempukku.lotro.common.Filterable;
import com.gempukku.lotro.logic.timing.PlayConditions;
@@ -11,7 +11,7 @@ import org.json.simple.JSONObject;
public class CanSpot implements RequirementProducer {
@Override
public PlayRequirement getPlayRequirement(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
public Requirement getPlayRequirement(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
FieldUtils.validateAllowedFields(object, "count", "filter");
final int count = FieldUtils.getInteger(object.get("count"), "count", 1);

View File

@@ -0,0 +1,18 @@
package com.gempukku.lotro.cards.build.field.effect.requirement;
import com.gempukku.lotro.cards.build.CardGenerationEnvironment;
import com.gempukku.lotro.cards.build.InvalidCardDefinitionException;
import com.gempukku.lotro.cards.build.Requirement;
import com.gempukku.lotro.cards.build.field.FieldUtils;
import com.gempukku.lotro.logic.timing.PlayConditions;
import org.json.simple.JSONObject;
public class CanSpotBurdens implements RequirementProducer {
@Override
public Requirement getPlayRequirement(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
FieldUtils.validateAllowedFields(object, "amount");
final int count = FieldUtils.getInteger(object.get("amount"), "amount", 1);
return (playerId, game, self, effectResult, effect) -> PlayConditions.canSpotBurdens(game, count);
}
}

View File

@@ -8,7 +8,7 @@ import org.json.simple.JSONObject;
public class CanStackTopCardOfDrawDeck implements RequirementProducer {
@Override
public PlayRequirement getPlayRequirement(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
public Requirement getPlayRequirement(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
FieldUtils.validateAllowedFields(object, "deck", "where", "count");
final String deck = FieldUtils.getString(object.get("deck"), "deck", "owner");

View File

@@ -0,0 +1,25 @@
package com.gempukku.lotro.cards.build.field.effect.requirement;
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.Requirement;
import com.gempukku.lotro.cards.build.field.FieldUtils;
import com.gempukku.lotro.cards.build.field.effect.appender.resolver.PlayerResolver;
import com.gempukku.lotro.logic.timing.PlayConditions;
import org.json.simple.JSONObject;
public class ControlsSite implements RequirementProducer {
@Override
public Requirement getPlayRequirement(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
FieldUtils.validateAllowedFields(object, "player");
final String player = FieldUtils.getString(object.get("player"), "player", "owner");
final PlayerSource playerSource = PlayerResolver.resolvePlayer(player, environment);
return (playerId, game, self, effectResult, effect) -> {
return PlayConditions.controllsSite(game,
playerSource.getPlayer(playerId, game, self, effectResult, effect));
};
}
}

View File

@@ -2,7 +2,7 @@ package com.gempukku.lotro.cards.build.field.effect.requirement;
import com.gempukku.lotro.cards.build.CardGenerationEnvironment;
import com.gempukku.lotro.cards.build.InvalidCardDefinitionException;
import com.gempukku.lotro.cards.build.PlayRequirement;
import com.gempukku.lotro.cards.build.Requirement;
import com.gempukku.lotro.cards.build.field.FieldUtils;
import org.json.simple.JSONObject;
@@ -17,13 +17,22 @@ public class RequirementFactory {
requirementProducers.put("canexert", new CanExert());
requirementProducers.put("canspot", new CanSpot());
requirementProducers.put("canstacktopcardofdrawdeck", new CanStackTopCardOfDrawDeck());
requirementProducers.put("canspotburdens", new CanSpotBurdens());
requirementProducers.put("controlssite", new ControlsSite());
}
public PlayRequirement getRequirement(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
public Requirement getRequirement(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
final String type = FieldUtils.getString(object.get("type"), "type");
final RequirementProducer requirementProducer = requirementProducers.get(type.toLowerCase());
if (requirementProducer == null)
throw new InvalidCardDefinitionException("Unable to resolve requirement of type: " + type);
return requirementProducer.getPlayRequirement(object, environment);
}
public Requirement[] getRequirements(JSONObject[] object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
Requirement[] result = new Requirement[object.length];
for (int i = 0; i < object.length; i++)
result[i] = getRequirement(object[i], environment);
return result;
}
}

View File

@@ -2,9 +2,9 @@ package com.gempukku.lotro.cards.build.field.effect.requirement;
import com.gempukku.lotro.cards.build.CardGenerationEnvironment;
import com.gempukku.lotro.cards.build.InvalidCardDefinitionException;
import com.gempukku.lotro.cards.build.PlayRequirement;
import com.gempukku.lotro.cards.build.Requirement;
import org.json.simple.JSONObject;
public interface RequirementProducer {
PlayRequirement getPlayRequirement(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException;
Requirement getPlayRequirement(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException;
}

View File

@@ -1,7 +1,7 @@
package com.gempukku.lotro.cards.build.field.effect.trigger;
import com.gempukku.lotro.cards.build.PlayRequirement;
import com.gempukku.lotro.cards.build.Requirement;
public interface TriggerChecker extends PlayRequirement {
public interface TriggerChecker extends Requirement {
boolean isBefore();
}

View File

@@ -154,7 +154,7 @@ public class GameStats {
resistanceStr = "F" + resistance;
else if (signet == Signet.GANDALF)
resistanceStr = "G" + resistance;
else if (signet == Signet.THÉODEN)
else if (signet == Signet.THEODEN)
resistanceStr = "T" + resistance;
else
resistanceStr = String.valueOf(resistance);