diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/second-edition/set40/set40-sauron.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/second-edition/set40/set40-sauron.hjson index 85da3c0d9..1fe00e8c1 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/second-edition/set40/set40-sauron.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/second-edition/set40/set40-sauron.hjson @@ -922,8 +922,8 @@ { type: addThreats amount: { - type: forEachFPCultureLessThan - amount: 4 + type: forEachFPCulture + limit: 4 } } ] diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/PlayerResolver.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/PlayerResolver.java index 5abeb4cac..4ad0c9e4a 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/PlayerResolver.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/PlayerResolver.java @@ -33,7 +33,7 @@ public class PlayerResolver { return actionContext.getPerformingPlayer(); }; } - else if (type.toLowerCase(Locale.ROOT).startsWith("frommemory(") && type.endsWith(")")) { + else if (type.toLowerCase().startsWith("frommemory(") && type.endsWith(")")) { String memory = type.substring(type.indexOf("(") + 1, type.lastIndexOf(")")); return (actionContext) -> actionContext.getValueFromMemory(memory); } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/TimeResolver.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/TimeResolver.java index d4a56c435..150a61c92 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/TimeResolver.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/TimeResolver.java @@ -1,7 +1,6 @@ package com.gempukku.lotro.cards.build.field.effect.appender.resolver; import com.gempukku.lotro.cards.build.InvalidCardDefinitionException; -import com.gempukku.lotro.common.Culture; import com.gempukku.lotro.common.Phase; public class TimeResolver { @@ -15,17 +14,17 @@ public class TimeResolver { } private static Time parseTime(String value) throws InvalidCardDefinitionException { - if (value.startsWith("start(") && value.endsWith(")")) { + if (value.toLowerCase().startsWith("start(") && value.endsWith(")")) { final String phaseName = value.substring(value.indexOf("(") + 1, value.lastIndexOf(")")); return new Time(Phase.findPhase(phaseName), true, false); } - else if (value.startsWith("end(") && value.endsWith(")")) { + else if (value.toLowerCase().startsWith("end(") && value.endsWith(")")) { final String phaseName = value.substring(value.indexOf("(") + 1, value.lastIndexOf(")")); - if (phaseName.equals("current")) + if (phaseName.equalsIgnoreCase("current")) return new Time(null, false, false); return new Time(Phase.findPhase(phaseName), false, false); } - else if (value.equals("endofturn")) + else if (value.equalsIgnoreCase("endofturn")) return new Time(null, false, true); else { Phase phase = Phase.findPhase(value); 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 28027024b..4aa1b5c2f 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 @@ -250,12 +250,24 @@ public class ValueResolver { int result = Math.max(0, spottable - over); return new ConstantEvaluator(result); }; - } else if (type.equalsIgnoreCase("forEachFPCultureLessThan")) { - FieldUtils.validateAllowedFields(object, "amount"); - final int lessThan = FieldUtils.getInteger(object.get("amount"), "amount"); + } else if (type.equalsIgnoreCase("forEachFPCulture")) { + FieldUtils.validateAllowedFields(object, "limit", "over"); + final int limit = FieldUtils.getInteger(object.get("limit"), "limit", Integer.MAX_VALUE); + final int over = FieldUtils.getInteger(object.get("over"), "over", 0); return actionContext -> { int spottable = GameUtils.getSpottableFPCulturesCount(actionContext.getGame(), actionContext.getPerformingPlayer()); - int result = Math.max(0, lessThan - spottable); + int result = Math.max(0, spottable - over); + result = Math.min(limit, result); + return new ConstantEvaluator(result); + }; + } else if (type.equalsIgnoreCase("forEachShadowCulture")) { + FieldUtils.validateAllowedFields(object, "limit", "over"); + final int limit = FieldUtils.getInteger(object.get("limit"), "limit", Integer.MAX_VALUE); + final int over = FieldUtils.getInteger(object.get("over"), "over", 0); + return actionContext -> { + int spottable = GameUtils.getSpottableShadowCulturesCount(actionContext.getGame(), actionContext.getPerformingPlayer()); + int result = Math.max(0, spottable - over); + result = Math.min(limit, result); return new ConstantEvaluator(result); }; } else if (type.equalsIgnoreCase("forEachInHand")) {