From 370387857746ce76240df40b8e1e9232819546c0 Mon Sep 17 00:00:00 2001 From: "marcins78@gmail.com" Date: Sat, 8 Oct 2011 15:18:43 +0000 Subject: [PATCH] "Forests of Ithilien" --- .../modifiers/MinionSiteNumberModifier.java | 38 +++++++++++ .../lotro/cards/set1/site/Card1_352.java | 2 +- .../lotro/cards/set4/gondor/Card4_121.java | 64 +++++++++++++++++++ .../logic/modifiers/AbstractModifier.java | 5 ++ .../lotro/logic/modifiers/Modifier.java | 2 + .../lotro/logic/modifiers/ModifierEffect.java | 2 +- .../lotro/logic/modifiers/ModifiersLogic.java | 10 +++ .../logic/modifiers/ModifiersQuerying.java | 2 + .../turn/archery/ArcheryFireGameProcess.java | 20 +++--- ...PlayerAssignsArcheryDamageGameProcess.java | 17 ++--- ...PeoplePlayerAssignsMinionsGameProcess.java | 5 +- ...dowPlayerAssignsHisMinionsGameProcess.java | 5 +- .../lotro/logic/timing/rules/RoamingRule.java | 2 +- 13 files changed, 142 insertions(+), 32 deletions(-) create mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/MinionSiteNumberModifier.java create mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set4/gondor/Card4_121.java diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/MinionSiteNumberModifier.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/MinionSiteNumberModifier.java new file mode 100644 index 000000000..b703c4fbb --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/MinionSiteNumberModifier.java @@ -0,0 +1,38 @@ +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.Condition; +import com.gempukku.lotro.logic.modifiers.ModifierEffect; +import com.gempukku.lotro.logic.modifiers.ModifiersQuerying; +import com.gempukku.lotro.logic.modifiers.evaluator.ConstantEvaluator; +import com.gempukku.lotro.logic.modifiers.evaluator.Evaluator; + +public class MinionSiteNumberModifier extends AbstractModifier { + private Evaluator _evaluator; + + public MinionSiteNumberModifier(PhysicalCard source, Filter affectFilter, Condition condition, int modifier) { + this(source, affectFilter, condition, new ConstantEvaluator(modifier)); + } + + public MinionSiteNumberModifier(PhysicalCard source, Filter affectFilter, Condition condition, Evaluator evaluator) { + super(source, null, affectFilter, condition, new ModifierEffect[]{ModifierEffect.SITE_NUMBER_MODIFIER}); + _evaluator = evaluator; + } + + @Override + public String getText(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard self) { + final int value = _evaluator.evaluateExpression(gameState, modifiersQuerying, self); + if (value >= 0) + return "Site number +" + value; + else + return "Site number " + value; + } + + @Override + public int getMinionSiteNumber(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, int result) { + return result + _evaluator.evaluateExpression(gameState, modifiersQuerying, physicalCard); + } +} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/site/Card1_352.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/site/Card1_352.java index c4b67c2c1..659c8de0b 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/site/Card1_352.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/site/Card1_352.java @@ -25,6 +25,6 @@ public class Card1_352 extends AbstractSite { @Override public Modifier getAlwaysOnModifier(PhysicalCard self) { - return new StrengthModifier(self, Filters.and(Filters.type(CardType.ALLY), Filters.siteNumber(6)), 3); + return new StrengthModifier(self, Filters.and(Filters.type(CardType.ALLY), Filters.siteNumber(6), Filters.siteBlock(Block.FELLOWSHIP)), 3); } } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set4/gondor/Card4_121.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set4/gondor/Card4_121.java new file mode 100644 index 000000000..f93f1385f --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set4/gondor/Card4_121.java @@ -0,0 +1,64 @@ +package com.gempukku.lotro.cards.set4.gondor; + +import com.gempukku.lotro.cards.AbstractPermanent; +import com.gempukku.lotro.cards.PlayConditions; +import com.gempukku.lotro.cards.effects.ChooseAndExertCharactersEffect; +import com.gempukku.lotro.cards.effects.LiberateASiteEffect; +import com.gempukku.lotro.cards.modifiers.MinionSiteNumberModifier; +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.game.state.LotroGame; +import com.gempukku.lotro.logic.actions.ActivateCardAction; +import com.gempukku.lotro.logic.effects.DiscardCardsFromPlayEffect; +import com.gempukku.lotro.logic.modifiers.Condition; +import com.gempukku.lotro.logic.modifiers.Modifier; +import com.gempukku.lotro.logic.modifiers.ModifiersQuerying; +import com.gempukku.lotro.logic.timing.Action; + +import java.util.Collections; +import java.util.List; + +/** + * Set: The Two Towers + * Side: Free + * Culture: Gondor + * Twilight Cost: 0 + * Type: Condition + * Game Text: Plays to your support area. While the fellowship is at site 5T, the site number of each Man in + * a skirmish is +2. Regroup: Discard this condition and exert a Ring-bound Man to liberate a site. + */ +public class Card4_121 extends AbstractPermanent { + public Card4_121() { + super(Side.FREE_PEOPLE, 0, CardType.CONDITION, Culture.GONDOR, Zone.SUPPORT, "Forests of Ithilien", true); + } + + @Override + public List getAlwaysOnModifiers(PhysicalCard self) { + return Collections.singletonList( + new MinionSiteNumberModifier(self, Filters.and(Filters.race(Race.MAN), Filters.inSkirmish()), + new Condition() { + @Override + public boolean isFullfilled(GameState gameState, ModifiersQuerying modifiersQuerying) { + return gameState.getCurrentSiteNumber() == 5 && gameState.getCurrentSiteBlock() == Block.TWO_TOWERS; + } + }, 2)); + } + + @Override + protected List getExtraPhaseActions(String playerId, LotroGame game, PhysicalCard self) { + if (PlayConditions.canUseFPCardDuringPhase(game.getGameState(), Phase.REGROUP, self) + && PlayConditions.canExert(self, game.getGameState(), game.getModifiersQuerying(), Filters.race(Race.MAN), Filters.keyword(Keyword.RING_BOUND))) { + ActivateCardAction action = new ActivateCardAction(self, Keyword.REGROUP); + action.appendCost( + new DiscardCardsFromPlayEffect(self, self)); + action.appendCost( + new ChooseAndExertCharactersEffect(action, playerId, 1, 1, Filters.race(Race.MAN), Filters.keyword(Keyword.RING_BOUND))); + action.appendEffect( + new LiberateASiteEffect(self)); + return Collections.singletonList(action); + } + return null; + } +} 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 47c7a21b4..798ab50df 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 @@ -90,6 +90,11 @@ public abstract class AbstractModifier implements Modifier { return result; } + @Override + public int getMinionSiteNumber(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, int result) { + return result; + } + @Override public int getTwilightCost(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 aa9e02101..c9964d334 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 @@ -36,6 +36,8 @@ public interface Modifier { public int getResistance(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, int result); + public int getMinionSiteNumber(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, int result); + public int getTwilightCost(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, int result); public int getPlayOnTwilightCost(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, PhysicalCard target, int result); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifierEffect.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifierEffect.java index d088ebc70..1c0a9d2e9 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifierEffect.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifierEffect.java @@ -1,7 +1,7 @@ package com.gempukku.lotro.logic.modifiers; public enum ModifierEffect { - KEYWORD_MODIFIER, STRENGTH_MODIFIER, VITALITY_MODIFIER, RESISTANCE_MODIFIER, TWILIGHT_COST_MODIFIER, OVERWHELM_MODIFIER, + KEYWORD_MODIFIER, STRENGTH_MODIFIER, VITALITY_MODIFIER, RESISTANCE_MODIFIER, SITE_NUMBER_MODIFIER, TWILIGHT_COST_MODIFIER, OVERWHELM_MODIFIER, WOUND_MODIFIER, PRESENCE_MODIFIER, ARCHERY_MODIFIER, MOVE_LIMIT_MODIFIER, ACTION_MODIFIER, ASSIGNMENT_MODIFIER, DISCARD_FROM_PLAY_MODIFIER, LOOK_OR_REVEAL_MODIFIER, SPOT_MODIFIER, TARGET_MODIFIER 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 a198ccf41..f1e352234 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 @@ -257,6 +257,16 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying { return Math.max(0, result); } + @Override + public int getMinionSiteNumber(GameState gameState, PhysicalCard physicalCard) { + int result = physicalCard.getBlueprint().getSiteNumber(); + for (Modifier modifier : getModifiers(ModifierEffect.SITE_NUMBER_MODIFIER)) { + if (affectsCardWithSkipSet(gameState, physicalCard, modifier)) + result = modifier.getMinionSiteNumber(gameState, this, physicalCard, result); + } + return Math.max(0, result); + } + @Override public int getTwilightCost(GameState gameState, PhysicalCard physicalCard) { int result = physicalCard.getBlueprint().getTwilightCost(); 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 d04c708b5..c184b1b7c 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 @@ -42,6 +42,8 @@ public interface ModifiersQuerying { public int getResistance(GameState gameState, PhysicalCard physicalCard); + public int getMinionSiteNumber(GameState gameState, PhysicalCard physicalCard); + public boolean isOverwhelmedByStrength(GameState gameState, PhysicalCard card, int strength, int opposingStrength); // Wounds/exertions 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 b1ca434d3..cdbabac9b 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,17 +39,15 @@ public class ArcheryFireGameProcess implements GameProcess { Filters.and( Filters.type(CardType.ALLY), Filters.or( - Filters.and( - Filters.siteNumber(_game.getGameState().getCurrentSiteNumber()), - Filters.siteBlock(_game.getGameState().getCurrentSiteBlock())) - ), - new Filter() { - @Override - public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) { - return modifiersQuerying.isAllyParticipateInArcheryFire(gameState, physicalCard); - } - } - ))); + Filters.isAllyAtHome(), + new Filter() { + @Override + public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) { + return modifiersQuerying.isAllyParticipateInArcheryFire(gameState, physicalCard); + } + }) + ) + )); _fellowshipArcheryTotal = _game.getModifiersQuerying().getArcheryTotal(gameState, Side.FREE_PEOPLE, _fellowshipArcheryTotal); 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 de86f914b..c0d87d426 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,16 +34,13 @@ public class FellowshipPlayerAssignsArcheryDamageGameProcess implements GameProc Filters.and( Filters.type(CardType.ALLY), Filters.or( - Filters.and( - Filters.siteNumber(_game.getGameState().getCurrentSiteNumber()), - Filters.siteBlock(_game.getGameState().getCurrentSiteBlock())) - ), - new Filter() { - @Override - public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) { - return modifiersQuerying.isAllyParticipateInArcheryFire(gameState, physicalCard); - } - } + Filters.isAllyAtHome(), + new Filter() { + @Override + public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) { + return modifiersQuerying.isAllyParticipateInArcheryFire(gameState, 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 c302f90b7..5f61fae7c 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,10 +47,7 @@ public class FreePeoplePlayerAssignsMinionsGameProcess implements GameProcess { Filters.and( Filters.type(CardType.ALLY), Filters.or( - Filters.and( - Filters.siteNumber(gameState.getCurrentSiteNumber()), - Filters.siteBlock(gameState.getCurrentSiteBlock()) - ), + Filters.isAllyAtHome(), 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 490352f49..ac58a135c 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,10 +50,7 @@ public class ShadowPlayerAssignsHisMinionsGameProcess implements GameProcess { Filters.and( Filters.type(CardType.ALLY), Filters.or( - Filters.and( - Filters.siteNumber(gameState.getCurrentSiteNumber()), - Filters.siteBlock(gameState.getCurrentSiteBlock()) - ), + Filters.isAllyAtHome(), 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/rules/RoamingRule.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/RoamingRule.java index 7d7c14f6c..58e467526 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 @@ -19,7 +19,7 @@ public class RoamingRule { Filter roamingFilter = Filters.and(Filters.type(CardType.MINION), new Filter() { @Override public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) { - return (physicalCard.getBlueprint().getSiteNumber() > gameState.getCurrentSiteNumber()); + return (modifiersQuerying.getMinionSiteNumber(gameState, physicalCard) > gameState.getCurrentSiteNumber()); } });