Multiply ValueSource

This commit is contained in:
marcin.sciesinski
2019-08-29 21:21:27 -07:00
parent 132278e3a0
commit 41028ac8d4
5 changed files with 53 additions and 7 deletions

View File

@@ -857,6 +857,34 @@
"by": "side(shadow)"
}
},
"40_30": {
"title": "Take Cover!",
"side": "free people",
"culture": "dwarven",
"cost": 2,
"type": "event",
"keyword": "archery",
"effects": {
"type": "event",
"cost": {
"type": "discard",
"filter": "choose(culture(dwarven),condition)",
"memorizeStackedCards": "stackedCards"
},
"effect": {
"type": "modifyArcheryTotal",
"side": "shadow",
"amount": {
"type": "multiply",
"source": {
"type": "forEachInMemory",
"memory": "stackedCards"
},
"multiplier": -1
}
}
}
},
"40_184": {
"title": "Black Steed",
"subtitle": "Bred to Serve",

View File

@@ -18,15 +18,18 @@ import com.gempukku.lotro.logic.timing.EffectResult;
import org.json.simple.JSONObject;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
public class DiscardFromPlay implements EffectAppenderProducer {
@Override
public EffectAppender createEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
FieldUtils.validateAllowedFields(effectObject, "count", "filter", "memorize");
FieldUtils.validateAllowedFields(effectObject, "count", "filter", "memorize", "memorizeStackedCards");
final ValueSource valueSource = ValueResolver.resolveEvaluator(effectObject.get("count"), 1, environment);
final String filter = FieldUtils.getString(effectObject.get("filter"), "filter");
final String memory = FieldUtils.getString(effectObject.get("memorize"), "memorize", "_temp");
final String stackedCardsMemory = FieldUtils.getString(effectObject.get("memorizeStackedCards"), "memorizeStackedCards");
MultiEffectAppender result = new MultiEffectAppender();
@@ -39,6 +42,14 @@ public class DiscardFromPlay implements EffectAppenderProducer {
@Override
protected Effect createEffect(CostToEffectAction action, String playerId, LotroGame game, PhysicalCard self, EffectResult effectResult, Effect effect) {
final Collection<? extends PhysicalCard> cardsFromMemory = action.getCardsFromMemory(memory);
if (stackedCardsMemory != null) {
List<PhysicalCard> stackedCards = new LinkedList<>();
for (PhysicalCard physicalCard : cardsFromMemory) {
stackedCards.addAll(game.getGameState().getStackedCards(physicalCard));
}
action.setCardMemory(stackedCardsMemory, stackedCards);
}
return new DiscardCardsFromPlayEffect(playerId, self, Filters.in(cardsFromMemory));
}
});

View File

@@ -41,7 +41,8 @@ public class DrawCards implements EffectAppenderProducer {
protected Effect createEffect(CostToEffectAction action, String playerId, LotroGame game, PhysicalCard self, EffectResult effectResult, Effect effect) {
final String drawPlayer = playerSource.getPlayer(playerId, game, self, effectResult, effect);
final Evaluator evaluator = count.getEvaluator(action, playerId, game, self, effectResult, effect);
return new DrawCardsEffect(action, drawPlayer, evaluator);
final int cardsDrawn = evaluator.evaluateExpression(game, null);
return new DrawCardsEffect(action, drawPlayer, cardsDrawn);
}
};
}

View File

@@ -2,15 +2,18 @@ package com.gempukku.lotro.cards.build.field.effect.appender;
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.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.ValueResolver;
import com.gempukku.lotro.common.Side;
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.AddUntilEndOfPhaseModifierEffect;
import com.gempukku.lotro.logic.modifiers.ArcheryTotalModifier;
import com.gempukku.lotro.logic.modifiers.evaluator.Evaluator;
import com.gempukku.lotro.logic.timing.Effect;
import com.gempukku.lotro.logic.timing.EffectResult;
import org.json.simple.JSONObject;
@@ -20,12 +23,14 @@ public class ModifyArcheryTotal implements EffectAppenderProducer {
public EffectAppender createEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
FieldUtils.validateAllowedFields(effectObject, "amount", "side");
final int amount = FieldUtils.getInteger(effectObject.get("amount"), "amount");
final ValueSource valueSource = ValueResolver.resolveEvaluator(effectObject.get("amount"), 0, environment);
final Side side = FieldUtils.getEnum(Side.class, effectObject.get("side"), "side");
return new DelayedAppender() {
@Override
protected Effect createEffect(CostToEffectAction action, String playerId, LotroGame game, PhysicalCard self, EffectResult effectResult, Effect effect) {
final Evaluator evaluator = valueSource.getEvaluator(action, playerId, game, self, effectResult, effect);
final int amount = evaluator.evaluateExpression(game, null);
return new AddUntilEndOfPhaseModifierEffect(
new ArcheryTotalModifier(self, side, amount));
}

View File

@@ -8,10 +8,7 @@ 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.CostToEffectAction;
import com.gempukku.lotro.logic.modifiers.evaluator.ConstantEvaluator;
import com.gempukku.lotro.logic.modifiers.evaluator.CountStackedEvaluator;
import com.gempukku.lotro.logic.modifiers.evaluator.Evaluator;
import com.gempukku.lotro.logic.modifiers.evaluator.LimitEvaluator;
import com.gempukku.lotro.logic.modifiers.evaluator.*;
import com.gempukku.lotro.logic.timing.Effect;
import com.gempukku.lotro.logic.timing.EffectResult;
import org.json.simple.JSONObject;
@@ -91,6 +88,10 @@ public class ValueResolver {
final Filterable on1 = onFilter.getFilterable(playerId, game, self, effectResult, effect);
return new CountStackedEvaluator(on1, Filters.any);
};
} else if (type.equalsIgnoreCase("multiply")) {
final int multiplier = FieldUtils.getInteger(object.get("multiplier"), "multiplier");
final ValueSource valueSource = ValueResolver.resolveEvaluator(object.get("source"), 0, environment);
return (action, playerId, game, self, effectResult, effect) -> new MultiplyEvaluator(multiplier, valueSource.getEvaluator(action, playerId, game, self, effectResult, effect));
} else if (type.equalsIgnoreCase("forEachVitality")) {
final int over = FieldUtils.getInteger(object.get("over"), "over", 0);
return (action, playerId, game, self, effectResult, effect) -> (game1, cardAffected) -> Math.max(0, game1.getModifiersQuerying().getVitality(game1, cardAffected) - over);