diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/PlayConditions.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/PlayConditions.java index b9b5f9271..8592799ff 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/PlayConditions.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/PlayConditions.java @@ -8,6 +8,7 @@ import com.gempukku.lotro.game.PhysicalCard; import com.gempukku.lotro.game.PhysicalCardVisitor; import com.gempukku.lotro.game.state.GameState; import com.gempukku.lotro.game.state.LotroGame; +import com.gempukku.lotro.logic.GameUtils; import com.gempukku.lotro.logic.modifiers.ModifierFlag; import com.gempukku.lotro.logic.modifiers.ModifiersQuerying; @@ -223,6 +224,10 @@ public class PlayConditions { return game.getGameState().getBurdens() >= count; } + public static boolean canSpotFPCultures(LotroGame game, int count, String playerId) { + return GameUtils.getSpottableFPCulturesCount(game.getGameState(), game.getModifiersQuerying(), playerId)>=count; + } + public static boolean hasInitiative(LotroGame game, Side side) { return game.getModifiersQuerying().hasInitiative(game.getGameState()) == side; } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/FPCulturesSpotCountModifier.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/FPCulturesSpotCountModifier.java new file mode 100644 index 000000000..6f2c62c6f --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/FPCulturesSpotCountModifier.java @@ -0,0 +1,30 @@ +package com.gempukku.lotro.cards.modifiers; + +import com.gempukku.lotro.game.PhysicalCard; +import com.gempukku.lotro.game.state.GameState; +import com.gempukku.lotro.logic.modifiers.AbstractModifier; +import com.gempukku.lotro.logic.modifiers.Condition; +import com.gempukku.lotro.logic.modifiers.ModifierEffect; +import com.gempukku.lotro.logic.modifiers.ModifiersQuerying; + +public class FPCulturesSpotCountModifier extends AbstractModifier { + private String _playerId; + private int _modifier; + + public FPCulturesSpotCountModifier(PhysicalCard source, String playerId, int modifier) { + this(source, playerId, null, modifier); + } + + public FPCulturesSpotCountModifier(PhysicalCard source, String playerId, Condition condition, int modifier) { + super(source, "Modifies FP culture count", null, condition, ModifierEffect.SPOT_MODIFIER); + _playerId = playerId; + _modifier = modifier; + } + + @Override + public int getFPCulturesSpotCountModifier(GameState gameState, ModifiersQuerying modifiersQuerying, String playerId) { + if (playerId.equals(_playerId)) + return _modifier; + return 0; + } +} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set20/sauron/Card20_350.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set20/sauron/Card20_350.java index 72c7676c4..a005096f4 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set20/sauron/Card20_350.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set20/sauron/Card20_350.java @@ -5,11 +5,11 @@ import com.gempukku.lotro.cards.PlayConditions; import com.gempukku.lotro.cards.effects.PreventableEffect; import com.gempukku.lotro.cards.effects.SelfExertEffect; import com.gempukku.lotro.cards.effects.choose.ChooseAndAssignCharacterToMinionEffect; -import com.gempukku.lotro.cards.modifiers.evaluator.CountCulturesEvaluator; import com.gempukku.lotro.common.*; import com.gempukku.lotro.game.PhysicalCard; import com.gempukku.lotro.game.state.GameState; import com.gempukku.lotro.game.state.LotroGame; +import com.gempukku.lotro.logic.GameUtils; import com.gempukku.lotro.logic.actions.ActivateCardAction; import com.gempukku.lotro.logic.actions.SubAction; import com.gempukku.lotro.logic.effects.AddThreatsEffect; @@ -37,7 +37,7 @@ public class Card20_350 extends AbstractMinion { @Override public int getTwilightCostModifier(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard self) { - return new CountCulturesEvaluator(Side.FREE_PEOPLE).evaluateExpression(gameState, modifiersQuerying, null); + return GameUtils.getSpottableFPCulturesCount(gameState, modifiersQuerying, self.getOwner()); } @Override diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set20/sauron/Card20_355.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set20/sauron/Card20_355.java index 82247a346..585acd029 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set20/sauron/Card20_355.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set20/sauron/Card20_355.java @@ -5,7 +5,6 @@ import com.gempukku.lotro.cards.PlayConditions; import com.gempukku.lotro.cards.TriggerConditions; import com.gempukku.lotro.cards.actions.PlayPermanentAction; import com.gempukku.lotro.cards.effects.choose.ChooseAndExertCharactersEffect; -import com.gempukku.lotro.cards.modifiers.evaluator.CountCulturesEvaluator; import com.gempukku.lotro.common.*; import com.gempukku.lotro.game.PhysicalCard; import com.gempukku.lotro.game.state.LotroGame; @@ -44,7 +43,7 @@ public class Card20_355 extends AbstractPermanent { @Override public List getRequiredAfterTriggers(LotroGame game, EffectResult effectResult, PhysicalCard self) { if (TriggerConditions.moves(game, effectResult) - && new CountCulturesEvaluator(Side.FREE_PEOPLE).evaluateExpression(game.getGameState(), game.getModifiersQuerying(), null)<3) { + && !PlayConditions.canSpotFPCultures(game, 3, self.getOwner())) { RequiredTriggerAction action = new RequiredTriggerAction(self); action.appendEffect( new AddTwilightEffect(self, 1)); diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set20/sauron/Card20_356.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set20/sauron/Card20_356.java new file mode 100644 index 000000000..b0a90761b --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set20/sauron/Card20_356.java @@ -0,0 +1,40 @@ +package com.gempukku.lotro.cards.set20.sauron; + +import com.gempukku.lotro.cards.AbstractEvent; +import com.gempukku.lotro.cards.PlayConditions; +import com.gempukku.lotro.cards.actions.PlayEventAction; +import com.gempukku.lotro.cards.effects.AddUntilStartOfPhaseModifierEffect; +import com.gempukku.lotro.cards.modifiers.FPCulturesSpotCountModifier; +import com.gempukku.lotro.common.Culture; +import com.gempukku.lotro.common.Phase; +import com.gempukku.lotro.common.Race; +import com.gempukku.lotro.common.Side; +import com.gempukku.lotro.game.PhysicalCard; +import com.gempukku.lotro.game.state.LotroGame; + +/** + * 2 + * Fall of Free Peoples + * Sauron Event • Maneuver + * To play, exert a [Sauron] Orc. Until the regroup phase, the number of Free Peoples cultures you can spot is -1. + */ +public class Card20_356 extends AbstractEvent { + public Card20_356() { + super(Side.SHADOW, 2, Culture.SAURON, "Fall of Free Peoples", Phase.MANEUVER); + } + + @Override + public boolean checkPlayRequirements(String playerId, LotroGame game, PhysicalCard self, int withTwilightRemoved, int twilightModifier, boolean ignoreRoamingPenalty, boolean ignoreCheckingDeadPile) { + return super.checkPlayRequirements(playerId, game, self, withTwilightRemoved, twilightModifier, ignoreRoamingPenalty, ignoreCheckingDeadPile) + && PlayConditions.canExert(self, game, Culture.SAURON, Race.ORC); + } + + @Override + public PlayEventAction getPlayCardAction(String playerId, LotroGame game, PhysicalCard self, int twilightModifier, boolean ignoreRoamingPenalty) { + PlayEventAction action = new PlayEventAction(self); + action.appendEffect( + new AddUntilStartOfPhaseModifierEffect( + new FPCulturesSpotCountModifier(self, playerId, -1), Phase.REGROUP)); + return action; + } +} 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 fc670b941..6675ca0c5 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 @@ -114,4 +114,8 @@ public class GameUtils { public static int getRegion(int siteNumber) { return 1 + ((siteNumber - 1) / 3); } + + public static int getSpottableFPCulturesCount(GameState gameState, ModifiersQuerying modifiersQuerying, String playerId) { + return modifiersQuerying.getNumberOfSpottableFPCultures(gameState, 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 3859db407..7893f1bc9 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 @@ -358,4 +358,14 @@ public abstract class AbstractModifier implements Modifier { public Evaluator getFpSkirmishStrengthOverrideEvaluator(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard fpCharacter) { return null; } + + @Override + public boolean canSpotCulture(GameState gameState, ModifiersQuerying modifiersQuerying, Culture culture, String playerId) { + return true; + } + + @Override + public int getFPCulturesSpotCountModifier(GameState gameState, ModifiersQuerying modifiersQuerying, String playerId) { + return 0; + } } 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 49052d4d2..f2051d422 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 @@ -143,4 +143,8 @@ public interface Modifier { public boolean lostAllKeywords(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard card); Evaluator getFpSkirmishStrengthOverrideEvaluator(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard fpCharacter); + + public boolean canSpotCulture(GameState gameState, ModifiersQuerying modifiersQuerying, Culture culture, String playerId); + + public int getFPCulturesSpotCountModifier(GameState gameState, ModifiersQuerying modifiersQuerying, String playerId); } 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 cfdf56c15..445134d84 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 @@ -1,6 +1,7 @@ package com.gempukku.lotro.logic.modifiers; import com.gempukku.lotro.common.*; +import com.gempukku.lotro.filters.Filters; import com.gempukku.lotro.game.PhysicalCard; import com.gempukku.lotro.game.state.GameState; import com.gempukku.lotro.logic.actions.ActivateCardAction; @@ -974,6 +975,27 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying { return true; } + @Override + public int getNumberOfSpottableFPCultures(GameState gameState, String playerId) { + Set spottableCulturesBasedOnCards = new HashSet(); + for (PhysicalCard spottableFPCard : Filters.filterActive(gameState, this, Side.FREE_PEOPLE, Filters.spottable)) { + final Culture fpCulture = spottableFPCard.getBlueprint().getCulture(); + if (fpCulture != null) + spottableCulturesBasedOnCards.add(fpCulture); + } + + int result = 0; + for (Culture spottableCulturesBasedOnCardsOnCard : spottableCulturesBasedOnCards) + for (Modifier modifier : getModifiers(gameState, ModifierEffect.SPOT_MODIFIER)) + if (modifier.canSpotCulture(gameState, this, spottableCulturesBasedOnCardsOnCard, playerId)) + result++; + + for (Modifier modifier : getModifiers(gameState, ModifierEffect.SPOT_MODIFIER)) + result += modifier.getFPCulturesSpotCountModifier(gameState, this, playerId); + + return result; + } + @Override public int getSpotBonus(GameState gameState, Filterable filter) { int result = 0; 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 a3895398f..b61967c03 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 @@ -139,6 +139,8 @@ public interface ModifiersQuerying { public boolean canBeSpotted(GameState gameState, PhysicalCard card); + public int getNumberOfSpottableFPCultures(GameState gameState, String playerId); + public int getSpotBonus(GameState gameState, Filterable filter); public boolean hasFlagActive(GameState gameState, ModifierFlag modifierFlag);