Cleaned up several value evaluators for clarity within the JSON. Removed "siteinregion2" as redundant with "regionNumber(2)". Added siteHasSiteNumber filter.

This commit is contained in:
Christian 'ketura' McCarty
2022-08-16 19:27:57 -05:00
parent 6437896cd8
commit 8aad76e52f
18 changed files with 52 additions and 37 deletions

View File

@@ -87,7 +87,7 @@
type: exert type: exert
filter: choose(culture(dwarven),character) filter: choose(culture(dwarven),character)
count: { count: {
type: forEachCultureOver type: forEachCulture
filter: side(shadow) filter: side(shadow)
} }
} }

View File

@@ -39,7 +39,7 @@
} }
requires: { requires: {
type: location type: location
filter: siteinregion2 filter: regionNumber(2)
} }
cost: { cost: {
type: discardFromHand type: discardFromHand

View File

@@ -258,7 +258,7 @@
type: memorizenumber type: memorizenumber
memory: stackedCultures memory: stackedCultures
amount:{ amount:{
type: forEachCultureOver type: forEachCulture
over: 0 over: 0
filter: cultureFromMemory(stackedCards) filter: cultureFromMemory(stackedCards)
} }

View File

@@ -353,8 +353,8 @@
keyword: damage keyword: damage
amount: { amount: {
type: limit type: limit
value: 2 limit: 2
amount: { value: {
type: countStacked type: countStacked
on: self on: self
} }

View File

@@ -862,8 +862,8 @@
filter: choose(companion) filter: choose(companion)
count: { count: {
type: limit type: limit
value: 3 limit: 3
amount: { value: {
type: countStacked type: countStacked
on: culture(isengard),artifact on: culture(isengard),artifact
filter: culture(isengard),spell filter: culture(isengard),spell

View File

@@ -340,7 +340,7 @@
player: fp player: fp
filter: choose(companion) filter: choose(companion)
count: { count: {
type: forEachCultureOver type: forEachCulture
over: 2 over: 2
} }
} }
@@ -466,7 +466,7 @@
modifier: { modifier: {
type: modifyMoveLimit type: modifyMoveLimit
amount: { amount: {
type: forEachCultureOver type: forEachCulture
over: 2 over: 2
filter: companion filter: companion
} }

View File

@@ -9,6 +9,7 @@ import com.gempukku.lotro.logic.effects.AddUntilEndOfPhaseModifierEffect;
import com.gempukku.lotro.logic.effects.SelfExertEffect; import com.gempukku.lotro.logic.effects.SelfExertEffect;
import com.gempukku.lotro.logic.modifiers.ArcheryTotalModifier; import com.gempukku.lotro.logic.modifiers.ArcheryTotalModifier;
import com.gempukku.lotro.logic.modifiers.evaluator.CardPhaseLimitEvaluator; import com.gempukku.lotro.logic.modifiers.evaluator.CardPhaseLimitEvaluator;
import com.gempukku.lotro.logic.modifiers.evaluator.ConstantEvaluator;
import com.gempukku.lotro.logic.modifiers.evaluator.CountActiveEvaluator; import com.gempukku.lotro.logic.modifiers.evaluator.CountActiveEvaluator;
import com.gempukku.lotro.logic.timing.PlayConditions; import com.gempukku.lotro.logic.timing.PlayConditions;
@@ -45,7 +46,7 @@ public class Card15_019 extends AbstractCompanion {
action.appendEffect( action.appendEffect(
new AddUntilEndOfPhaseModifierEffect( new AddUntilEndOfPhaseModifierEffect(
new ArcheryTotalModifier(self, Side.FREE_PEOPLE, null, new ArcheryTotalModifier(self, Side.FREE_PEOPLE, null,
new CardPhaseLimitEvaluator(game, self, Phase.ARCHERY, 3, new CardPhaseLimitEvaluator(game, self, Phase.ARCHERY, new ConstantEvaluator(3),
new CountActiveEvaluator(CardType.MINION, Keyword.HUNTER))))); new CountActiveEvaluator(CardType.MINION, Keyword.HUNTER)))));
return Collections.singletonList(action); return Collections.singletonList(action);
} }

View File

@@ -7,6 +7,7 @@ import com.gempukku.lotro.game.state.LotroGame;
import com.gempukku.lotro.logic.cardtype.AbstractAttachable; import com.gempukku.lotro.logic.cardtype.AbstractAttachable;
import com.gempukku.lotro.logic.modifiers.Modifier; import com.gempukku.lotro.logic.modifiers.Modifier;
import com.gempukku.lotro.logic.modifiers.StrengthModifier; import com.gempukku.lotro.logic.modifiers.StrengthModifier;
import com.gempukku.lotro.logic.modifiers.evaluator.ConstantEvaluator;
import com.gempukku.lotro.logic.modifiers.evaluator.CountCultureTokensEvaluator; import com.gempukku.lotro.logic.modifiers.evaluator.CountCultureTokensEvaluator;
import com.gempukku.lotro.logic.modifiers.evaluator.LimitEvaluator; import com.gempukku.lotro.logic.modifiers.evaluator.LimitEvaluator;
@@ -34,6 +35,6 @@ public class Card18_064 extends AbstractAttachable {
@Override @Override
public List<? extends Modifier> getInPlayModifiers(LotroGame game, PhysicalCard self) { public List<? extends Modifier> getInPlayModifiers(LotroGame game, PhysicalCard self) {
return Collections.singletonList(new StrengthModifier(self, Filters.hasAttached(self), null, return Collections.singletonList(new StrengthModifier(self, Filters.hasAttached(self), null,
new LimitEvaluator(new CountCultureTokensEvaluator(Token.MEN, Filters.any), 5))); new LimitEvaluator(new CountCultureTokensEvaluator(Token.MEN, Filters.any), new ConstantEvaluator(5))));
} }
} }

View File

@@ -11,6 +11,7 @@ import com.gempukku.lotro.logic.effects.ChooseActiveCardEffect;
import com.gempukku.lotro.logic.effects.choose.ChooseAndExertCharactersEffect; import com.gempukku.lotro.logic.effects.choose.ChooseAndExertCharactersEffect;
import com.gempukku.lotro.logic.modifiers.StrengthModifier; import com.gempukku.lotro.logic.modifiers.StrengthModifier;
import com.gempukku.lotro.logic.modifiers.evaluator.CardPhaseLimitEvaluator; import com.gempukku.lotro.logic.modifiers.evaluator.CardPhaseLimitEvaluator;
import com.gempukku.lotro.logic.modifiers.evaluator.ConstantEvaluator;
import com.gempukku.lotro.logic.modifiers.evaluator.CountActiveEvaluator; import com.gempukku.lotro.logic.modifiers.evaluator.CountActiveEvaluator;
import com.gempukku.lotro.logic.timing.PlayConditions; import com.gempukku.lotro.logic.timing.PlayConditions;
@@ -45,7 +46,7 @@ public class Card3_035 extends AbstractPermanent {
action.insertEffect( action.insertEffect(
new AddUntilEndOfPhaseModifierEffect( new AddUntilEndOfPhaseModifierEffect(
new StrengthModifier(self, Filters.sameCard(card), null, new StrengthModifier(self, Filters.sameCard(card), null,
new CardPhaseLimitEvaluator(game, self, Phase.SKIRMISH, 3, new CardPhaseLimitEvaluator(game, self, Phase.SKIRMISH, new ConstantEvaluator(3),
new CountActiveEvaluator(CardType.COMPANION, Signet.GANDALF))))); new CountActiveEvaluator(CardType.COMPANION, Signet.GANDALF)))));
} }
}); });

View File

@@ -9,6 +9,7 @@ import com.gempukku.lotro.logic.effects.AddUntilEndOfPhaseModifierEffect;
import com.gempukku.lotro.logic.effects.RemoveTwilightEffect; import com.gempukku.lotro.logic.effects.RemoveTwilightEffect;
import com.gempukku.lotro.logic.modifiers.ArcheryTotalModifier; import com.gempukku.lotro.logic.modifiers.ArcheryTotalModifier;
import com.gempukku.lotro.logic.modifiers.evaluator.CardPhaseLimitEvaluator; import com.gempukku.lotro.logic.modifiers.evaluator.CardPhaseLimitEvaluator;
import com.gempukku.lotro.logic.modifiers.evaluator.ConstantEvaluator;
import com.gempukku.lotro.logic.modifiers.evaluator.CountActiveEvaluator; import com.gempukku.lotro.logic.modifiers.evaluator.CountActiveEvaluator;
import com.gempukku.lotro.logic.timing.PlayConditions; import com.gempukku.lotro.logic.timing.PlayConditions;
@@ -42,7 +43,7 @@ public class Card6_080 extends AbstractMinion {
new RemoveTwilightEffect(3)); new RemoveTwilightEffect(3));
action.appendEffect( action.appendEffect(
new AddUntilEndOfPhaseModifierEffect( new AddUntilEndOfPhaseModifierEffect(
new ArcheryTotalModifier(self, Side.SHADOW, null, new CardPhaseLimitEvaluator(game, self, Phase.ARCHERY, 4, new CountActiveEvaluator(4, (Integer) null, CardType.COMPANION))))); new ArcheryTotalModifier(self, Side.SHADOW, null, new CardPhaseLimitEvaluator(game, self, Phase.ARCHERY, new ConstantEvaluator(4), new CountActiveEvaluator(4, (Integer) null, CardType.COMPANION)))));
return Collections.singletonList(action); return Collections.singletonList(action);
} }
return null; return null;

View File

@@ -51,7 +51,7 @@ public class Card6_095 extends AbstractCompanion {
action.appendEffect( action.appendEffect(
new AddUntilEndOfPhaseModifierEffect( new AddUntilEndOfPhaseModifierEffect(
new StrengthModifier(self, self, null, new StrengthModifier(self, self, null,
new CardPhaseLimitEvaluator(game, self, Phase.SKIRMISH, 3, new ConstantEvaluator(3))))); new CardPhaseLimitEvaluator(game, self, Phase.SKIRMISH, new ConstantEvaluator(3), new ConstantEvaluator(3)))));
return Collections.singletonList(action); return Collections.singletonList(action);
} }
return null; return null;

View File

@@ -14,6 +14,7 @@ import com.gempukku.lotro.logic.effects.ChooseActiveCardEffect;
import com.gempukku.lotro.logic.effects.ChooseAndDiscardCardsFromHandEffect; import com.gempukku.lotro.logic.effects.ChooseAndDiscardCardsFromHandEffect;
import com.gempukku.lotro.logic.modifiers.StrengthModifier; import com.gempukku.lotro.logic.modifiers.StrengthModifier;
import com.gempukku.lotro.logic.modifiers.evaluator.CardPhaseLimitEvaluator; import com.gempukku.lotro.logic.modifiers.evaluator.CardPhaseLimitEvaluator;
import com.gempukku.lotro.logic.modifiers.evaluator.ConstantEvaluator;
import com.gempukku.lotro.logic.modifiers.evaluator.CountActiveEvaluator; import com.gempukku.lotro.logic.modifiers.evaluator.CountActiveEvaluator;
import com.gempukku.lotro.logic.modifiers.evaluator.NegativeEvaluator; import com.gempukku.lotro.logic.modifiers.evaluator.NegativeEvaluator;
import com.gempukku.lotro.logic.timing.PlayConditions; import com.gempukku.lotro.logic.timing.PlayConditions;
@@ -53,7 +54,7 @@ public class Card7_293 extends AbstractMinion {
new AddUntilEndOfPhaseModifierEffect( new AddUntilEndOfPhaseModifierEffect(
new StrengthModifier(self, card, null, new StrengthModifier(self, card, null,
new NegativeEvaluator( new NegativeEvaluator(
new CardPhaseLimitEvaluator(game, self, Phase.SKIRMISH, 3, new CardPhaseLimitEvaluator(game, self, Phase.SKIRMISH, new ConstantEvaluator(3),
new CountActiveEvaluator(Filters.not(self), Culture.SAURON, Race.ORC)))))); new CountActiveEvaluator(Filters.not(self), Culture.SAURON, Race.ORC))))));
} }
}); });

View File

@@ -56,7 +56,7 @@ public class Card8_023 extends AbstractPermanent {
action.appendEffect( action.appendEffect(
new AddUntilEndOfPhaseModifierEffect( new AddUntilEndOfPhaseModifierEffect(
new StrengthModifier(self, Filters.name("Shelob"), null, new StrengthModifier(self, Filters.name("Shelob"), null,
new CardPhaseLimitEvaluator(game, self, Phase.SKIRMISH, 6, new CardPhaseLimitEvaluator(game, self, Phase.SKIRMISH, new ConstantEvaluator(6),
new ConstantEvaluator(3))))); new ConstantEvaluator(3)))));
return Collections.singletonList(action); return Collections.singletonList(action);
} }

View File

@@ -178,16 +178,16 @@ public class ValueResolver {
return new ConstantEvaluator(count); return new ConstantEvaluator(count);
}; };
} else if (type.equalsIgnoreCase("limit")) { } else if (type.equalsIgnoreCase("limit")) {
FieldUtils.validateAllowedFields(object, "value", "amount"); FieldUtils.validateAllowedFields(object, "limit", "value");
final int limit = FieldUtils.getInteger(object.get("value"), "value"); ValueSource limitSource = resolveEvaluator(object.get("limit"), 1, environment);
ValueSource valueSource = resolveEvaluator(object.get("amount"), 0, environment); ValueSource valueSource = resolveEvaluator(object.get("value"), 0, environment);
return (actionContext) -> new LimitEvaluator(valueSource.getEvaluator(actionContext), limit); return (actionContext) -> new LimitEvaluator(valueSource.getEvaluator(actionContext), limitSource.getEvaluator(actionContext));
} else if (type.equalsIgnoreCase("cardphaselimit")) { } else if (type.equalsIgnoreCase("cardphaselimit")) {
FieldUtils.validateAllowedFields(object, "limit", "amount"); FieldUtils.validateAllowedFields(object, "limit", "amount");
final int limit = FieldUtils.getInteger(object.get("limit"), "limit"); ValueSource limitSource = resolveEvaluator(object.get("limit"), 0, environment);
ValueSource valueSource = resolveEvaluator(object.get("amount"), 0, environment); ValueSource valueSource = resolveEvaluator(object.get("amount"), 0, environment);
return (actionContext) -> new CardPhaseLimitEvaluator(actionContext.getGame(), actionContext.getSource(), return (actionContext) -> new CardPhaseLimitEvaluator(actionContext.getGame(), actionContext.getSource(),
actionContext.getGame().getGameState().getCurrentPhase(), limit, actionContext.getGame().getGameState().getCurrentPhase(), limitSource.getEvaluator(actionContext),
valueSource.getEvaluator(actionContext)); valueSource.getEvaluator(actionContext));
} else if (type.equalsIgnoreCase("countStacked")) { } else if (type.equalsIgnoreCase("countStacked")) {
FieldUtils.validateAllowedFields(object, "on", "filter"); FieldUtils.validateAllowedFields(object, "on", "filter");
@@ -227,7 +227,7 @@ public class ValueResolver {
return Math.min(limit, count); return Math.min(limit, count);
} }
}); });
} else if (type.equalsIgnoreCase("forEachCultureOver")) { } else if (type.equalsIgnoreCase("forEachCulture")) {
FieldUtils.validateAllowedFields(object, "over", "filter"); FieldUtils.validateAllowedFields(object, "over", "filter");
final int over = FieldUtils.getInteger(object.get("over"), "over", 0); final int over = FieldUtils.getInteger(object.get("over"), "over", 0);
final String filter = FieldUtils.getString(object.get("filter"), "filter", "any"); final String filter = FieldUtils.getString(object.get("filter"), "filter", "any");

View File

@@ -76,8 +76,8 @@ public class FilterFactory {
(actionContext -> Filters.siteNumber(actionContext.getGame().getGameState().getCurrentSiteNumber()))); (actionContext -> Filters.siteNumber(actionContext.getGame().getGameState().getCurrentSiteNumber())));
simpleFilters.put("siteincurrentregion", simpleFilters.put("siteincurrentregion",
(actionContext) -> Filters.siteInCurrentRegion); (actionContext) -> Filters.siteInCurrentRegion);
simpleFilters.put("siteinregion2", simpleFilters.put("sitehassitenumber",
(actionContext) -> Filters.and(CardType.SITE, Filters.region(2))); (actionContext) -> Filters.siteHasSiteNumber);
simpleFilters.put("idinstored", simpleFilters.put("idinstored",
(actionContext -> (actionContext ->
new Filter() { new Filter() {

View File

@@ -751,6 +751,15 @@ public class Filters {
public static Filter siteNumber(final int siteNumber) { public static Filter siteNumber(final int siteNumber) {
return siteNumberBetweenInclusive(siteNumber, siteNumber); return siteNumberBetweenInclusive(siteNumber, siteNumber);
} }
public static Filter siteHasSiteNumber = Filters.and(CardType.SITE,
new Filter() {
@Override
public boolean accepts(LotroGame game, PhysicalCard physicalCard) {
int bpNumber = physicalCard.getBlueprint().getSiteNumber();
Integer siteNumber = physicalCard.getSiteNumber();
return Objects.requireNonNullElse(siteNumber, bpNumber) != 0;
}
});
public static Filter siteNumberBetweenInclusive(final int minSiteNumber, final int maxSiteNumber) { public static Filter siteNumberBetweenInclusive(final int minSiteNumber, final int maxSiteNumber) {
return new Filter() { return new Filter() {

View File

@@ -8,25 +8,26 @@ import com.gempukku.lotro.logic.modifiers.LimitCounter;
public class CardPhaseLimitEvaluator implements Evaluator { public class CardPhaseLimitEvaluator implements Evaluator {
private Integer _evaluated; private Integer _evaluated;
private final Evaluator _evaluator; private final Evaluator _amount;
private final LotroGame _game; private final LotroGame _game;
private final PhysicalCard _source; private final PhysicalCard _source;
private final Phase _phase; private final Phase _phase;
private final int _limit; private final Evaluator _limit;
public CardPhaseLimitEvaluator(LotroGame game, PhysicalCard source, Phase phase, int limit, Evaluator evaluator) { public CardPhaseLimitEvaluator(LotroGame game, PhysicalCard source, Phase phase, Evaluator limit, Evaluator amount) {
_game = game; _game = game;
_source = source; _source = source;
_phase = phase; _phase = phase;
_limit = limit; _limit = limit;
_evaluator = evaluator; _amount = amount;
} }
private int evaluateOnce(LotroGame game, PhysicalCard cardAffected) { private int evaluateOnce(LotroGame game, PhysicalCard cardAffected) {
LimitCounter limitCounter = game.getModifiersQuerying().getUntilEndOfPhaseLimitCounter(_source, _phase); LimitCounter limitCounter = game.getModifiersQuerying().getUntilEndOfPhaseLimitCounter(_source, _phase);
int internalResult = _evaluator.evaluateExpression(game, cardAffected); int amountResult = _amount.evaluateExpression(game, cardAffected);
return limitCounter.incrementToLimit(_limit, internalResult); int limitResult = _amount.evaluateExpression(game, cardAffected);
return limitCounter.incrementToLimit(limitResult, amountResult);
} }
@Override @Override

View File

@@ -4,16 +4,16 @@ import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.game.state.LotroGame; import com.gempukku.lotro.game.state.LotroGame;
public class LimitEvaluator implements Evaluator { public class LimitEvaluator implements Evaluator {
private final int _limit; private final Evaluator _limit;
private final Evaluator _evaluator; private final Evaluator _value;
public LimitEvaluator(Evaluator evaluator, int limit) { public LimitEvaluator(Evaluator valueEvaluator, Evaluator limitEvaluator) {
_evaluator = evaluator; _value = valueEvaluator;
_limit = limit; _limit = limitEvaluator;
} }
@Override @Override
public int evaluateExpression(LotroGame game, PhysicalCard cardAffected) { public int evaluateExpression(LotroGame game, PhysicalCard cardAffected) {
return Math.min(_limit, _evaluator.evaluateExpression(game, cardAffected)); return Math.min( _limit.evaluateExpression(game, cardAffected), _value.evaluateExpression(game, cardAffected));
} }
} }