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
filter: choose(culture(dwarven),character)
count: {
type: forEachCultureOver
type: forEachCulture
filter: side(shadow)
}
}

View File

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

View File

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

View File

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

View File

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

View File

@@ -340,7 +340,7 @@
player: fp
filter: choose(companion)
count: {
type: forEachCultureOver
type: forEachCulture
over: 2
}
}
@@ -466,7 +466,7 @@
modifier: {
type: modifyMoveLimit
amount: {
type: forEachCultureOver
type: forEachCulture
over: 2
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.modifiers.ArcheryTotalModifier;
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.timing.PlayConditions;
@@ -45,7 +46,7 @@ public class Card15_019 extends AbstractCompanion {
action.appendEffect(
new AddUntilEndOfPhaseModifierEffect(
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)))));
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.modifiers.Modifier;
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.LimitEvaluator;
@@ -34,6 +35,6 @@ public class Card18_064 extends AbstractAttachable {
@Override
public List<? extends Modifier> getInPlayModifiers(LotroGame game, PhysicalCard self) {
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.modifiers.StrengthModifier;
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.timing.PlayConditions;
@@ -45,7 +46,7 @@ public class Card3_035 extends AbstractPermanent {
action.insertEffect(
new AddUntilEndOfPhaseModifierEffect(
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)))));
}
});

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.modifiers.ArcheryTotalModifier;
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.timing.PlayConditions;
@@ -42,7 +43,7 @@ public class Card6_080 extends AbstractMinion {
new RemoveTwilightEffect(3));
action.appendEffect(
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 null;

View File

@@ -51,7 +51,7 @@ public class Card6_095 extends AbstractCompanion {
action.appendEffect(
new AddUntilEndOfPhaseModifierEffect(
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 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.modifiers.StrengthModifier;
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.NegativeEvaluator;
import com.gempukku.lotro.logic.timing.PlayConditions;
@@ -53,7 +54,7 @@ public class Card7_293 extends AbstractMinion {
new AddUntilEndOfPhaseModifierEffect(
new StrengthModifier(self, card, null,
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))))));
}
});

View File

@@ -56,7 +56,7 @@ public class Card8_023 extends AbstractPermanent {
action.appendEffect(
new AddUntilEndOfPhaseModifierEffect(
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)))));
return Collections.singletonList(action);
}

View File

@@ -178,16 +178,16 @@ public class ValueResolver {
return new ConstantEvaluator(count);
};
} else if (type.equalsIgnoreCase("limit")) {
FieldUtils.validateAllowedFields(object, "value", "amount");
final int limit = FieldUtils.getInteger(object.get("value"), "value");
ValueSource valueSource = resolveEvaluator(object.get("amount"), 0, environment);
return (actionContext) -> new LimitEvaluator(valueSource.getEvaluator(actionContext), limit);
FieldUtils.validateAllowedFields(object, "limit", "value");
ValueSource limitSource = resolveEvaluator(object.get("limit"), 1, environment);
ValueSource valueSource = resolveEvaluator(object.get("value"), 0, environment);
return (actionContext) -> new LimitEvaluator(valueSource.getEvaluator(actionContext), limitSource.getEvaluator(actionContext));
} else if (type.equalsIgnoreCase("cardphaselimit")) {
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);
return (actionContext) -> new CardPhaseLimitEvaluator(actionContext.getGame(), actionContext.getSource(),
actionContext.getGame().getGameState().getCurrentPhase(), limit,
actionContext.getGame().getGameState().getCurrentPhase(), limitSource.getEvaluator(actionContext),
valueSource.getEvaluator(actionContext));
} else if (type.equalsIgnoreCase("countStacked")) {
FieldUtils.validateAllowedFields(object, "on", "filter");
@@ -227,7 +227,7 @@ public class ValueResolver {
return Math.min(limit, count);
}
});
} else if (type.equalsIgnoreCase("forEachCultureOver")) {
} else if (type.equalsIgnoreCase("forEachCulture")) {
FieldUtils.validateAllowedFields(object, "over", "filter");
final int over = FieldUtils.getInteger(object.get("over"), "over", 0);
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())));
simpleFilters.put("siteincurrentregion",
(actionContext) -> Filters.siteInCurrentRegion);
simpleFilters.put("siteinregion2",
(actionContext) -> Filters.and(CardType.SITE, Filters.region(2)));
simpleFilters.put("sitehassitenumber",
(actionContext) -> Filters.siteHasSiteNumber);
simpleFilters.put("idinstored",
(actionContext ->
new Filter() {

View File

@@ -751,6 +751,15 @@ public class Filters {
public static Filter siteNumber(final int 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) {
return new Filter() {

View File

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

View File

@@ -4,16 +4,16 @@ import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.game.state.LotroGame;
public class LimitEvaluator implements Evaluator {
private final int _limit;
private final Evaluator _evaluator;
private final Evaluator _limit;
private final Evaluator _value;
public LimitEvaluator(Evaluator evaluator, int limit) {
_evaluator = evaluator;
_limit = limit;
public LimitEvaluator(Evaluator valueEvaluator, Evaluator limitEvaluator) {
_value = valueEvaluator;
_limit = limitEvaluator;
}
@Override
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));
}
}