diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/AllyHomeFieldProcessor.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/AllyHomeFieldProcessor.java index fb5f747d6..e5a07d8c5 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/AllyHomeFieldProcessor.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/AllyHomeFieldProcessor.java @@ -6,14 +6,18 @@ import com.gempukku.lotro.cards.build.FieldProcessor; import com.gempukku.lotro.cards.build.InvalidCardDefinitionException; import com.gempukku.lotro.common.SitesBlock; +import java.util.Arrays; + public class AllyHomeFieldProcessor implements FieldProcessor { @Override public void processField(String key, Object value, BuiltLotroCardBlueprint blueprint, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { final String allyHome = FieldUtils.getString(value, "allyHome"); - final String[] allyHomeSplit = allyHome.split(",", 2); + final String[] allyHomeSplit = allyHome.split(",", 4); SitesBlock sitesBlock = Enum.valueOf(SitesBlock.class, allyHomeSplit[0].toUpperCase().replace(' ', '_')); - final int number = Integer.parseInt(allyHomeSplit[1]); - blueprint.setAllyHomeSites(sitesBlock, new int[]{number}); + String[] sites = Arrays.copyOfRange(allyHomeSplit, 1, allyHomeSplit.length); + int[] numbers = Arrays.stream(sites).mapToInt(Integer::parseInt).toArray(); + + blueprint.setAllyHomeSites(sitesBlock, numbers); } } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/filter/FilterFactory.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/filter/FilterFactory.java index 4af6a945d..851190fb0 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/filter/FilterFactory.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/filter/FilterFactory.java @@ -199,6 +199,17 @@ public class FilterFactory { int number = Integer.parseInt(parameterSplit[1]); return (actionContext) -> Filters.isAllyHome(number, sitesBlock); }); + parameterFilters.put("allyInRegion", + (parameter, environment) -> { + final String[] parameterSplit = parameter.split(","); + final SitesBlock sitesBlock = Enum.valueOf(SitesBlock.class, parameterSplit[0].toUpperCase().replace('_', ' ')); + int number = Integer.parseInt(parameterSplit[1]); + return (actionContext) -> Filters.isAllyInRegion(number, sitesBlock); + }); + parameterFilters.put("allyInCurrentRegion", + (parameter, environment) -> { + return (actionContext) -> Filters.isAllyInCurrentRegion(); + }); parameterFilters.put("siteBlock", (parameter, environment) -> { final SitesBlock sitesBlock = Enum.valueOf(SitesBlock.class, parameter.toUpperCase().replace(' ', '_')); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/filters/Filters.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/filters/Filters.java index ac3ce177d..6513aa6cb 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/filters/Filters.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/filters/Filters.java @@ -665,6 +665,28 @@ public class Filters { }); } + public static Filter isAllyInRegion(final int regionNumber, final SitesBlock siteBlock) { + return Filters.and( + CardType.ALLY, + new Filter() { + @Override + public boolean accepts(LotroGame game, PhysicalCard physicalCard) { + return RuleUtils.isAllyInRegion(physicalCard, regionNumber, siteBlock); + } + }); + } + + public static Filter isAllyInCurrentRegion() { + return Filters.and( + CardType.ALLY, + new Filter() { + @Override + public boolean accepts(LotroGame game, PhysicalCard physicalCard) { + return RuleUtils.isAllyInRegion(physicalCard, GameUtils.getRegion(game), game.getGameState().getCurrentSiteBlock()); + } + }); + } + public static final Filter allyAtHome = Filters.and( CardType.ALLY, new Filter() { @@ -709,6 +731,8 @@ public class Filters { } }; + + public static Filter siteNumber(final int siteNumber) { return siteNumberBetweenInclusive(siteNumber, siteNumber); } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/RuleUtils.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/RuleUtils.java index 0803ac7ac..9b6184b1d 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/RuleUtils.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/RuleUtils.java @@ -7,8 +7,10 @@ import com.gempukku.lotro.game.LotroCardBlueprint; import com.gempukku.lotro.game.PhysicalCard; import com.gempukku.lotro.game.state.LotroGame; import com.gempukku.lotro.game.state.Skirmish; +import com.gempukku.lotro.logic.GameUtils; import com.gempukku.lotro.logic.modifiers.evaluator.Evaluator; +import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.Set; @@ -186,4 +188,18 @@ public class RuleUtils { return true; return false; } + + public static boolean isAllyInRegion(PhysicalCard ally, int regionNumber, SitesBlock siteBlock) { + final SitesBlock allySiteBlock = ally.getBlueprint().getAllyHomeSiteBlock(); + final int[] allyHomeSites = ally.getBlueprint().getAllyHomeSiteNumbers(); + if (allySiteBlock != siteBlock) + return false; +// for (int number : allyHomeSites) +// if (regionNumber == GameUtils.getRegion(number)) +// return true; +// return false; + + return Arrays.stream(ally.getBlueprint().getAllyHomeSiteNumbers()).anyMatch(x -> regionNumber == GameUtils.getRegion(x)); + } + }