diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/RoamingPenaltyModifier.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/RoamingPenaltyModifier.java new file mode 100644 index 000000000..c12add1a2 --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/RoamingPenaltyModifier.java @@ -0,0 +1,22 @@ +package com.gempukku.lotro.cards.modifiers; + +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.ModifierEffect; +import com.gempukku.lotro.logic.modifiers.ModifiersQuerying; + +public class RoamingPenaltyModifier extends AbstractModifier { + private int _modifier; + + public RoamingPenaltyModifier(PhysicalCard source, Filter affectFilter, int modifier) { + super(source, "Roaming penalty " + ((modifier > 0) ? ("+" + modifier) : modifier), affectFilter, new ModifierEffect[]{ModifierEffect.TWILIGHT_COST_MODIFIER}); + _modifier = modifier; + } + + @Override + public int getRoamingPenalty(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, int result) { + return result + _modifier; + } +} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/sauron/Card1_261.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/sauron/Card1_261.java new file mode 100644 index 000000000..ae3784758 --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/sauron/Card1_261.java @@ -0,0 +1,60 @@ +package com.gempukku.lotro.cards.set1.sauron; + +import com.gempukku.lotro.cards.AbstractMinion; +import com.gempukku.lotro.cards.PlayConditions; +import com.gempukku.lotro.cards.effects.CancelEffect; +import com.gempukku.lotro.cards.effects.ExertCharacterEffect; +import com.gempukku.lotro.cards.modifiers.RoamingPenaltyModifier; +import com.gempukku.lotro.common.CardType; +import com.gempukku.lotro.common.Culture; +import com.gempukku.lotro.common.Keyword; +import com.gempukku.lotro.common.Side; +import com.gempukku.lotro.filters.Filters; +import com.gempukku.lotro.game.PhysicalCard; +import com.gempukku.lotro.game.state.LotroGame; +import com.gempukku.lotro.logic.actions.DefaultCostToEffectAction; +import com.gempukku.lotro.logic.modifiers.Modifier; +import com.gempukku.lotro.logic.timing.Action; +import com.gempukku.lotro.logic.timing.Effect; +import com.gempukku.lotro.logic.timing.EffectResult; + +import java.util.Collections; +import java.util.List; + +/** + * Set: The Fellowship of the Ring + * Side: Shadow + * Culture: Sauron + * Twilight Cost: 1 + * Type: Minion • Orc + * Strength: 5 + * Vitality: 2 + * Site: 6 + * Game Text: Tracker. The roaming penalty for each [SAURON] minion you play is -1. Response: If a Free Peoples regroup + * event is played, exert this minion to cancel that event. + */ +public class Card1_261 extends AbstractMinion { + public Card1_261() { + super(1, 5, 2, 6, Keyword.ORC, Culture.SAURON, "Orc Ambusher"); + addKeyword(Keyword.TRACKER); + } + + @Override + public Modifier getAlwaysOnEffect(PhysicalCard self) { + return new RoamingPenaltyModifier(self, Filters.and(Filters.owner(self.getOwner()), Filters.culture(Culture.SAURON), Filters.type(CardType.MINION)), -1); + } + + @Override + public List getOptionalBeforeActions(String playerId, LotroGame game, Effect effect, EffectResult effectResult, PhysicalCard self) { + if (PlayConditions.played(game.getGameState(), game.getModifiersQuerying(), effectResult, Filters.and(Filters.side(Side.FREE_PEOPLE), Filters.type(CardType.EVENT), Filters.keyword(Keyword.REGROUP))) + && PlayConditions.canExert(game.getGameState(), game.getModifiersQuerying(), self)) { + DefaultCostToEffectAction action = new DefaultCostToEffectAction(self, null, "Exert this minion to cancel that event."); + action.addCost( + new ExertCharacterEffect(self)); + action.addEffect( + new CancelEffect(effect)); + return Collections.singletonList(action); + } + return null; + } +} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/site/Card1_328.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/site/Card1_328.java index 363d3d1d5..952684efc 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/site/Card1_328.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/site/Card1_328.java @@ -1,14 +1,13 @@ package com.gempukku.lotro.cards.set1.site; import com.gempukku.lotro.cards.AbstractSite; +import com.gempukku.lotro.cards.modifiers.RoamingPenaltyModifier; import com.gempukku.lotro.common.Keyword; 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.logic.modifiers.AbstractModifier; import com.gempukku.lotro.logic.modifiers.Modifier; -import com.gempukku.lotro.logic.modifiers.ModifierEffect; import com.gempukku.lotro.logic.modifiers.ModifiersQuerying; /** @@ -25,17 +24,14 @@ public class Card1_328 extends AbstractSite { @Override public Modifier getAlwaysOnEffect(final PhysicalCard self) { - return new AbstractModifier(self, "The roaming penalty for each Nazgul you play to Bree Streets is -2.", Filters.and(Filters.keyword(Keyword.ROAMING), Filters.keyword(Keyword.NAZGUL), - new Filter() { - @Override - public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) { - return (gameState.getCurrentSite() == self); - } - }), new ModifierEffect[]{ModifierEffect.TWILIGHT_COST_MODIFIER}) { - @Override - public int getTwilightCost(GameState gameState, ModifiersQuerying modifiersLogic, PhysicalCard physicalCard, int result) { - return result - 2; - } - }; + return new RoamingPenaltyModifier(self, + Filters.and( + Filters.keyword(Keyword.NAZGUL), + new Filter() { + @Override + public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) { + return (gameState.getCurrentSite() == self); + } + }), -2); } } 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 46583863e..c6d3091f4 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 @@ -138,4 +138,9 @@ public abstract class AbstractModifier implements Modifier { public boolean canBeHealed(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard card, boolean result) { return result; } + + @Override + public int getRoamingPenalty(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, 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 cc5f3b44f..d127c8a44 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 @@ -33,6 +33,8 @@ public interface Modifier { public int getPlayOnTwilightCost(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, PhysicalCard target, int result); + public int getRoamingPenalty(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, int result); + public boolean isOverwhelmedByStrength(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, int strength, int opposingStrength, boolean result); public boolean canTakeWound(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, boolean 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 fcee41e83..ab1a5cd6f 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 @@ -272,6 +272,20 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying { return result; } + @Override + public int getRoamingPenalty(GameState gameState, PhysicalCard physicalCard) { + int result = 2; + for (Modifier modifier : getModifiers(ModifierEffect.TWILIGHT_COST_MODIFIER)) { + if (affectsCardWithSkipSet(gameState, physicalCard, modifier)) + result = modifier.getRoamingPenalty(gameState, this, physicalCard, result); + } + for (Modifier modifier : getModifiers(ModifierEffect.ALL_MODIFIER)) { + if (affectsCardWithSkipSet(gameState, physicalCard, modifier)) + result = modifier.getRoamingPenalty(gameState, this, physicalCard, result); + } + return result; + } + @Override public boolean isOverwhelmedByStrength(GameState gameState, PhysicalCard card, int strength, int opposingStrength) { boolean result = (opposingStrength > strength * 2); 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 81ea8a5ee..cedf4ad92 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 @@ -26,6 +26,8 @@ public interface ModifiersQuerying { public int getPlayOnTwilightCost(GameState gameState, PhysicalCard physicalCard, PhysicalCard target); + public int getRoamingPenalty(GameState gameState, PhysicalCard physicalCard); + public int getStrength(GameState gameState, PhysicalCard physicalCard); public int getVitality(GameState gameState, PhysicalCard physicalCard); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/RoamingRule.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/RoamingRule.java index 4a3b7ca72..78906a654 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/RoamingRule.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/RoamingRule.java @@ -6,10 +6,10 @@ 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.logic.modifiers.*; - -import java.util.LinkedList; -import java.util.List; +import com.gempukku.lotro.logic.modifiers.AbstractModifier; +import com.gempukku.lotro.logic.modifiers.ModifierEffect; +import com.gempukku.lotro.logic.modifiers.ModifiersLogic; +import com.gempukku.lotro.logic.modifiers.ModifiersQuerying; public class RoamingRule { private ModifiersLogic _modifiersLogic; @@ -26,11 +26,26 @@ public class RoamingRule { } }); - List modifiers = new LinkedList(); - modifiers.add(new KeywordModifier(null, null, Keyword.ROAMING)); - modifiers.add(new TwilightCostModifier(null, null, 2)); - _modifiersLogic.addAlwaysOnModifier( - new CompositeModifier(null, roamingFilter, modifiers)); + new AbstractModifier(null, "Has Roaming keyword", roamingFilter, new ModifierEffect[]{ModifierEffect.KEYWORD_MODIFIER, ModifierEffect.TWILIGHT_COST_MODIFIER}) { + @Override + public int getKeywordCount(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, Keyword keyword, int result) { + if (keyword == Keyword.ROAMING) + return result + 1; + return result; + } + + @Override + public boolean hasKeyword(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, Keyword keyword, boolean result) { + if (keyword == Keyword.ROAMING) + return true; + return result; + } + + @Override + public int getTwilightCost(GameState gameState, ModifiersQuerying modifiersLogic, PhysicalCard physicalCard, int result) { + return result + Math.min(0, modifiersLogic.getRoamingPenalty(gameState, physicalCard)); + } + }); } }