diff --git a/gemp-lotr/gemp-lotr-common/src/main/java/com/gempukku/lotro/common/Culture.java b/gemp-lotr/gemp-lotr-common/src/main/java/com/gempukku/lotro/common/Culture.java index 4eca5b739..18ad853a6 100644 --- a/gemp-lotr/gemp-lotr-common/src/main/java/com/gempukku/lotro/common/Culture.java +++ b/gemp-lotr/gemp-lotr-common/src/main/java/com/gempukku/lotro/common/Culture.java @@ -42,4 +42,13 @@ public enum Culture implements Filterable { } return null; } + + public static Culture findCulture(String name) { + String nameCaps = name.toUpperCase().replace(' ', '_').replace('-', '_'); + for (Culture culture : values()) { + if (culture.getHumanReadable().equals(name) || culture.toString().equals(nameCaps)) + return culture; + } + return null; + } } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/DefaultActionSource.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/DefaultActionSource.java index 935c574bd..6e904dc3b 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/DefaultActionSource.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/DefaultActionSource.java @@ -3,6 +3,7 @@ package com.gempukku.lotro.cards.build.field.effect; import com.gempukku.lotro.cards.build.ActionContext; import com.gempukku.lotro.cards.build.ActionSource; import com.gempukku.lotro.cards.build.Requirement; +import com.gempukku.lotro.logic.GameUtils; import com.gempukku.lotro.logic.actions.CostToEffectAction; import java.util.LinkedList; @@ -54,7 +55,7 @@ public class DefaultActionSource implements ActionSource { @Override public void createAction(CostToEffectAction action, ActionContext actionContext) { if (text != null) - action.setText(text); + action.setText(GameUtils.SubstituteText(text, actionContext)); for (EffectAppender cost : costs) cost.appendEffect(true, action, actionContext); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ChooseANumber.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ChooseANumber.java index d8a2ce2d2..0fb78b60b 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ChooseANumber.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ChooseANumber.java @@ -6,6 +6,7 @@ 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.PlayerResolver; import com.gempukku.lotro.cards.build.field.effect.appender.resolver.ValueResolver; +import com.gempukku.lotro.logic.GameUtils; import com.gempukku.lotro.logic.actions.CostToEffectAction; import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException; import com.gempukku.lotro.logic.decisions.IntegerAwaitingDecision; @@ -34,7 +35,7 @@ public class ChooseANumber implements EffectAppenderProducer { @Override protected Effect createEffect(boolean cost, CostToEffectAction action, ActionContext actionContext) { return new PlayoutDecisionEffect(actionContext.getPerformingPlayer(), - new IntegerAwaitingDecision(1, displayText, + new IntegerAwaitingDecision(1, GameUtils.SubstituteText(displayText, actionContext), fromSource.getEvaluator(actionContext).evaluateExpression(actionContext.getGame(), null), toSource.getEvaluator(actionContext).evaluateExpression(actionContext.getGame(), null)) { diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ChooseCardsFromDiscard.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ChooseCardsFromDiscard.java index 89d41ae6c..511f8f599 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ChooseCardsFromDiscard.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ChooseCardsFromDiscard.java @@ -20,7 +20,7 @@ public class ChooseCardsFromDiscard implements EffectAppenderProducer { final String memorize = FieldUtils.getString(effectObject.get("memorize"), "memorize"); if (memorize == null) throw new InvalidCardDefinitionException("You need to define what memory to use to store chosen cards"); - final String text = FieldUtils.getString(effectObject.get("text"), "text"); + final String text = FieldUtils.getString(effectObject.get("text"), "text", "Choose cards from discard."); if (text == null) throw new InvalidCardDefinitionException("You need to define text to show"); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ChooseHowManyToSpot.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ChooseHowManyToSpot.java index 0e2d59fda..c2ed2e0b3 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ChooseHowManyToSpot.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ChooseHowManyToSpot.java @@ -9,6 +9,7 @@ import com.gempukku.lotro.cards.build.field.effect.EffectAppender; import com.gempukku.lotro.cards.build.field.effect.EffectAppenderProducer; import com.gempukku.lotro.common.Filterable; import com.gempukku.lotro.filters.Filters; +import com.gempukku.lotro.logic.GameUtils; import com.gempukku.lotro.logic.actions.CostToEffectAction; import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException; import com.gempukku.lotro.logic.decisions.IntegerAwaitingDecision; @@ -36,7 +37,7 @@ public class ChooseHowManyToSpot implements EffectAppenderProducer { final Filterable filterable = filterableSource.getFilterable(actionContext); final int count = Filters.countSpottable(actionContext.getGame(), filterable); return new PlayoutDecisionEffect(actionContext.getPerformingPlayer(), - new IntegerAwaitingDecision(1, text, 0, count, count) { + new IntegerAwaitingDecision(1, GameUtils.SubstituteText(text, actionContext), 0, count, count) { @Override public void decisionMade(String result) throws DecisionResultInvalidException { final int spotCount = getValidatedResult(result); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ChooseYesOrNo.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ChooseYesOrNo.java index 33c2a00f9..c7b8e313d 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ChooseYesOrNo.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ChooseYesOrNo.java @@ -8,6 +8,7 @@ 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.PlayerResolver; +import com.gempukku.lotro.logic.GameUtils; import com.gempukku.lotro.logic.actions.CostToEffectAction; import com.gempukku.lotro.logic.decisions.YesNoDecision; import com.gempukku.lotro.logic.effects.PlayoutDecisionEffect; @@ -31,15 +32,15 @@ public class ChooseYesOrNo implements EffectAppenderProducer { @Override protected Effect createEffect(boolean cost, CostToEffectAction action, ActionContext actionContext) { return new PlayoutDecisionEffect(playerSource.getPlayer(actionContext), - new YesNoDecision(text) { + new YesNoDecision(GameUtils.SubstituteText(text, actionContext)) { @Override protected void yes() { - actionContext.setValueToMemory(memorize, yesAnswer); + actionContext.setValueToMemory(memorize, GameUtils.SubstituteText(yesAnswer, actionContext)); } @Override protected void no() { - actionContext.setValueToMemory(memorize, noAnswer); + actionContext.setValueToMemory(memorize, GameUtils.SubstituteText(noAnswer, actionContext)); } }); } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/Optional.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/Optional.java index 51a2611ba..15bc185fa 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/Optional.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/Optional.java @@ -5,6 +5,7 @@ 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.PlayerResolver; +import com.gempukku.lotro.logic.GameUtils; import com.gempukku.lotro.logic.actions.CostToEffectAction; import com.gempukku.lotro.logic.actions.SubAction; import com.gempukku.lotro.logic.decisions.YesNoDecision; @@ -35,7 +36,7 @@ public class Optional implements EffectAppenderProducer { SubAction subAction = new SubAction(action); subAction.appendCost( new PlayoutDecisionEffect(choosingPlayer, - new YesNoDecision(text) { + new YesNoDecision(GameUtils.SubstituteText(text, actionContext)) { @Override protected void yes() { ActionContext delegate = new DelegateActionContext(actionContext, diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PreventableAppenderProducer.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PreventableAppenderProducer.java index 67ae08a41..c1308bde5 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PreventableAppenderProducer.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PreventableAppenderProducer.java @@ -41,16 +41,7 @@ public class PreventableAppenderProducer implements EffectAppenderProducer { if (areCostsPlayable(actionContext)) { final String preventingPlayer = preventingPlayerSource.getPlayer(actionContext); - String textToUse = text; - - while (textToUse.contains("{")) { - int startIndex = textToUse.indexOf("{"); - int endIndex = textToUse.indexOf("}"); - String memory = textToUse.substring(startIndex + 1, endIndex); - final String cardNames = GameUtils.getAppendedNames(actionContext.getCardsFromMemory(memory)); - - textToUse = textToUse.replace("{" + memory + "}", cardNames); - } + String textToUse = GameUtils.SubstituteText(text, actionContext); SubAction subAction = new SubAction(action); subAction.appendEffect( diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/CardResolver.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/CardResolver.java index 32dc38a24..47f0b35db 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/CardResolver.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/CardResolver.java @@ -58,7 +58,7 @@ public class CardResolver { @Override public String getText(LotroGame game) { - return choiceText; + return GameUtils.SubstituteText(choiceText, actionContext); } }; }; @@ -121,12 +121,12 @@ public class CardResolver { @Override public String getText(LotroGame game) { - return choiceText; + return GameUtils.SubstituteText(choiceText, actionContext); } }; } else { List cardsInHand = actionContext.getGame().getGameState().getHand(handId); - return new ChooseArbitraryCardsEffect(choicePlayerId, choiceText, cardsInHand, Filters.in(possibleCards), min, max, false) { + return new ChooseArbitraryCardsEffect(choicePlayerId, GameUtils.SubstituteText(choiceText, actionContext), cardsInHand, Filters.in(possibleCards), min, max, false) { @Override protected void cardsSelected(LotroGame game, Collection selectedCards) { actionContext.setCardMemory(memory, selectedCards); @@ -173,7 +173,7 @@ public class CardResolver { @Override public String getText(LotroGame game) { - return choiceText; + return GameUtils.SubstituteText(choiceText, actionContext); } }; }; @@ -212,7 +212,7 @@ public class CardResolver { @Override public String getText(LotroGame game) { - return choiceText; + return GameUtils.SubstituteText(choiceText, actionContext); } }; }; @@ -295,7 +295,7 @@ public class CardResolver { final PlayerSource playerSource = PlayerResolver.resolvePlayer(choicePlayer, environment); ChoiceEffectSource effectSource = (possibleCards, action, actionContext, min, max) -> { String choicePlayerId = playerSource.getPlayer(actionContext); - return new ChooseActiveCardsEffect(actionContext.getSource(), choicePlayerId, choiceText, min, max, Filters.in(possibleCards)) { + return new ChooseActiveCardsEffect(actionContext.getSource(), choicePlayerId, GameUtils.SubstituteText(choiceText, actionContext), min, max, Filters.in(possibleCards)) { @Override protected void cardsSelected(LotroGame game, Collection cards) { actionContext.setCardMemory(memory, cards); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/ValueResolver.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/ValueResolver.java index 8611bcea6..fb164bb78 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/ValueResolver.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/ValueResolver.java @@ -129,15 +129,25 @@ public class ValueResolver { return actionContext -> new MultiplyEvaluator(multiplier, new ForEachBurdenEvaluator()); } else if (type.equalsIgnoreCase("forEachWound")) { FieldUtils.validateAllowedFields(object, "filter", "multiplier"); - final String filter = FieldUtils.getString(object.get("filter"), "filter"); + final String filter = FieldUtils.getString(object.get("filter"), "filter", "any"); final int multiplier = FieldUtils.getInteger(object.get("multiplier"), "multiplier", 1); final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(filter, environment); - return (actionContext) -> (Evaluator) (game, cardAffected) -> { - int wounds = 0; - for (PhysicalCard physicalCard : Filters.filterActive(actionContext.getGame(), filterableSource.getFilterable(actionContext))) { - wounds += actionContext.getGame().getGameState().getWounds(physicalCard); + return (actionContext) -> { + if (filter.equals("any")) { + return new MultiplyEvaluator(multiplier, + (game, cardAffected) -> actionContext.getGame().getGameState().getWounds(cardAffected)); + } else { + return new MultiplyEvaluator(multiplier, + (game, cardAffected) -> { + final Filterable filterable = filterableSource.getFilterable(actionContext); + int wounds = 0; + for (PhysicalCard physicalCard : Filters.filterActive(game, filterable)) { + wounds += actionContext.getGame().getGameState().getWounds(physicalCard); + } + + return wounds; + }); } - return multiplier * wounds; }; } else if (type.equalsIgnoreCase("forEachKeyword")) { FieldUtils.validateAllowedFields(object, "filter", "keyword"); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/GameUtils.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/GameUtils.java index 34860d5a0..6ca598c3a 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/GameUtils.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/GameUtils.java @@ -1,5 +1,6 @@ package com.gempukku.lotro.logic; +import com.gempukku.lotro.cards.build.ActionContext; import com.gempukku.lotro.common.Culture; import com.gempukku.lotro.common.Filterable; import com.gempukku.lotro.common.Side; @@ -118,6 +119,19 @@ public class GameUtils { return "
" + (blueprint.isUnique() ? "ยท" : "") + GameUtils.getFullName(blueprint) + "
"; } + public static String getCultureImage(String cultureName) { + Culture culture = Culture.findCulture(cultureName); + if(culture == null) + return null; + + return getCultureImage(culture); + } + + public static String getCultureImage(Culture culture) { + return " " + + culture.getHumanReadable() + ""; + } + public static String getAppendedTextNames(Collection cards) { StringBuilder sb = new StringBuilder(); for (PhysicalCard card : cards) @@ -130,14 +144,41 @@ public class GameUtils { } public static String getAppendedNames(Collection cards) { - StringBuilder sb = new StringBuilder(); - for (PhysicalCard card : cards) - sb.append(GameUtils.getCardLink(card) + ", "); + ArrayList cardStrings = new ArrayList<>(); + for (PhysicalCard card : cards) { + cardStrings.add(GameUtils.getCardLink(card)); + } - if (sb.length() == 0) + if (cardStrings.size() == 0) return "none"; - else - return sb.substring(0, sb.length() - 2); + + return String.join(", ", cardStrings); + } + + + public static String SubstituteText(String text) + { + return SubstituteText(text, null); + } + + public static String SubstituteText(String text, ActionContext context) + { + String result = text; + while (result.contains("{")) { + int startIndex = result.indexOf("{"); + int endIndex = result.indexOf("}"); + String memory = result.substring(startIndex + 1, endIndex); + String culture = getCultureImage(memory); + if(culture != null) { + result = result.replace("{" + memory + "}", culture); + } + else if(context != null){ + final String cardNames = GameUtils.getAppendedNames(context.getCardsFromMemory(memory)); + result = result.replace("{" + memory + "}", cardNames); + } + } + + return result; } public static int getSpottableTokensTotal(LotroGame game, Token token) {