Discount effects

This commit is contained in:
marcin.sciesinski
2019-09-04 22:44:41 -07:00
parent ac3bd38590
commit b61c734eb0
6 changed files with 60 additions and 58 deletions

View File

@@ -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",

View File

@@ -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));
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}

View File

@@ -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);
}
}
}

View File

@@ -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) -> {