diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/AllyMayNotParticipateInArcheryFireAndSkirmishesModifier.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/AllyMayNotParticipateInArcheryFireAndSkirmishesModifier.java new file mode 100644 index 000000000..1698c87ee --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/AllyMayNotParticipateInArcheryFireAndSkirmishesModifier.java @@ -0,0 +1,29 @@ +package com.gempukku.lotro.cards.modifiers; + +import com.gempukku.lotro.common.Side; +import com.gempukku.lotro.filters.Filter; +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 AllyMayNotParticipateInArcheryFireAndSkirmishesModifier extends AbstractModifier { + private PhysicalCard _source; + + public AllyMayNotParticipateInArcheryFireAndSkirmishesModifier(PhysicalCard source, Condition condition, Filter affectFilter) { + super(source, "May not participate in archery fire and skirmishes", affectFilter, condition, new ModifierEffect[]{ModifierEffect.PRESENCE_MODIFIER}); + _source = source; + } + + @Override + public boolean isAllyPreventedFromParticipatingInArcheryFire(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard card) { + return true; + } + + @Override + public boolean isAllyPreventedFromParticipatingInSkirmishes(GameState gameState, Side sidePlayer, ModifiersQuerying modifiersQuerying, PhysicalCard card) { + return true; + } +} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set4/site/Card4_340.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set4/site/Card4_340.java new file mode 100644 index 000000000..d549b64fd --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set4/site/Card4_340.java @@ -0,0 +1,36 @@ +package com.gempukku.lotro.cards.set4.site; + +import com.gempukku.lotro.cards.AbstractSite; +import com.gempukku.lotro.cards.modifiers.AllyMayNotParticipateInArcheryFireAndSkirmishesModifier; +import com.gempukku.lotro.cards.modifiers.LocationCondition; +import com.gempukku.lotro.common.Block; +import com.gempukku.lotro.common.CardType; +import com.gempukku.lotro.common.Culture; +import com.gempukku.lotro.common.Keyword; +import com.gempukku.lotro.filters.Filters; +import com.gempukku.lotro.game.PhysicalCard; +import com.gempukku.lotro.game.state.LotroGame; +import com.gempukku.lotro.logic.modifiers.Modifier; + +import java.util.Collections; +import java.util.List; + +/** + * Set: The Two Towers + * Twilight Cost: 0 + * Type: Site + * Site: 3T + * Game Text: Sanctuary. Each [ROHAN] ally may not participate in archery fire or skirmishes at Streets of Edoras. + */ +public class Card4_340 extends AbstractSite { + public Card4_340() { + super("Streets of Edoras", Block.TWO_TOWERS, 3, 0, Direction.RIGHT); + addKeyword(Keyword.SANCTUARY); + } + + @Override + public List getAlwaysOnModifiers(LotroGame game, PhysicalCard self) { + return Collections.singletonList( + new AllyMayNotParticipateInArcheryFireAndSkirmishesModifier(self, new LocationCondition(Filters.sameCard(self)), Filters.and(Culture.ROHAN, CardType.ALLY))); + } +} 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 ff6f062b5..c4728aa31 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 @@ -130,6 +130,16 @@ public abstract class AbstractModifier implements Modifier { return false; } + @Override + public boolean isAllyPreventedFromParticipatingInArcheryFire(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard card) { + return false; + } + + @Override + public boolean isAllyPreventedFromParticipatingInSkirmishes(GameState gameState, Side sidePlayer, ModifiersQuerying modifiersQuerying, PhysicalCard card) { + return false; + } + @Override public int getArcheryTotal(GameState gameState, ModifiersQuerying modifiersQuerying, Side side, int result) { return result; 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 789b1614d..b7cab74db 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 @@ -54,6 +54,10 @@ public interface Modifier { public boolean isAllyParticipateInSkirmishes(GameState gameState, Side sidePlayer, ModifiersQuerying modifiersQuerying, PhysicalCard card); + public boolean isAllyPreventedFromParticipatingInArcheryFire(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard card); + + public boolean isAllyPreventedFromParticipatingInSkirmishes(GameState gameState, Side sidePlayer, ModifiersQuerying modifiersQuerying, PhysicalCard card); + public int getArcheryTotal(GameState gameState, ModifiersQuerying modifiersQuerying, Side side, int result); public int getMoveLimit(GameState gameState, ModifiersQuerying modifiersQuerying, int result); 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 482e1ded0..c3a40ad8b 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 @@ -347,6 +347,26 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying { return false; } + @Override + public boolean isAllyPreventedFromParticipatingInArcheryFire(GameState gameState, PhysicalCard card) { + for (Modifier modifier : getModifiers(ModifierEffect.PRESENCE_MODIFIER)) { + if (affectsCardWithSkipSet(gameState, card, modifier)) + if (modifier.isAllyPreventedFromParticipatingInArcheryFire(gameState, this, card)) + return true; + } + return false; + } + + @Override + public boolean isAllyPreventedFromParticipatingInSkirmishes(GameState gameState, Side sidePlayer, PhysicalCard card) { + for (Modifier modifier : getModifiers(ModifierEffect.PRESENCE_MODIFIER)) { + if (affectsCardWithSkipSet(gameState, card, modifier)) + if (modifier.isAllyPreventedFromParticipatingInSkirmishes(gameState, sidePlayer, this, card)) + return true; + } + return false; + } + @Override public boolean addsToArcheryTotal(GameState gameState, PhysicalCard card) { boolean result = true; 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 dd4c5df91..2dfff9a30 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 @@ -60,6 +60,10 @@ public interface ModifiersQuerying { public boolean isAllyParticipateInArcheryFire(GameState gameState, PhysicalCard card); + public boolean isAllyPreventedFromParticipatingInSkirmishes(GameState gameState, Side sidePlayer, PhysicalCard card); + + public boolean isAllyPreventedFromParticipatingInArcheryFire(GameState gameState, PhysicalCard card); + public boolean isValidAssignments(GameState gameState, Side side, Map> assignments); // Playing actions diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/archery/ArcheryFireGameProcess.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/archery/ArcheryFireGameProcess.java index b5a77837c..eb9622c89 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/archery/ArcheryFireGameProcess.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/archery/ArcheryFireGameProcess.java @@ -39,7 +39,14 @@ public class ArcheryFireGameProcess implements GameProcess { Filters.and( Filters.type(CardType.ALLY), Filters.or( - Filters.allyAtHome, + Filters.and( + Filters.allyAtHome, + new Filter() { + @Override + public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) { + return !modifiersQuerying.isAllyPreventedFromParticipatingInArcheryFire(gameState, physicalCard); + } + }), new Filter() { @Override public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) { diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/archery/FellowshipPlayerAssignsArcheryDamageGameProcess.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/archery/FellowshipPlayerAssignsArcheryDamageGameProcess.java index 77ec8c23f..37890ec04 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/archery/FellowshipPlayerAssignsArcheryDamageGameProcess.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/archery/FellowshipPlayerAssignsArcheryDamageGameProcess.java @@ -34,7 +34,14 @@ public class FellowshipPlayerAssignsArcheryDamageGameProcess implements GameProc Filters.and( Filters.type(CardType.ALLY), Filters.or( - Filters.allyAtHome, + Filters.and( + Filters.allyAtHome, + new Filter() { + @Override + public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) { + return !modifiersQuerying.isAllyPreventedFromParticipatingInArcheryFire(gameState, physicalCard); + } + }), new Filter() { @Override public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) { diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/assign/FreePeoplePlayerAssignsMinionsGameProcess.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/assign/FreePeoplePlayerAssignsMinionsGameProcess.java index 261fc76fb..0655e7936 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/assign/FreePeoplePlayerAssignsMinionsGameProcess.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/assign/FreePeoplePlayerAssignsMinionsGameProcess.java @@ -47,7 +47,14 @@ public class FreePeoplePlayerAssignsMinionsGameProcess implements GameProcess { Filters.and( Filters.type(CardType.ALLY), Filters.or( - Filters.allyAtHome, + Filters.and( + Filters.allyAtHome, + new Filter() { + @Override + public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) { + return !modifiersQuerying.isAllyPreventedFromParticipatingInSkirmishes(gameState, Side.FREE_PEOPLE, physicalCard); + } + }), new Filter() { @Override public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) { diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/assign/ShadowPlayerAssignsHisMinionsGameProcess.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/assign/ShadowPlayerAssignsHisMinionsGameProcess.java index b02ba4ec7..8f60acbf0 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/assign/ShadowPlayerAssignsHisMinionsGameProcess.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/assign/ShadowPlayerAssignsHisMinionsGameProcess.java @@ -50,7 +50,14 @@ public class ShadowPlayerAssignsHisMinionsGameProcess implements GameProcess { Filters.and( Filters.type(CardType.ALLY), Filters.or( - Filters.allyAtHome, + Filters.and( + Filters.allyAtHome, + new Filter() { + @Override + public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) { + return !modifiersQuerying.isAllyPreventedFromParticipatingInSkirmishes(gameState, Side.SHADOW, physicalCard); + } + }), new Filter() { @Override public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) {