diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set04/set04-Dunland.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set04/set04-Dunland.hjson index 1a28b0df7..5bd07d65f 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set04/set04-Dunland.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set04/set04-Dunland.hjson @@ -954,8 +954,7 @@ type: activated phase: shadow requires: { - type: canSpot - filter: controlledSite + type: ControlsSite } cost: { type: exert @@ -1059,8 +1058,7 @@ modifier: { type: skipPhase requires: { - type: canSpot - filter: controlledSite + type: ControlsSite count: 2 } phase: archery @@ -1071,8 +1069,7 @@ modifier: { type: addKeyword requires: { - type: canSpot - filter: controlledSite + type: ControlsSite count: 3 } filter: your,culture(dunland),man @@ -1084,8 +1081,7 @@ modifier: { type: addKeyword requires: { - type: canSpot - filter: controlledSite + type: ControlsSite count: 3 } filter: your,culture(dunland),man @@ -1575,8 +1571,7 @@ type: activated phase: assignment requires: { - type: canSpot - filter: controlledSite + type: ControlsSite } cost: { type: removeTwilight @@ -1814,8 +1809,7 @@ effects: { type: event requires: { - type: canSpot - filter: controlledSite + type: ControlsSite count: 2 } effect: [ diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set04/set04-Isengard.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set04/set04-Isengard.hjson index 7e59af2db..225acea35 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set04/set04-Isengard.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set04/set04-Isengard.hjson @@ -1479,8 +1479,7 @@ type: exert select: choose(unbound,companion) count: { - type: forEachYouCanSpot - filter: controlledSite + type: ForEachSiteYouControl } } ] @@ -1768,8 +1767,7 @@ type: activated phase: skirmish requires: { - type: canSpot - filter: controlledSite + type: ControlsSite } cost: { type: removeTwilight @@ -3654,7 +3652,8 @@ type: activated phase: regroup requires: { - type: controlsSite + type: canSpot + filter: controlledSite } effect: { type: StackCardsFromPlay @@ -3784,7 +3783,8 @@ type: activated phase: regroup requires: { - type: controlsSite + type: canSpot + filter: controlledSite } effect: { type: StackCardsFromPlay @@ -3846,8 +3846,7 @@ type: modifyStrength filter: self amount: { - type: forEachYouCanSpot - filter: controlledSite + type: ForEachSiteYouControl multiplier: 2 } } @@ -3893,8 +3892,7 @@ { type: modifyOwnCost amount: { - type: forEachYouCanSpot - filter: controlledSite + type: ForEachSiteYouControl multiplier: -1 } } @@ -3939,8 +3937,7 @@ { type: modifyOwnCost amount: { - type: forEachYouCanSpot - filter: controlledSite + type: ForEachSiteYouControl multiplier: -1 } } @@ -3985,8 +3982,7 @@ { type: modifyOwnCost amount: { - type: forEachYouCanSpot - filter: controlledSite + type: ForEachSiteYouControl multiplier: -1 } } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set04/set04-Raider.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set04/set04-Raider.hjson index 9d6d28da9..289c9224a 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set04/set04-Raider.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set04/set04-Raider.hjson @@ -1784,8 +1784,7 @@ } side: shadow amount: { - type: forEachYouCanSpot - filter: controlledSite + type: ForEachSiteYouControl } } } @@ -2228,8 +2227,7 @@ effect: { type: addTwilight amount: { - type: forEachYouCanSpot - filter: controlledSite + type: ForEachSiteYouControl multiplier: 2 } } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set05/set05-Isengard.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set05/set05-Isengard.hjson index ea63527ab..5b6b42378 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set05/set05-Isengard.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set05/set05-Isengard.hjson @@ -664,8 +664,7 @@ effect: { type: addTwilight amount: { - type: forEachYouCanSpot - filter: controlledSite + type: ForEachSiteYouControl } } } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set05/set05-Sauron.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set05/set05-Sauron.hjson index 658430087..9d58e197b 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set05/set05-Sauron.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set05/set05-Sauron.hjson @@ -552,8 +552,7 @@ effect: { type: drawCards count: { - type: forEachYouCanSpot - filter: controlledSite + type: ForEachSiteYouControl limit: 3 } } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set06/set06-Dunland.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set06/set06-Dunland.hjson index 2255ff298..2b92a050e 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set06/set06-Dunland.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set06/set06-Dunland.hjson @@ -113,8 +113,7 @@ type: modifyStrength filter: self requires: { - type: canSpot - filter: controlledSite + type: ControlsSite count: 2 } amount: 5 @@ -126,8 +125,7 @@ type: addKeyword filter: self requires: { - type: canSpot - filter: controlledSite + type: ControlsSite count: 2 } keyword: fierce @@ -139,8 +137,7 @@ type: addKeyword filter: self requires: { - type: canSpot - filter: controlledSite + type: ControlsSite count: 2 } keyword: damage @@ -404,8 +401,7 @@ type: activated phase: shadow requires: { - type: canSpot - filter: controlledSite + type: ControlsSite count: 2 } cost: { diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set06/set06-Isengard.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set06/set06-Isengard.hjson index 998b047d9..75749916e 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set06/set06-Isengard.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set06/set06-Isengard.hjson @@ -167,8 +167,7 @@ player: fp select: choose(companion) count: { - type: forEachYouCanSpot - filter: SiteYouControl + type: ForEachSiteYouControl } } } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set06/set06-Sauron.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set06/set06-Sauron.hjson index 8cd7fb05c..f1d0227d4 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set06/set06-Sauron.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set06/set06-Sauron.hjson @@ -34,8 +34,7 @@ effect: { type: addTwilight amount: { - type: forEachYouCanSpot - filter: controlledSite + type: ForEachSiteYouControl } } } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set07/set07-Sauron.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set07/set07-Sauron.hjson index 98547b778..6c8a9e954 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set07/set07-Sauron.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set07/set07-Sauron.hjson @@ -389,8 +389,7 @@ type: modifyCost filter: your,culture(sauron) amount: { - type: forEachYouCanSpot - filter: controlledSite + type: ForEachSiteYouControl divider: 2 multiplier: -1 } @@ -530,8 +529,7 @@ effect: { type: addBurdens amount: { - type: forEachYouCanSpot - filter: controlledSite + type: ForEachSiteYouControl } } } @@ -584,8 +582,7 @@ type: modifyStrength select: choose(culture(sauron),minion) amount: { - type: forEachYouCanSpot - filter: controlledSite + type: ForEachSiteYouControl multiplier: { type: Conditional requires: { @@ -1102,8 +1099,16 @@ { type: toPlay requires: { - type: canSpot - filter: or(besieger,controlledSite) + type: Or + requires: [ + { + type: ControlsSite + } + { + type: canSpot + filter: besieger + } + ] } } { @@ -3115,8 +3120,7 @@ type: modifyStrength filter: besieger amount: { - type: forEachYouCanSpot - filter: controlledSite + type: ForEachSiteYouControl } } } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set08/set08-Sauron.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set08/set08-Sauron.hjson index 4c6c39389..f0b395c58 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set08/set08-Sauron.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set08/set08-Sauron.hjson @@ -166,8 +166,16 @@ type: activated phase: assignment requires: { - type: canSpot - filter: or(and(culture(sauron),engine),controlledSite) + type: Or + requires: [ + { + type: ControlsSite + } + { + type: canSpot + filter: culture(sauron),engine + } + ] } effect: { type: assignFpCharacterToSkirmish diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set09/set09-Isengard.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set09/set09-Isengard.hjson index 22379e383..0c8a4c2e2 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set09/set09-Isengard.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set09/set09-Isengard.hjson @@ -119,8 +119,7 @@ type: modifyStrength filter: memory(chosenMinion) amount: { - type: forEachYouCanSpot - filter: controlledSite + type: ForEachSiteYouControl } } until: start(regroup) diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set09/set09-Sauron.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set09/set09-Sauron.hjson index 51eada3f4..190c9c0bb 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set09/set09-Sauron.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set09/set09-Sauron.hjson @@ -114,8 +114,7 @@ { type: modifyOwnCost amount: { - type: forEachYouCanSpot - filter: controlledSite + type: ForEachSiteYouControl multiplier: -1 } } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set10/set10-Sauron.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set10/set10-Sauron.hjson index 172f4b943..a773caa0c 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set10/set10-Sauron.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set10/set10-Sauron.hjson @@ -299,8 +299,7 @@ type: modifyStrength select: choose(culture(sauron),minion) amount: { - type: forEachYouCanSpot - filter: controlledSite + type: ForEachSiteYouControl multiplier: 2 } memorize: chosenMinion @@ -733,8 +732,7 @@ player: free people select: choose(companion) count: { - type: forEachYouCanSpot - filter: SiteYouControl + type: ForEachSiteYouControl } } } @@ -798,13 +796,11 @@ filter: bearer,name(Gothmog) } true: { - type: forEachYouCanSpot - filter: controlledSite + type: ForEachSiteYouControl multiplier: 2 } false: { - type: forEachYouCanSpot - filter: controlledSite + type: ForEachSiteYouControl } } } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set15/set15-Men.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set15/set15-Men.hjson index dd6e3cdfd..7d0153a41 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set15/set15-Men.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set15/set15-Men.hjson @@ -48,8 +48,7 @@ times: 2 } requires: { - type: canSpot - filter: controlledSite + type: ControlsSite } effect: { type: addTwilight @@ -161,8 +160,7 @@ text: Make a {men} Man strength +2 phase: skirmish requires: { - type: canSpot - filter: controlledSite + type: ControlsSite } cost: { type: removeTwilight @@ -179,8 +177,7 @@ text: Make a {men} Man strength +3 phase: skirmish requires: { - type: canSpot - filter: controlledSite + type: ControlsSite count: 2 } cost: { @@ -198,8 +195,7 @@ text: Make a {men} Man strength +4 phase: skirmish requires: { - type: canSpot - filter: controlledSite + type: ControlsSite count: 3 } cost: { diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set15/set15-Uruk-hai.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set15/set15-Uruk-hai.hjson index 48f402b90..561c21f32 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set15/set15-Uruk-hai.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set15/set15-Uruk-hai.hjson @@ -32,8 +32,7 @@ type: modifyStrength filter: self amount: { - type: forEachYouCanSpot - filter: controlledSite + type: ForEachSiteYouControl } } } @@ -1037,8 +1036,7 @@ type: cantTakeWounds requires: [ { - type: canSpot - filter: controlledSite + type: ControlsSite count: 2 } { diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set17/set17-Men.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set17/set17-Men.hjson index c141d2502..ccf606c8f 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set17/set17-Men.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set17/set17-Men.hjson @@ -246,8 +246,7 @@ modifier: { type: addKeyword requires: { - type: canSpot - filter: controlledSite + type: ControlsSite count: 2 } filter: self @@ -259,8 +258,7 @@ modifier: { type: modifyStrength requires: { - type: canSpot - filter: controlledSite + type: ControlsSite count: 4 } filter: culture(men),minion @@ -272,8 +270,7 @@ modifier: { type: addKeyword requires: { - type: canSpot - filter: controlledSite + type: ControlsSite count: 4 } filter: culture(men),minion @@ -762,8 +759,7 @@ effect: { type: repeat times: { - type: forEachYouCanSpot - filter: controlledSite + type: forEachSiteYouControl } effect: { type: exert @@ -824,8 +820,7 @@ filter: self } requires: { - type: canSpot - filter: controlledSite + type: ControlsSite } effect: { type: exhaust diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set17/set17-Uruk-hai.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set17/set17-Uruk-hai.hjson index 758d09145..8ed009d45 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set17/set17-Uruk-hai.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set17/set17-Uruk-hai.hjson @@ -29,8 +29,7 @@ modifier: { type: addKeyword requires: { - type: canSpot - filter: controlledSite + type: ControlsSite count: 2 } filter: bearer @@ -43,8 +42,7 @@ modifier: { type: addKeyword requires: { - type: canSpot - filter: controlledSite + type: ControlsSite count: 4 } filter: bearer @@ -158,8 +156,7 @@ amount: { type: Conditional requires: { - type: canSpot - filter: controlledSite + type: ControlsSite } true: 3 false: 2 @@ -722,8 +719,7 @@ filter: self keyword: hunter amount: { - type: forEachYouCanSpot - filter: siteYouControl + type: forEachSiteYouControl multiplier: 3 } } @@ -941,8 +937,7 @@ effect: { type: repeat times: { - type: forEachYouCanSpot - filter: siteYouControl + type: ForEachSiteYouControl } effect: { type: exert 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 143cb9d42..dda1bdcac 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 @@ -474,7 +474,14 @@ public class ValueResolver { return new SmartValueSource(environment, object, actionContext -> { String performingPlayer = actionContext.getPerformingPlayer(); - return (game, cardAffected) -> GameUtils.getSpottableControlledSitesCount(game, performingPlayer); + return (game, cardAffected) -> GameUtils.getControlledSitesCountByPlayer(game, performingPlayer); + }); + } else if (type.equalsIgnoreCase("forEachSiteOpponentControls")) { + FieldUtils.validateAllowedFields(object, "over", "limit", "multiplier", "divider"); + return new SmartValueSource(environment, object, + actionContext -> { + String performingPlayer = actionContext.getPerformingPlayer(); + return (game, cardAffected) -> GameUtils.getControlledSitesCountOfOpponents(game, performingPlayer); }); } else if (type.equalsIgnoreCase("forEachStacked")) { FieldUtils.validateAllowedFields(object, "on", "filter", "over", "limit", "multiplier", "divider"); 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 fea3dddb8..8f87d1e2e 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 @@ -53,9 +53,9 @@ public class FilterFactory { simpleFilters.put("controlledbyshadowplayer", (actionContext -> Filters.siteControlledByOtherPlayer(actionContext.getGame().getGameState().getCurrentPlayerId()))); simpleFilters.put("controlledsite", - (actionContext -> Filters.siteControlled(actionContext.getPerformingPlayer()))); + (actionContext -> Filters.siteControlledByPlayer(actionContext.getPerformingPlayer()))); simpleFilters.put("siteyoucontrol", - (actionContext -> Filters.siteControlled(actionContext.getPerformingPlayer()))); + (actionContext -> Filters.siteControlledByPlayer(actionContext.getPerformingPlayer()))); simpleFilters.put("cultureindeadpile", new FilterableSource() { @Override diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/requirement/CanSpotControlledSites.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/requirement/CanSpotControlledSites.java deleted file mode 100644 index 1c19477e8..000000000 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/requirement/CanSpotControlledSites.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.gempukku.lotro.cards.build.field.effect.requirement; - -import com.gempukku.lotro.cards.build.CardGenerationEnvironment; -import com.gempukku.lotro.cards.build.InvalidCardDefinitionException; -import com.gempukku.lotro.cards.build.Requirement; -import com.gempukku.lotro.cards.build.field.FieldUtils; -import com.gempukku.lotro.logic.GameUtils; -import org.json.simple.JSONObject; - -public class CanSpotControlledSites implements RequirementProducer { - @Override - public Requirement getPlayRequirement(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { - FieldUtils.validateAllowedFields(object, "amount"); - final int amount = FieldUtils.getInteger(object.get("amount"), "amount"); - - return (actionContext) -> GameUtils.getSpottableControlledSitesCount(actionContext.getGame(), actionContext.getPerformingPlayer()) >= amount; - } -} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/requirement/ControlsSite.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/requirement/ControlsSite.java index 2f014d381..d90d06f9e 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/requirement/ControlsSite.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/requirement/ControlsSite.java @@ -1,27 +1,28 @@ package com.gempukku.lotro.cards.build.field.effect.requirement; -import com.gempukku.lotro.cards.build.CardGenerationEnvironment; -import com.gempukku.lotro.cards.build.InvalidCardDefinitionException; -import com.gempukku.lotro.cards.build.PlayerSource; -import com.gempukku.lotro.cards.build.Requirement; +import com.gempukku.lotro.cards.build.*; import com.gempukku.lotro.cards.build.field.FieldUtils; 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.filters.Filters; import com.gempukku.lotro.game.state.LotroGame; +import com.gempukku.lotro.logic.GameUtils; import org.json.simple.JSONObject; public class ControlsSite implements RequirementProducer { @Override public Requirement getPlayRequirement(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { - FieldUtils.validateAllowedFields(object, "player"); + FieldUtils.validateAllowedFields(object, "player", "count"); final String player = FieldUtils.getString(object.get("player"), "player", "you"); + final ValueSource countSource = ValueResolver.resolveEvaluator(object.get("count"), 1, environment); final PlayerSource playerSource = PlayerResolver.resolvePlayer(player); return (actionContext) -> { - LotroGame game = actionContext.getGame(); - String playerId = playerSource.getPlayer(actionContext); - return Filters.findFirstActive(game, Filters.siteControlled(playerId)) != null; + final int count = countSource.getEvaluator(actionContext).evaluateExpression(actionContext.getGame(), null); + + return GameUtils.getControlledSitesCountByPlayer(actionContext.getGame(), + playerSource.getPlayer(actionContext)) >= count; }; } } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/requirement/OpponentDoesNotControlSite.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/requirement/OpponentDoesNotControlSite.java index ff07837aa..da0567307 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/requirement/OpponentDoesNotControlSite.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/requirement/OpponentDoesNotControlSite.java @@ -7,6 +7,7 @@ import com.gempukku.lotro.cards.build.Requirement; import com.gempukku.lotro.cards.build.field.FieldUtils; import com.gempukku.lotro.cards.build.field.effect.appender.resolver.PlayerResolver; import com.gempukku.lotro.filters.Filters; +import com.gempukku.lotro.logic.GameUtils; import org.json.simple.JSONObject; public class OpponentDoesNotControlSite implements RequirementProducer { @@ -17,7 +18,6 @@ public class OpponentDoesNotControlSite implements RequirementProducer { final String player = FieldUtils.getString(object.get("player"), "player", "you"); final PlayerSource playerSource = PlayerResolver.resolvePlayer(player); - return (actionContext) -> - Filters.countActive(actionContext.getGame(), Filters.siteControlledByOtherPlayer(playerSource.getPlayer(actionContext))) == 0; + return (actionContext) -> GameUtils.getControlledSitesCountOfOpponents(actionContext.getGame(), playerSource.getPlayer(actionContext)) <= 0; } } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/requirement/RequirementFactory.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/requirement/RequirementFactory.java index 34a664fbf..de05a9701 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/requirement/RequirementFactory.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/requirement/RequirementFactory.java @@ -27,7 +27,6 @@ public class RequirementFactory { requirementProducers.put("cantspot", new CantSpot()); requirementProducers.put("canspotburdens", new CanSpotBurdens()); requirementProducers.put("cantspotburdens", new CantSpotBurdens()); - requirementProducers.put("canspotcontrolledsites", new CanSpotControlledSites()); requirementProducers.put("canspotculturetokens", new CanSpotCultureTokens()); requirementProducers.put("canspotfpcultures", new CanSpotFPCultures()); requirementProducers.put("cantspotfpcultures", new CantSpotFPCultures()); 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 030868fae..2f12c3c22 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 @@ -575,7 +575,7 @@ public class Filters { return (game, physicalCard) -> physicalCard.getBlueprint().getCardType() == CardType.SITE && physicalCard.getCardController() != null && !physicalCard.getCardController().equals(thisPlayer); } - public static Filter siteControlled(final String playerId) { + public static Filter siteControlledByPlayer(final String playerId) { return (game, physicalCard) -> physicalCard.getBlueprint().getCardType() == CardType.SITE && playerId.equals(physicalCard.getCardController()); } 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 a1847f115..16a32c7ee 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 @@ -324,7 +324,16 @@ public class GameUtils { return game.getModifiersQuerying().getNumberOfSpottableShadowCultures(game, playerId); } - public static int getSpottableControlledSitesCount(LotroGame game, String playerId) { + public static int getControlledSitesCountByPlayer(LotroGame game, String playerId) { return game.getModifiersQuerying().getNumberOfSpottableControlledSites(game, playerId); } + + public static int getControlledSitesCountOfOpponents(LotroGame game, String playerId) { + int total = 0; + + for(var opponent : getOpponents(game, playerId)) { + total += getControlledSitesCountByPlayer(game, opponent); + } + return total; + } } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersLogic.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersLogic.java index 44de699c5..be8b65b50 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersLogic.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersLogic.java @@ -1026,7 +1026,7 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying { @Override public int getNumberOfSpottableControlledSites(LotroGame game, String playerId) { - int result = Filters.filterActive(game, Filters.siteControlled(playerId)).size(); + int result = Filters.filterActive(game, Filters.siteControlledByPlayer(playerId)).size(); for (Modifier modifier : getModifiers(game, ModifierEffect.SPOT_MODIFIER)) { result += modifier.getSiteControlledSpotCountModifier(game, playerId); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/WinConditionRule.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/WinConditionRule.java index 7e14cf567..cb8d70d9a 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/WinConditionRule.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/WinConditionRule.java @@ -39,7 +39,7 @@ public class WinConditionRule { } else if (game.getFormat().winOnControlling5Sites() && effectResults.getType() == EffectResult.Type.CONTROL_SITE) { for (String opponent : GameUtils.getShadowPlayers(game)) { - if (Filters.countActive(game, CardType.SITE, Filters.siteControlled(opponent)) >= 5) + if (Filters.countActive(game, CardType.SITE, Filters.siteControlledByPlayer(opponent)) >= 5) game.playerWon(opponent, "Controls 5 sites"); } } diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v02/Card_V2_066_Tests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v02/Card_V2_066_Tests.java index 5a1f31954..39a06a1ad 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v02/Card_V2_066_Tests.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v02/Card_V2_066_Tests.java @@ -18,10 +18,21 @@ public class Card_V2_066_Tests return new GenericCardTestHelper( new HashMap<>() {{ - put("card", "102_66"); - // put other cards in here as needed for the test case + put("haldir", "4_71"); + put("hillman", "15_82"); + put("mob", "4_205"); + }}, + new HashMap<>() {{ + put("site1", "1_319"); + put("site2", "1_327"); + put("site3", "1_337"); + put("site4", "1_343"); + put("site5", "102_66"); + put("site6", "1_351"); + put("site7", "1_353"); + put("site8", "1_356"); + put("site9", "1_360"); }}, - GenericCardTestHelper.FellowshipSites, GenericCardTestHelper.FOTRFrodo, GenericCardTestHelper.RulingRing ); @@ -40,14 +51,12 @@ public class Card_V2_066_Tests * Type: Site * Subtype: * Site Number: 5T - * Game Text: Battleground. While at this site, the count of sites the shadow player controls is +1. + * Game Text: Battleground. The count of sites the shadow player controls is +1. */ var scn = GetScenario(); - //Use this once you have set the deck up properly - //var card = scn.GetFreepsSite(5); - var card = scn.GetFreepsCard("card"); + var card = scn.GetFreepsSite(5); assertEquals("Breached Wall", card.getBlueprint().getTitle()); assertNull(card.getBlueprint().getSubtitle()); @@ -58,18 +67,57 @@ public class Card_V2_066_Tests assertEquals(5, card.getBlueprint().getSiteNumber()); } - // Uncomment any @Test markers below once this is ready to be used - //@Test - public void BreachedWallTest1() throws DecisionResultInvalidException, CardNotFoundException { + @Test + public void BreachedWallBonusAffectsAllSiteControlMechanics() throws DecisionResultInvalidException, CardNotFoundException { //Pre-game setup var scn = GetScenario(); - var card = scn.GetFreepsCard("card"); - scn.FreepsMoveCardToHand(card); + var wall = scn.GetShadowSite(5); + var haldir = scn.GetFreepsCard("haldir"); + scn.FreepsMoveCharToTable(haldir); + + var hillman = scn.GetShadowCard("hillman"); + var mob = scn.GetShadowCard("mob"); + scn.ShadowMoveCardToHand(hillman, mob); scn.StartGame(); - scn.FreepsPlayCard(card); - assertEquals(6, scn.GetTwilight()); + scn.SkipToSite(3); + scn.SetTwilight(12); + scn.FreepsPassCurrentPhaseAction(); // we're now on 4, not quite Breached Wall + + //No opponent controls a site, so Haldir is strength +2 + assertEquals(7, scn.getStrength(haldir)); + + assertEquals(15, scn.GetTwilight()); + scn.ShadowMoveCharToTable(hillman); + //Is base 9 strength, not boosted or fierce from controlling a site + assertEquals(9, scn.getStrength(hillman)); + assertFalse(scn.hasKeyword(hillman, Keyword.FIERCE)); + + scn.ShadowPlayCard(mob); + //15 - full undiscounted 5 -2 for roaming = 8 + assertEquals(8, scn.GetTwilight()); + + scn.ShadowMoveCardToHand(hillman, mob); + scn.SkipToPhase(Phase.REGROUP); + scn.PassCurrentPhaseActions(); + scn.ShadowDeclineReconciliation(); + scn.FreepsChooseToMove(); + + assertEquals(wall, scn.GetCurrentSite()); + + //Opponent site control count is +1, so Haldir loses bonus + assertEquals(5, scn.getStrength(haldir)); + + assertEquals(16, scn.GetTwilight()); + scn.ShadowMoveCharToTable(hillman); + //Is base 9 strength +3 and fierce from controlling a site + assertEquals(12, scn.getStrength(hillman)); + assertTrue(scn.hasKeyword(hillman, Keyword.FIERCE)); + + scn.ShadowPlayCard(mob); + //16 - 5 full cost + 1 discount for controlling 1 site = 12 + assertEquals(12, scn.GetTwilight()); } }