Multiply ValueSource
This commit is contained in:
@@ -857,6 +857,34 @@
|
|||||||
"by": "side(shadow)"
|
"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": {
|
"40_184": {
|
||||||
"title": "Black Steed",
|
"title": "Black Steed",
|
||||||
"subtitle": "Bred to Serve",
|
"subtitle": "Bred to Serve",
|
||||||
|
|||||||
@@ -18,15 +18,18 @@ import com.gempukku.lotro.logic.timing.EffectResult;
|
|||||||
import org.json.simple.JSONObject;
|
import org.json.simple.JSONObject;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class DiscardFromPlay implements EffectAppenderProducer {
|
public class DiscardFromPlay implements EffectAppenderProducer {
|
||||||
@Override
|
@Override
|
||||||
public EffectAppender createEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
|
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 ValueSource valueSource = ValueResolver.resolveEvaluator(effectObject.get("count"), 1, environment);
|
||||||
final String filter = FieldUtils.getString(effectObject.get("filter"), "filter");
|
final String filter = FieldUtils.getString(effectObject.get("filter"), "filter");
|
||||||
final String memory = FieldUtils.getString(effectObject.get("memorize"), "memorize", "_temp");
|
final String memory = FieldUtils.getString(effectObject.get("memorize"), "memorize", "_temp");
|
||||||
|
final String stackedCardsMemory = FieldUtils.getString(effectObject.get("memorizeStackedCards"), "memorizeStackedCards");
|
||||||
|
|
||||||
MultiEffectAppender result = new MultiEffectAppender();
|
MultiEffectAppender result = new MultiEffectAppender();
|
||||||
|
|
||||||
@@ -39,6 +42,14 @@ public class DiscardFromPlay implements EffectAppenderProducer {
|
|||||||
@Override
|
@Override
|
||||||
protected Effect createEffect(CostToEffectAction action, String playerId, LotroGame game, PhysicalCard self, EffectResult effectResult, Effect effect) {
|
protected Effect createEffect(CostToEffectAction action, String playerId, LotroGame game, PhysicalCard self, EffectResult effectResult, Effect effect) {
|
||||||
final Collection<? extends PhysicalCard> cardsFromMemory = action.getCardsFromMemory(memory);
|
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));
|
return new DiscardCardsFromPlayEffect(playerId, self, Filters.in(cardsFromMemory));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -41,7 +41,8 @@ public class DrawCards implements EffectAppenderProducer {
|
|||||||
protected Effect createEffect(CostToEffectAction action, String playerId, LotroGame game, PhysicalCard self, EffectResult effectResult, Effect effect) {
|
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 String drawPlayer = playerSource.getPlayer(playerId, game, self, effectResult, effect);
|
||||||
final Evaluator evaluator = count.getEvaluator(action, 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);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.CardGenerationEnvironment;
|
||||||
import com.gempukku.lotro.cards.build.InvalidCardDefinitionException;
|
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.FieldUtils;
|
||||||
import com.gempukku.lotro.cards.build.field.effect.EffectAppender;
|
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.EffectAppenderProducer;
|
||||||
|
import com.gempukku.lotro.cards.build.field.effect.appender.resolver.ValueResolver;
|
||||||
import com.gempukku.lotro.common.Side;
|
import com.gempukku.lotro.common.Side;
|
||||||
import com.gempukku.lotro.game.PhysicalCard;
|
import com.gempukku.lotro.game.PhysicalCard;
|
||||||
import com.gempukku.lotro.game.state.LotroGame;
|
import com.gempukku.lotro.game.state.LotroGame;
|
||||||
import com.gempukku.lotro.logic.actions.CostToEffectAction;
|
import com.gempukku.lotro.logic.actions.CostToEffectAction;
|
||||||
import com.gempukku.lotro.logic.effects.AddUntilEndOfPhaseModifierEffect;
|
import com.gempukku.lotro.logic.effects.AddUntilEndOfPhaseModifierEffect;
|
||||||
import com.gempukku.lotro.logic.modifiers.ArcheryTotalModifier;
|
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.Effect;
|
||||||
import com.gempukku.lotro.logic.timing.EffectResult;
|
import com.gempukku.lotro.logic.timing.EffectResult;
|
||||||
import org.json.simple.JSONObject;
|
import org.json.simple.JSONObject;
|
||||||
@@ -20,12 +23,14 @@ public class ModifyArcheryTotal implements EffectAppenderProducer {
|
|||||||
public EffectAppender createEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
|
public EffectAppender createEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
|
||||||
FieldUtils.validateAllowedFields(effectObject, "amount", "side");
|
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");
|
final Side side = FieldUtils.getEnum(Side.class, effectObject.get("side"), "side");
|
||||||
|
|
||||||
return new DelayedAppender() {
|
return new DelayedAppender() {
|
||||||
@Override
|
@Override
|
||||||
protected Effect createEffect(CostToEffectAction action, String playerId, LotroGame game, PhysicalCard self, EffectResult effectResult, Effect effect) {
|
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(
|
return new AddUntilEndOfPhaseModifierEffect(
|
||||||
new ArcheryTotalModifier(self, side, amount));
|
new ArcheryTotalModifier(self, side, amount));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,10 +8,7 @@ import com.gempukku.lotro.filters.Filters;
|
|||||||
import com.gempukku.lotro.game.PhysicalCard;
|
import com.gempukku.lotro.game.PhysicalCard;
|
||||||
import com.gempukku.lotro.game.state.LotroGame;
|
import com.gempukku.lotro.game.state.LotroGame;
|
||||||
import com.gempukku.lotro.logic.actions.CostToEffectAction;
|
import com.gempukku.lotro.logic.actions.CostToEffectAction;
|
||||||
import com.gempukku.lotro.logic.modifiers.evaluator.ConstantEvaluator;
|
import com.gempukku.lotro.logic.modifiers.evaluator.*;
|
||||||
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.timing.Effect;
|
import com.gempukku.lotro.logic.timing.Effect;
|
||||||
import com.gempukku.lotro.logic.timing.EffectResult;
|
import com.gempukku.lotro.logic.timing.EffectResult;
|
||||||
import org.json.simple.JSONObject;
|
import org.json.simple.JSONObject;
|
||||||
@@ -91,6 +88,10 @@ public class ValueResolver {
|
|||||||
final Filterable on1 = onFilter.getFilterable(playerId, game, self, effectResult, effect);
|
final Filterable on1 = onFilter.getFilterable(playerId, game, self, effectResult, effect);
|
||||||
return new CountStackedEvaluator(on1, Filters.any);
|
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")) {
|
} else if (type.equalsIgnoreCase("forEachVitality")) {
|
||||||
final int over = FieldUtils.getInteger(object.get("over"), "over", 0);
|
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);
|
return (action, playerId, game, self, effectResult, effect) -> (game1, cardAffected) -> Math.max(0, game1.getModifiersQuerying().getVitality(game1, cardAffected) - over);
|
||||||
|
|||||||
Reference in New Issue
Block a user