diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/CantTakeArcheryWoundsModifier.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/CantTakeArcheryWoundsModifier.java new file mode 100644 index 000000000..443776ea1 --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/CantTakeArcheryWoundsModifier.java @@ -0,0 +1,24 @@ +package com.gempukku.lotro.cards.modifiers; + +import com.gempukku.lotro.common.Filterable; +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 CantTakeArcheryWoundsModifier extends AbstractModifier { + public CantTakeArcheryWoundsModifier(PhysicalCard source, Filterable affectFilter) { + super(source, "Can't take archery wounds", affectFilter, ModifierEffect.WOUND_MODIFIER); + } + + public CantTakeArcheryWoundsModifier(PhysicalCard source, Condition condition, Filterable affectFilter) { + super(source, "Can't take archery wounds", affectFilter, condition, ModifierEffect.WOUND_MODIFIER); + } + + @Override + public boolean canTakeArcheryWound(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) { + return false; + } +} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set8/raider/Card8_060.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set8/raider/Card8_060.java new file mode 100644 index 000000000..ed0197629 --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set8/raider/Card8_060.java @@ -0,0 +1,44 @@ +package com.gempukku.lotro.cards.set8.raider; + +import com.gempukku.lotro.cards.AbstractMinion; +import com.gempukku.lotro.cards.modifiers.CantTakeArcheryWoundsModifier; +import com.gempukku.lotro.common.CardType; +import com.gempukku.lotro.common.Culture; +import com.gempukku.lotro.common.Keyword; +import com.gempukku.lotro.common.Race; +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 com.gempukku.lotro.logic.modifiers.SpotCondition; + +import java.util.Collections; +import java.util.List; + +/** + * Set: Siege of Gondor + * Side: Shadow + * Culture: Raider + * Twilight Cost: 5 + * Type: Minion • Man + * Strength: 11 + * Vitality: 3 + * Site: 4 + * Game Text: Southron. Archer. While you can spot another [RAIDER] Man, Ring-bound companions cannot take archery + * wounds. + */ +public class Card8_060 extends AbstractMinion { + public Card8_060() { + super(5, 11, 3, 4, Race.MAN, Culture.RAIDER, "Haradrim Marksman", true); + addKeyword(Keyword.SOUTHRON); + addKeyword(Keyword.ARCHER); + } + + @Override + public List getAlwaysOnModifiers(LotroGame game, PhysicalCard self) { + return Collections.singletonList( + new CantTakeArcheryWoundsModifier(self, + new SpotCondition(Filters.not(self), Culture.RAIDER, Race.MAN), + Filters.and(CardType.COMPANION, Keyword.RING_BOUND))); + } +} 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 360c3db8b..d63900f62 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 @@ -118,6 +118,11 @@ public abstract class AbstractModifier implements Modifier { return true; } + @Override + public boolean canTakeArcheryWound(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) { + return true; + } + @Override public boolean canBeExerted(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard exertionSource, PhysicalCard card) { return true; 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 89c1edca3..502386404 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 @@ -49,6 +49,8 @@ public interface Modifier { public boolean canTakeWound(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, int woundsAlreadyTakenInPhase); + public boolean canTakeArcheryWound(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard); + public boolean canBeExerted(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard source, PhysicalCard card); public boolean isAllyParticipateInArcheryFire(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard card); 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 130bd2b42..e0f109b3f 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 @@ -337,6 +337,17 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying { return true; } + @Override + public boolean canTakeArcheryWound(GameState gameState, PhysicalCard card) { + for (Modifier modifier : getModifiers(ModifierEffect.WOUND_MODIFIER)) { + if (affectsCardWithSkipSet(gameState, card, modifier)) { + if (!modifier.canTakeArcheryWound(gameState, this, card)) + return false; + } + } + return true; + } + @Override public boolean canBeExerted(GameState gameState, PhysicalCard source, PhysicalCard card) { for (Modifier modifier : getModifiers(ModifierEffect.WOUND_MODIFIER)) { 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 7a1219c56..5320d63ae 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 @@ -50,6 +50,8 @@ public interface ModifiersQuerying { // Wounds/exertions public boolean canTakeWound(GameState gameState, PhysicalCard card); + public boolean canTakeArcheryWound(GameState gameState, PhysicalCard card); + public boolean canBeExerted(GameState gameState, PhysicalCard exertionSource, PhysicalCard card); public boolean canBeHealed(GameState gameState, PhysicalCard card); 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 20e80fbc8..551f9d7b1 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 @@ -29,26 +29,34 @@ public class FellowshipPlayerAssignsArcheryDamageGameProcess implements GameProc if (_woundsToAssign > 0) { Filter filter = - Filters.or( - Filters.type(CardType.COMPANION), - Filters.and( - Filters.type(CardType.ALLY), - Filters.or( - Filters.and( - Filters.allyAtHome, + Filters.and( + Filters.or( + Filters.type(CardType.COMPANION), + Filters.and( + Filters.type(CardType.ALLY), + Filters.or( + 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) { - return !modifiersQuerying.isAllyPreventedFromParticipatingInArcheryFire(gameState, physicalCard); + return modifiersQuerying.isAllyAllowedToParticipateInArcheryFire(gameState, physicalCard); } - }), - new Filter() { - @Override - public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) { - return modifiersQuerying.isAllyAllowedToParticipateInArcheryFire(gameState, physicalCard); - } - }) - ) + }) + ) + ), + new Filter() { + @Override + public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) { + return modifiersQuerying.canTakeArcheryWound(gameState, physicalCard); + } + } ); SystemQueueAction action = new SystemQueueAction(); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/archery/ShadowPlayerAssignsArcheryDamageGameProcess.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/archery/ShadowPlayerAssignsArcheryDamageGameProcess.java index f393bb42b..496979026 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/archery/ShadowPlayerAssignsArcheryDamageGameProcess.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/archery/ShadowPlayerAssignsArcheryDamageGameProcess.java @@ -3,9 +3,12 @@ package com.gempukku.lotro.logic.timing.processes.turn.archery; import com.gempukku.lotro.common.CardType; import com.gempukku.lotro.filters.Filter; import com.gempukku.lotro.filters.Filters; +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.actions.SystemQueueAction; import com.gempukku.lotro.logic.effects.ChooseAndWoundCharactersEffect; +import com.gempukku.lotro.logic.modifiers.ModifiersQuerying; import com.gempukku.lotro.logic.timing.processes.GameProcess; public class ShadowPlayerAssignsArcheryDamageGameProcess implements GameProcess { @@ -26,7 +29,16 @@ public class ShadowPlayerAssignsArcheryDamageGameProcess implements GameProcess @Override public void process(LotroGame game) { if (_woundsToAssign > 0) { - Filter filter = Filters.and(Filters.type(CardType.MINION), Filters.owner(_playerId)); + Filter filter = + Filters.and( + Filters.type(CardType.MINION), + Filters.owner(_playerId), + new Filter() { + @Override + public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) { + return modifiersQuerying.canTakeArcheryWound(gameState, physicalCard); + } + }); SystemQueueAction action = new SystemQueueAction(); for (int i = 0; i < _woundsToAssign; i++) {