diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV02/setv02-Gandalf-playtest.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV02/setv02-Gandalf-playtest.hjson
index 9c27330e6..43c0e17f5 100644
--- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV02/setv02-Gandalf-playtest.hjson
+++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV02/setv02-Gandalf-playtest.hjson
@@ -101,7 +101,7 @@
type: AddModifier
until: start(regroup)
modifier: {
- type: FPCultureSpot
+ type: FPCultureCount
amount: -1
}
}
diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV02/setv02-Gondor-playtest.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV02/setv02-Gondor-playtest.hjson
index 36fad0800..125356b5e 100644
--- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV02/setv02-Gondor-playtest.hjson
+++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV02/setv02-Gondor-playtest.hjson
@@ -32,7 +32,7 @@
{
type: modifier
modifier: {
- type: FPCultureSpot
+ type: FPCultureCount
requires: {
type: canSpot
count: 3
diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV02/setv02-Sauron-playtest.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV02/setv02-Sauron-playtest.hjson
index f0ad81a5d..5450f3ab5 100644
--- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV02/setv02-Sauron-playtest.hjson
+++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV02/setv02-Sauron-playtest.hjson
@@ -26,17 +26,34 @@
vitality: 3
site: 4
keywords: Twilight
- /*requires: {
-
- }
effects: [
{
-
+ type: ToPlay
+ requires: {
+ type: CanSpot
+ filter: twilight, minion
+ }
}
{
-
+ type: ModifyOwnCost
+ amount: {
+ type: ForEachBurden
+ multiplier: -1
+ }
}
- ]*/
+ {
+ type: Modifier
+ modifier: {
+ type: AddKeyword
+ keyword: damage+1
+ filter: self
+ requires: {
+ type: CanSpotBurdens
+ amount: 4
+ }
+ }
+ }
+ ]
gametext: Twilight.
To play, spot a twilight minion.
This minion is twilight cost -1 for each burden you can spot.
While you can spot 4 burdens, this minion is damage +1.
lore: "'The Dead can't be really there! Is it some devilry hatched in the Dark Land?'"
promotext: ""
@@ -70,17 +87,36 @@
twilight: 1
type: Condition
keywords: Support Area
- /*requires: {
-
- }
effects: [
{
-
+ type: ToPlay
+ requires: {
+ type: CanSpot
+ filter: Wraith
+ }
}
{
-
+ type: Activated
+ phase: Regroup
+ cost: {
+ type: Discard
+ select: choose(twilight, minion)
+ count: 2
+ }
+ effect: {
+ type: Preventable
+ player: freeps
+ text: Would you like to wound the Ring-bearer to avoid adding a burden?
+ cost: {
+ type: Wound
+ select: choose(ring-bearer)
+ }
+ effect: {
+ type: AddBurdens
+ }
+ }
}
- ]*/
+ ]
gametext: To play, spot a Wraith.
Regroup: Discard two twilight minions to add a burden. The Free Peoples player may wound the Ring-bearer to prevent this.
lore: "'They lie in all the pools, pale faces, deep deep under the dark water.'"
promotext: ""
@@ -114,20 +150,32 @@
twilight: 0
type: Event
timewords: Skirmish
- /*requires: {
-
- }
- */
effects: {
type: event
cost: {
- type: SendMessage
- text: Placeholder effect for development.
+ type: Exert
+ select: choose(Wraith)
},
effect: [
{
- type: SendMessage
- text: Placeholder effect for development.
+ type: ModifyStrength
+ amount: 2
+ select: choose(twilight, minion)
+ memorize: pumpedTwilight
+ }
+ {
+ type: AddTrigger
+ trigger: {
+ type: WinsSkirmish
+ filter: memory(pumpedTwilight)
+ }
+ cost: {
+ type: Exert
+ select: memory(pumpedTwilight)
+ }
+ effect: {
+ type: AddBurdens
+ }
}
]
}
@@ -164,17 +212,39 @@
twilight: 1
type: Condition
keywords: Support Area
- /*requires: {
-
- }
effects: [
{
-
+ type: ToPlay
+ requires: {
+ type: CanSpot
+ filter: Wraith
+ }
}
{
-
+ type: Modifier
+ modifier: {
+ type: CantTakeWounds
+ filter: twilight
+ requires: {
+ type: Not
+ requires: {
+ type: Phase
+ phase: Skirmish
+ }
+ }
+ }
}
- ]*/
+ {
+ type: Trigger
+ trigger: {
+ type: TakesOffRing
+ }
+ effect: {
+ type: Discard
+ select: self
+ }
+ }
+ ]
gametext: To play, spot a Wraith.
While you can spot 3 twilight minions, twilight minions may not take wounds except during skirmishes.
When the ringbearer takes off the One Ring, discard this condition.
lore: "'You cannot reach them, you cannot touch them.'"
promotext: ""
@@ -212,17 +282,28 @@
vitality: 2
site: 6
keywords: Tracker
- /*requires: {
-
- }
effects: [
{
-
+ type: Modifier
+ modifier: {
+ type: ModifySiteNumber
+ filter: culture(sauron),orc
+ amount: -1
+ }
}
{
-
+ type: Activated
+ phase: Skirmish
+ cost: {
+ type: Discard
+ select: self
+ }
+ effect: {
+ type: CancelSkirmish
+ filter: culture(isengard), tracker
+ }
}
- ]*/
+ ]
gametext: Tracker.
The site number of each [Sauron] orc is -1.
Skirmish: Discard this minion to cancel a skirmish involving an [isengard] tracker.
lore: "'We'll find a use for your legs before long. You'll wish you had got none before we get home.'"
promotext: ""
@@ -257,20 +338,17 @@
type: Event
timewords: Skirmish
keywords: Search
- /*requires: {
-
- }
- */
effects: {
type: event
- cost: {
- type: SendMessage
- text: Placeholder effect for development.
- },
effect: [
{
- type: SendMessage
- text: Placeholder effect for development.
+ type: ModifyStrength
+ amount: {
+ type: ForEachYouCanSpot
+ filter: search
+ limit: 5
+ }
+ select: choose(culture(sauron), tracker)
}
]
}
@@ -312,17 +390,36 @@
vitality: 3
site: 6
keywords: Tracker
- /*requires: {
-
- }
effects: [
{
-
+ type: modifier
+ modifier: {
+ type: modifySiteNumber
+ filter: culture(sauron),orc
+ amount: -3
+ }
}
{
-
+ type: Modifier
+ modifier: {
+ type: AddKeyword
+ keyword: damage+1
+ filter: culture(sauron),minion,siteNumber(0-1)
+ }
}
- ]*/
+ {
+ type: Activated
+ phase: Regroup
+ cost: {
+ type: Discard
+ select: choose(or(culture(sauron), culture(isengard)), tracker)
+ }
+ effect: {
+ type: PlayCardFromDiscard
+ select: choose(culture(sauron), condition)
+ }
+ }
+ ]
gametext: Tracker.
The site number of each [sauron] orc is -3.
Each [sauron] orc with a site number of 1 or less is damage +1.
Regroup: Discard a [sauron] or [isengard] tracker to play a [sauron] condition from your discard pile.
lore: ""
promotext: ""
@@ -360,17 +457,22 @@
vitality: 3
site: 6
keywords: Tracker
- /*requires: {
-
- }
effects: [
{
-
+ type: Modifier
+ modifier: {
+ type: CantTakeWounds
+ filter: culture(sauron),minion,siteNumber(0-1)
+ requires: {
+ type: Not
+ requires: {
+ type: Phase
+ phase: Skirmish
+ }
+ }
+ }
}
- {
-
- }
- ]*/
+ ]
gametext: Tracker.
Each [sauron] orc with a site number of 1 or less cannot take wounds except during the skirmish phase.
lore: "'Is Saruman the master or the Great Eye?' said the evil voice. 'We should go back at once to Lugbúrz.'"
promotext: ""
@@ -408,17 +510,16 @@
vitality: 2
site: 6
keywords: Tracker
- /*requires: {
-
- }
effects: [
{
-
+ type: Modifier
+ modifier: {
+ type: modifystrength
+ filter: self,siteNumber(0-1)
+ amount: 4
+ }
}
- {
-
- }
- ]*/
+ ]
gametext: Tracker.
If this minion's site number is 1 or less, it is strength +4.
lore: "'You're as bad as the other rabble: the maggots and the apes of Lugbúrz.'"
promotext: ""
diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV02/setv02-Sites-playtest.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV02/setv02-Sites-playtest.hjson
index 2cfc943ee..599cb93ac 100644
--- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV02/setv02-Sites-playtest.hjson
+++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV02/setv02-Sites-playtest.hjson
@@ -23,17 +23,38 @@
block: Towers
direction: Left
keywords: Mountain
- /*requires: {
-
- }
effects: [
{
-
+ type: Trigger
+ trigger: {
+ type: MovesFrom
+ filter: self
+ }
+ requires: {
+ type: Phase
+ phase: Regroup
+ }
+ effect: {
+ type: ForEachPlayer
+ effect: {
+ type: Optional
+ text: Would you like to discard 2 cards to draw 2?
+ effect: {
+ type: CostToEffect
+ cost: {
+ type: Discard
+ select: choose(any)
+ count: 2
+ }
+ effect: {
+ type: DrawCards
+ count: 2
+ }
+ }
+ }
+ }
}
- {
-
- }
- ]*/
+ ]
gametext: Mountain. When the Fellowship moves from here during the regroup phase, each player may discard 2 cards to draw 2 cards.
lore: ""
promotext: ""
@@ -68,17 +89,20 @@
block: Towers
direction: Left
keywords: Sanctuary
- /*requires: {
-
- }
effects: [
{
-
+ type: Activated
+ phase: Fellowship
+ cost: {
+ type: PlayCardFromHand
+ select: choose(valiant,character)
+ }
+ effect: {
+ type: DrawCards
+ count: 1
+ }
}
- {
-
- }
- ]*/
+ ]
gametext: Sanctuary. Fellowship: Play a valiant character to draw a card.
lore: ""
promotext: ""
@@ -113,17 +137,16 @@
block: Towers
direction: Left
keywords: Plains
- /*requires: {
-
- }
effects: [
{
-
+ type: Modifier
+ modifier: {
+ type: ModifyCost
+ filter: mount
+ amount: -1
+ }
}
- {
-
- }
- ]*/
+ ]
gametext: Plains. Each mount is twilight cost -1.
lore: ""
promotext: ""
@@ -158,17 +181,21 @@
block: Towers
direction: Left
keywords: Battleground
- /*requires: {
-
- }
+ # Things that need changed for this to be worth a damn:
+ # - Add ForEachSiteYouControl value
+ # - Add ForEachSiteOpponentControls value
+ # - Alter ControlsSite and OpponentDoesNotControlSite requirements
+ # - Redirect every use of ForEachYouCanSpot with a controlled site filter to use the above
+ # -
effects: [
{
-
+ type: modifier
+ modifier: {
+ type: SiteControlCount
+ amount: +1
+ }
}
- {
-
- }
- ]*/
+ ]
gametext: Battleground. While at this site, the count of sites the shadow player controls is +1.
lore: ""
promotext: ""
@@ -203,17 +230,32 @@
block: Towers
direction: Left
keywords: Sanctuary
- /*requires: {
-
- }
effects: [
{
-
+ type: Activated
+ phase: Fellowship
+ requires: {
+ type: PerPhaseLimit
+ limit: 1
+ }
+ cost: {
+ type: Exert
+ select: choose(unbound, Hobbit)
+ }
+ effect: [
+ {
+ type: PlayCardFromDrawDeck
+ select: choose(or(pipe,pipeweed))
+ shuffle: true
+ showAll: true
+ }
+ {
+ type: IncrementPerPhaseLimit
+ limit: 1
+ }
+ ]
}
- {
-
- }
- ]*/
+ ]
gametext: Sanctuary. Fellowship: Exert an unbound Hobbit to play a pipe or pipeweed from your draw deck (limit 1).
lore: ""
promotext: ""
@@ -248,17 +290,21 @@
block: Towers
direction: Left
keywords: Battleground
- /*requires: {
-
- }
effects: [
{
-
+ type: Modifier
+ modifier: {
+ type: AddKeyword
+ keyword: damage+1
+ filter: character
+ requires: {
+ type: CanSpot
+ filter: companion
+ count: 6
+ }
+ }
}
- {
-
- }
- ]*/
+ ]
gametext: Battleground. While you can spot 6 companions, each character is damage +1.
lore: ""
promotext: ""
@@ -292,17 +338,26 @@
site: 8
block: Towers
direction: Left
- /*requires: {
-
- }
effects: [
{
-
+ type: Trigger
+ trigger: {
+ type: MovesTo
+ filter: self
+ }
+ effect: {
+ type: ForEachPlayer
+ effect: {
+ type: Optional
+ text: Would you like to discard a non-artifact card in your opponent's support area?
+ effect: {
+ type: Discard
+ select: choose(not(artifact),not(your),zone(SUPPORT))
+ }
+ }
+ }
}
- {
-
- }
- ]*/
+ ]
gametext: When the fellowship moves to this site, each player may discard a card (except an artifact) from their opponent's support area.
lore: ""
promotext: ""
@@ -336,17 +391,20 @@
site: 9
block: Towers
direction: Left
- /*requires: {
-
- }
effects: [
{
-
+ type: Activated
+ phase: Shadow
+ cost: {
+ type: Exert
+ select: choose(minion)
+ }
+ effect: {
+ type: PlayCardFromDiscard
+ select: choose(side(shadow), possession)
+ }
}
- {
-
- }
- ]*/
+ ]
gametext: Shadow: Exert a minion to play a Shadow possession from your discard pile.
lore: ""
promotext: ""
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 c1d66d0a3..25d4bea88 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
@@ -469,7 +469,14 @@ public class ValueResolver {
Filterable filterable = filterableSource.getFilterable(actionContext);
return (game, cardAffected) -> GameUtils.getSpottableRacesCount(game, filterable);
});
- } else if (type.equalsIgnoreCase("forEachStacked")) {
+ } else if (type.equalsIgnoreCase("forEachSiteYouControl")) {
+ FieldUtils.validateAllowedFields(object, "over", "limit", "multiplier", "divider");
+ return new SmartValueSource(environment, object,
+ actionContext -> {
+ String performingPlayer = actionContext.getPerformingPlayer();
+ return (game, cardAffected) -> GameUtils.getSpottableControlledSitesCount(game, performingPlayer);
+ });
+ } else if (type.equalsIgnoreCase("forEachStacked")) {
FieldUtils.validateAllowedFields(object, "on", "filter", "over", "limit", "multiplier", "divider");
final String on = FieldUtils.getString(object.get("on"), "on");
final String filter = FieldUtils.getString(object.get("filter"), "filter", "any");
diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/FPCultureSpot.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/FPCultureCount.java
similarity index 94%
rename from gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/FPCultureSpot.java
rename to gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/FPCultureCount.java
index b6c9acc98..96a517493 100644
--- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/FPCultureSpot.java
+++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/FPCultureCount.java
@@ -6,7 +6,7 @@ import com.gempukku.lotro.cards.build.field.effect.appender.resolver.ValueResolv
import com.gempukku.lotro.logic.modifiers.FPCulturesSpotCountModifier;
import org.json.simple.JSONObject;
-public class FPCultureSpot implements ModifierSourceProducer {
+public class FPCultureCount implements ModifierSourceProducer {
@Override
public ModifierSource getModifierSource(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
FieldUtils.validateAllowedFields(object, "requires", "amount");
diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifierSourceFactory.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifierSourceFactory.java
index 84053f7b8..8b97f4951 100644
--- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifierSourceFactory.java
+++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifierSourceFactory.java
@@ -59,7 +59,7 @@ public class ModifierSourceFactory {
modifierProducers.put("disablegametext", new DisableGameText());
modifierProducers.put("doesnotaddtoarcherytotal", new DoesNotAddToArcheryTotal());
modifierProducers.put("extracosttoplay", new ExtraCostToPlay());
- modifierProducers.put("fpculturespot", new FPCultureSpot());
+ modifierProducers.put("fpculturecount", new FPCultureCount());
modifierProducers.put("hastomoveifable", new AddModifierFlag(ModifierFlag.HAS_TO_MOVE_IF_POSSIBLE));
modifierProducers.put("itemclassspot", new ItemClassSpot());
modifierProducers.put("modifyarcherytotal", new ModifyArcheryTotal());
@@ -82,6 +82,7 @@ public class ModifierSourceFactory {
modifierProducers.put("ringtextisinactive", new AddModifierFlag(ModifierFlag.RING_TEXT_INACTIVE));
modifierProducers.put("sarumanfirstsentenceinactive", new AddModifierFlag(ModifierFlag.SARUMAN_FIRST_SENTENCE_INACTIVE));
modifierProducers.put("shadowhasinitiative", new ShadowHasInitiative());
+ modifierProducers.put("sitecontrolcount", new SiteControlCount());
modifierProducers.put("skipphase", new SkipPhase());
modifierProducers.put("skirmishesresolvedinorderbyfirstshadowplayer", new AddModifierFlag(ModifierFlag.SKIRMISH_ORDER_BY_FIRST_SHADOW_PLAYER));
modifierProducers.put("transferforfree", new AddModifierFlag(ModifierFlag.TRANSFERS_FOR_FREE));
diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/SiteControlCount.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/SiteControlCount.java
new file mode 100644
index 000000000..5d7296198
--- /dev/null
+++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/SiteControlCount.java
@@ -0,0 +1,25 @@
+package com.gempukku.lotro.cards.build.field.effect.modifier;
+
+import com.gempukku.lotro.cards.build.*;
+import com.gempukku.lotro.cards.build.field.FieldUtils;
+import com.gempukku.lotro.cards.build.field.effect.appender.resolver.ValueResolver;
+import com.gempukku.lotro.logic.modifiers.FPCulturesSpotCountModifier;
+import com.gempukku.lotro.logic.modifiers.RaceSpotModifier;
+import com.gempukku.lotro.logic.modifiers.SiteControlCountModifier;
+import org.json.simple.JSONObject;
+
+public class SiteControlCount implements ModifierSourceProducer {
+ @Override
+ public ModifierSource getModifierSource(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
+ FieldUtils.validateAllowedFields(object, "amount", "requires");
+
+ final JSONObject[] conditionArray = FieldUtils.getObjectArray(object.get("requires"), "requires");
+ final ValueSource amount = ValueResolver.resolveEvaluator(object.get("amount"), environment);
+
+ final Requirement[] requirements = environment.getRequirementFactory().getRequirements(conditionArray, environment);
+
+ return actionContext -> new SiteControlCountModifier(actionContext.getSource(),
+ RequirementCondition.createCondition(requirements, actionContext),
+ amount.getEvaluator(actionContext));
+ }
+}
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
new file mode 100644
index 000000000..1c19477e8
--- /dev/null
+++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/requirement/CanSpotControlledSites.java
@@ -0,0 +1,18 @@
+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/RequirementFactory.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/requirement/RequirementFactory.java
index a5c70da78..b12b67776 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
@@ -30,6 +30,7 @@ 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/logic/GameUtils.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/GameUtils.java
index 4901a11f8..027279ae6 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
@@ -319,4 +319,8 @@ public class GameUtils {
public static int getSpottableShadowCulturesCount(LotroGame game, String playerId) {
return game.getModifiersQuerying().getNumberOfSpottableShadowCultures(game, playerId);
}
+
+ public static int getSpottableControlledSitesCount(LotroGame game, String playerId) {
+ return game.getModifiersQuerying().getNumberOfSpottableControlledSites(game, playerId);
+ }
}
diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/AbstractModifier.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/AbstractModifier.java
index 8c77faa80..1870c409a 100644
--- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/AbstractModifier.java
+++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/AbstractModifier.java
@@ -385,6 +385,9 @@ public abstract class AbstractModifier implements Modifier {
return 0;
}
+ @Override
+ public int getSiteControlledSpotCountModifier(LotroGame game, String playerId) { return 0; }
+
@Override
public int getSanctuaryHealModifier(LotroGame game) {
return 0;
diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/DelegateModifier.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/DelegateModifier.java
index 60df92025..ab132f5c4 100644
--- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/DelegateModifier.java
+++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/DelegateModifier.java
@@ -194,6 +194,11 @@ public class DelegateModifier implements Modifier {
return delegate.getFPCulturesSpotCountModifier(game, playerId);
}
+ @Override
+ public int getSiteControlledSpotCountModifier(LotroGame game, String playerId) {
+ return delegate.getSiteControlledSpotCountModifier(game, playerId);
+ }
+
@Override
public Evaluator getFpSkirmishStrengthOverrideEvaluator(LotroGame game, PhysicalCard fpCharacter) {
return delegate.getFpSkirmishStrengthOverrideEvaluator(game, fpCharacter);
diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/Modifier.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/Modifier.java
index 98bc51fa1..eb9644c11 100644
--- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/Modifier.java
+++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/Modifier.java
@@ -156,6 +156,8 @@ public interface Modifier {
int getFPCulturesSpotCountModifier(LotroGame game, String playerId);
+ int getSiteControlledSpotCountModifier(LotroGame game, String playerId);
+
int getSanctuaryHealModifier(LotroGame game);
int getPotentialDiscount(LotroGame game, PhysicalCard discountCard);
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 6ecf056a1..7ab228428 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
@@ -1014,6 +1014,17 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying {
return result;
}
+ @Override
+ public int getNumberOfSpottableControlledSites(LotroGame game, String playerId) {
+ int result = Filters.filterActive(game, Filters.siteControlled(playerId)).size();
+
+ for (Modifier modifier : getModifiers(game, ModifierEffect.SPOT_MODIFIER)) {
+ result += modifier.getSiteControlledSpotCountModifier(game, playerId);
+ }
+
+ return result;
+ }
+
private boolean canPlayerSpotCulture(LotroGame game, String playerId, Culture culture) {
for (Modifier modifier : getModifiers(game, ModifierEffect.SPOT_MODIFIER))
if (!modifier.canSpotCulture(game, culture, playerId))
diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersQuerying.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersQuerying.java
index 479c59f1e..86aa22210 100644
--- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersQuerying.java
+++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersQuerying.java
@@ -148,6 +148,8 @@ public interface ModifiersQuerying {
int getNumberOfSpottableShadowCultures(LotroGame game, String playerId);
+ int getNumberOfSpottableControlledSites(LotroGame game, String playerId);
+
int getSpotBonus(LotroGame game, Filterable filter);
boolean hasFlagActive(LotroGame game, ModifierFlag modifierFlag);
diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/SiteControlCountModifier.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/SiteControlCountModifier.java
new file mode 100644
index 000000000..f7c02e022
--- /dev/null
+++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/SiteControlCountModifier.java
@@ -0,0 +1,19 @@
+package com.gempukku.lotro.logic.modifiers;
+
+import com.gempukku.lotro.game.PhysicalCard;
+import com.gempukku.lotro.game.state.LotroGame;
+import com.gempukku.lotro.logic.modifiers.evaluator.Evaluator;
+
+public class SiteControlCountModifier extends AbstractModifier {
+ private final Evaluator _valueEvaluator;
+
+ public SiteControlCountModifier(PhysicalCard source, Condition condition, Evaluator value) {
+ super(source, "Modifies Shadow controlled site count", null, condition, ModifierEffect.SPOT_MODIFIER);
+ _valueEvaluator = value;
+ }
+
+ @Override
+ public int getSiteControlledSpotCountModifier(LotroGame game, String playerId) {
+ return _valueEvaluator.evaluateExpression(game, null);
+ }
+}