Discount effects
This commit is contained in:
@@ -113,6 +113,32 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"40_157": {
|
||||
"title": "*Cave Troll of Moria",
|
||||
"subtitle": "Monstrous Fiend",
|
||||
"culture": "moria",
|
||||
"cost": 10,
|
||||
"type": "minion",
|
||||
"race": "troll",
|
||||
"strength": 15,
|
||||
"vitality": 4,
|
||||
"site": 4,
|
||||
"keyword": [
|
||||
"damage+1",
|
||||
"fierce"
|
||||
],
|
||||
"effects": {
|
||||
"type": "discount",
|
||||
"amount": {
|
||||
"type": "forEachInHand",
|
||||
"filter": "culture(moria),goblin"
|
||||
},
|
||||
"discount": {
|
||||
"type": "discardFromHand",
|
||||
"filter": "culture(moria),goblin"
|
||||
}
|
||||
}
|
||||
},
|
||||
"40_166": {
|
||||
"title": "*Goblin Ransacker",
|
||||
"culture": "moria",
|
||||
|
||||
@@ -1,45 +0,0 @@
|
||||
package com.gempukku.lotro.cards.set40.moria;
|
||||
|
||||
import com.gempukku.lotro.common.Culture;
|
||||
import com.gempukku.lotro.common.Keyword;
|
||||
import com.gempukku.lotro.common.Race;
|
||||
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.cardtype.AbstractMinion;
|
||||
import com.gempukku.lotro.logic.effects.discount.DiscardCardFromHandDiscountEffect;
|
||||
|
||||
/**
|
||||
* Title: *Cave Troll of Moria, Monstrous Fiend
|
||||
* Set: Second Edition
|
||||
* Side: Shadow
|
||||
* Culture: Moria
|
||||
* Twilight Cost: 10
|
||||
* Type: Minion - Troll
|
||||
* Strength: 15
|
||||
* Vitality: 4
|
||||
* Home: 4
|
||||
* Card Number: 1R157
|
||||
* Game Text: Damage +1. Fierce.
|
||||
* When you play Cave Troll of Moria, you may discard X [MORIA] Goblins from hand; Cave Troll of Moria's twilight cost
|
||||
* is -1 for each Goblin discarded in this way.
|
||||
*/
|
||||
public class Card40_157 extends AbstractMinion {
|
||||
public Card40_157() {
|
||||
super(10, 15, 4, 4, Race.TROLL, Culture.MORIA, "Cave Troll of Moria", "Monstrous Fiend", true);
|
||||
addKeyword(Keyword.DAMAGE, 1);
|
||||
addKeyword(Keyword.FIERCE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getPotentialDiscount(LotroGame game, String playerId, PhysicalCard self) {
|
||||
return Filters.filter(game.getGameState().getHand(playerId), game, Culture.MORIA, Race.GOBLIN).size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void appendPotentialDiscountEffects(LotroGame game, CostToEffectAction action, String playerId, PhysicalCard self) {
|
||||
action.appendPotentialDiscount(
|
||||
new DiscardCardFromHandDiscountEffect(action, playerId, Culture.MORIA, Race.GOBLIN));
|
||||
}
|
||||
}
|
||||
@@ -660,7 +660,7 @@ public class BuiltLotroCardBlueprint implements LotroCardBlueprint {
|
||||
if (discountSources != null) {
|
||||
DefaultActionContext actionContext = new DefaultActionContext(playerId, game, self, null, null);
|
||||
for (DiscountSource discountSource : discountSources) {
|
||||
final DiscountEffect discountEffect = discountSource.getDiscountEffect(actionContext);
|
||||
final DiscountEffect discountEffect = discountSource.getDiscountEffect(action, actionContext);
|
||||
action.appendPotentialDiscount(discountEffect);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
package com.gempukku.lotro.cards.build;
|
||||
|
||||
import com.gempukku.lotro.logic.actions.CostToEffectAction;
|
||||
import com.gempukku.lotro.logic.effects.DiscountEffect;
|
||||
|
||||
public interface DiscountSource {
|
||||
int getPotentialDiscount(ActionContext actionContext);
|
||||
|
||||
DiscountEffect getDiscountEffect(ActionContext actionContext);
|
||||
DiscountEffect getDiscountEffect(CostToEffectAction action, ActionContext actionContext);
|
||||
}
|
||||
|
||||
@@ -4,7 +4,10 @@ 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.cards.build.field.effect.appender.resolver.ValueResolver;
|
||||
import com.gempukku.lotro.common.Filterable;
|
||||
import com.gempukku.lotro.logic.actions.CostToEffectAction;
|
||||
import com.gempukku.lotro.logic.effects.DiscountEffect;
|
||||
import com.gempukku.lotro.logic.effects.discount.DiscardCardFromHandDiscountEffect;
|
||||
import org.json.simple.JSONObject;
|
||||
|
||||
public class PotentialDiscount implements EffectProcessor {
|
||||
@@ -15,17 +18,28 @@ public class PotentialDiscount implements EffectProcessor {
|
||||
final ValueSource amountSource = ValueResolver.resolveEvaluator(value.get("amount"), 0, environment);
|
||||
final JSONObject discount = (JSONObject) value.get("discount");
|
||||
|
||||
blueprint.appendDiscountSource(
|
||||
new DiscountSource() {
|
||||
@Override
|
||||
public int getPotentialDiscount(ActionContext actionContext) {
|
||||
return amountSource.getEvaluator(actionContext).evaluateExpression(actionContext.getGame(), actionContext.getSource());
|
||||
}
|
||||
final String discountType = FieldUtils.getString(discount.get("type"), "type");
|
||||
if (discountType.equals("discardFromHand")) {
|
||||
FieldUtils.validateAllowedFields(discount, "filter");
|
||||
|
||||
@Override
|
||||
public DiscountEffect getDiscountEffect(ActionContext actionContext) {
|
||||
return null;
|
||||
}
|
||||
});
|
||||
final String filter = FieldUtils.getString(discount.get("filter"), "filter", "any");
|
||||
final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(filter, environment);
|
||||
|
||||
blueprint.appendDiscountSource(
|
||||
new DiscountSource() {
|
||||
@Override
|
||||
public int getPotentialDiscount(ActionContext actionContext) {
|
||||
return amountSource.getEvaluator(actionContext).evaluateExpression(actionContext.getGame(), actionContext.getSource());
|
||||
}
|
||||
|
||||
@Override
|
||||
public DiscountEffect getDiscountEffect(CostToEffectAction action, ActionContext actionContext) {
|
||||
final Filterable filterable = filterableSource.getFilterable(actionContext);
|
||||
return new DiscardCardFromHandDiscountEffect(action, actionContext.getPerformingPlayer(), filterable);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
throw new InvalidCardDefinitionException("Unknown type of discount: " + discountType);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -108,6 +108,12 @@ public class ValueResolver {
|
||||
final String filter = FieldUtils.getString(object.get("filter"), "filter");
|
||||
final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(filter, environment);
|
||||
return actionContext -> new CountSpottableEvaluator(filterableSource.getFilterable(actionContext));
|
||||
} else if (type.equalsIgnoreCase("forEachInHand")) {
|
||||
final String filter = FieldUtils.getString(object.get("filter"), "filter");
|
||||
final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(filter, environment);
|
||||
return actionContext ->
|
||||
(Evaluator) (game, cardAffected) -> Filters.filter(game.getGameState().getHand(actionContext.getPerformingPlayer()),
|
||||
game, filterableSource.getFilterable(actionContext)).size();
|
||||
} else if (type.equalsIgnoreCase("fromMemory")) {
|
||||
String memory = FieldUtils.getString(object.get("memory"), "memory");
|
||||
return (actionContext) -> {
|
||||
|
||||
Reference in New Issue
Block a user