From 47b027691e8d78983abebd52aaedcd7ecd4a3388 Mon Sep 17 00:00:00 2001 From: "marcins78@gmail.com" Date: Mon, 17 Oct 2011 12:53:25 +0000 Subject: [PATCH] "Birchseed" --- ...tesInArcheryFireAndSkirmishesModifier.java | 2 +- .../ParticipatesInSkirmishesModifier.java | 25 +++++++ .../lotro/cards/set5/gandalf/Card5_015.java | 75 +++++++++++++++++++ .../com/gempukku/lotro/filters/Filters.java | 4 +- .../logic/modifiers/AbstractModifier.java | 2 +- .../lotro/logic/modifiers/Modifier.java | 2 +- .../lotro/logic/modifiers/ModifiersLogic.java | 4 +- .../logic/modifiers/ModifiersQuerying.java | 2 +- ...PeoplePlayerAssignsMinionsGameProcess.java | 15 +++- ...dowPlayerAssignsHisMinionsGameProcess.java | 2 +- 10 files changed, 122 insertions(+), 11 deletions(-) create mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/ParticipatesInSkirmishesModifier.java create mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set5/gandalf/Card5_015.java diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/AllyParticipatesInArcheryFireAndSkirmishesModifier.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/AllyParticipatesInArcheryFireAndSkirmishesModifier.java index f84da3030..69401b17a 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/AllyParticipatesInArcheryFireAndSkirmishesModifier.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/AllyParticipatesInArcheryFireAndSkirmishesModifier.java @@ -24,7 +24,7 @@ public class AllyParticipatesInArcheryFireAndSkirmishesModifier extends Abstract } @Override - public boolean isAllyParticipateInSkirmishes(GameState gameState, Side sidePlayer, ModifiersQuerying modifiersQuerying, PhysicalCard card) { + public boolean isParticipateInSkirmishes(GameState gameState, Side sidePlayer, ModifiersQuerying modifiersQuerying, PhysicalCard card) { boolean unhasty = modifiersQuerying.hasKeyword(gameState, card, Keyword.UNHASTY); return sidePlayer == Side.SHADOW || !unhasty || _source.getBlueprint().getCulture() == Culture.GANDALF; diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/ParticipatesInSkirmishesModifier.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/ParticipatesInSkirmishesModifier.java new file mode 100644 index 000000000..edb7faa59 --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/ParticipatesInSkirmishesModifier.java @@ -0,0 +1,25 @@ +package com.gempukku.lotro.cards.modifiers; + +import com.gempukku.lotro.common.Culture; +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.ModifierEffect; +import com.gempukku.lotro.logic.modifiers.ModifiersQuerying; + +public class ParticipatesInSkirmishesModifier extends AbstractModifier { + private PhysicalCard _source; + + public ParticipatesInSkirmishesModifier(PhysicalCard source, Filter affectFilter) { + super(source, "Can participate in skirmishes", affectFilter, new ModifierEffect[]{ModifierEffect.PRESENCE_MODIFIER}); + _source = source; + } + + @Override + public boolean isParticipateInSkirmishes(GameState gameState, Side sidePlayer, ModifiersQuerying modifiersQuerying, PhysicalCard card) { + return sidePlayer == Side.SHADOW + || _source.getBlueprint().getCulture() == Culture.GANDALF; + } +} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set5/gandalf/Card5_015.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set5/gandalf/Card5_015.java new file mode 100644 index 000000000..46000cc4a --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set5/gandalf/Card5_015.java @@ -0,0 +1,75 @@ +package com.gempukku.lotro.cards.set5.gandalf; + +import com.gempukku.lotro.cards.AbstractCompanion; +import com.gempukku.lotro.cards.PlayConditions; +import com.gempukku.lotro.cards.effects.AddUntilEndOfPhaseModifierEffect; +import com.gempukku.lotro.cards.effects.ChoiceEffect; +import com.gempukku.lotro.cards.effects.ExertCharactersEffect; +import com.gempukku.lotro.cards.effects.choose.ChooseAndDiscardCardsFromHandEffect; +import com.gempukku.lotro.cards.effects.choose.ChooseAndExertCharactersEffect; +import com.gempukku.lotro.cards.modifiers.ParticipatesInSkirmishesModifier; +import com.gempukku.lotro.common.Culture; +import com.gempukku.lotro.common.Keyword; +import com.gempukku.lotro.common.Phase; +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.actions.ActivateCardAction; +import com.gempukku.lotro.logic.effects.ChooseAndHealCharactersEffect; +import com.gempukku.lotro.logic.timing.Action; +import com.gempukku.lotro.logic.timing.Effect; + +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; + +/** + * Set: Battle of Helm's Deep + * Side: Free + * Culture: Gandalf + * Twilight Cost: 3 + * Type: Companion • Ent + * Strength: 8 + * Vitality: 4 + * Resistance: 6 + * Game Text: Unhasty. Assignment: Exert an unbound Hobbit or discard 2 cards from hand to allow Birchseed to skirmish. + * Fellowship: Exert Birchseed to Heal an unbound Hobbit. + */ +public class Card5_015 extends AbstractCompanion { + public Card5_015() { + super(3, 8, 4, Culture.GANDALF, Race.ENT, null, "Birchseed", true); + addKeyword(Keyword.UNHASTY); + } + + @Override + protected List getExtraInPlayPhaseActions(String playerId, LotroGame game, PhysicalCard self) { + if (PlayConditions.canUseFPCardDuringPhase(game.getGameState(), Phase.FELLOWSHIP, self) + && PlayConditions.canSelfExert(self, game)) { + ActivateCardAction action = new ActivateCardAction(self); + action.appendCost( + new ExertCharactersEffect(self, self)); + action.appendEffect( + new ChooseAndHealCharactersEffect(action, playerId, Race.HOBBIT, Filters.unboundCompanion)); + return Collections.singletonList(action); + } + if (PlayConditions.canUseFPCardDuringPhase(game.getGameState(), Phase.ASSIGNMENT, self) + && ( + PlayConditions.canExert(self, game, Race.HOBBIT, Filters.unboundCompanion) + || game.getGameState().getHand(playerId).size() >= 2)) { + ActivateCardAction action = new ActivateCardAction(self); + List possibleCosts = new LinkedList(); + possibleCosts.add( + new ChooseAndExertCharactersEffect(action, playerId, 1, 1, Race.HOBBIT, Filters.unboundCompanion)); + possibleCosts.add( + new ChooseAndDiscardCardsFromHandEffect(action, playerId, false, 2)); + action.appendCost( + new ChoiceEffect(action, playerId, possibleCosts)); + action.appendEffect( + new AddUntilEndOfPhaseModifierEffect( + new ParticipatesInSkirmishesModifier(self, Filters.sameCard(self)), Phase.ASSIGNMENT)); + return Collections.singletonList(action); + } + return null; + } +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/filters/Filters.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/filters/Filters.java index 6e1eb246b..7fcab75f2 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/filters/Filters.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/filters/Filters.java @@ -323,11 +323,11 @@ public class Filters { }; } - public static Filter not(final Filter filter) { + public static Filter not(final Filterable... filters) { return new Filter() { @Override public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) { - return !filter.accepts(gameState, modifiersQuerying, physicalCard); + return !Filters.and(filters).accepts(gameState, modifiersQuerying, physicalCard); } }; } 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 7d37eb4e3..dc59d0ec4 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 @@ -128,7 +128,7 @@ public abstract class AbstractModifier implements Modifier { } @Override - public boolean isAllyParticipateInSkirmishes(GameState gameState, Side sidePlayer, ModifiersQuerying modifiersQuerying, PhysicalCard card) { + public boolean isParticipateInSkirmishes(GameState gameState, Side sidePlayer, ModifiersQuerying modifiersQuerying, PhysicalCard card) { return false; } 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 b7cab74db..efc5892f2 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 @@ -52,7 +52,7 @@ public interface Modifier { public boolean isAllyParticipateInArcheryFire(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard card); - public boolean isAllyParticipateInSkirmishes(GameState gameState, Side sidePlayer, ModifiersQuerying modifiersQuerying, PhysicalCard card); + public boolean isParticipateInSkirmishes(GameState gameState, Side sidePlayer, ModifiersQuerying modifiersQuerying, PhysicalCard card); public boolean isAllyPreventedFromParticipatingInArcheryFire(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 c3a40ad8b..fdbd06714 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 @@ -338,10 +338,10 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying { } @Override - public boolean isAllyParticipateInSkirmishes(GameState gameState, Side sidePlayer, PhysicalCard card) { + public boolean isParticipateInSkirmishes(GameState gameState, Side sidePlayer, PhysicalCard card) { for (Modifier modifier : getModifiers(ModifierEffect.PRESENCE_MODIFIER)) { if (affectsCardWithSkipSet(gameState, card, modifier)) - if (modifier.isAllyParticipateInSkirmishes(gameState, sidePlayer, this, card)) + if (modifier.isParticipateInSkirmishes(gameState, sidePlayer, this, card)) return true; } return false; 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 2dfff9a30..8db423384 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 @@ -56,7 +56,7 @@ public interface ModifiersQuerying { // Assignments public boolean canBeAssignedToSkirmish(GameState gameState, Side playerSide, PhysicalCard card); - public boolean isAllyParticipateInSkirmishes(GameState gameState, Side sidePlayer, PhysicalCard card); + public boolean isParticipateInSkirmishes(GameState gameState, Side sidePlayer, PhysicalCard card); public boolean isAllyParticipateInArcheryFire(GameState gameState, PhysicalCard card); 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 0655e7936..c797bf860 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 @@ -43,7 +43,18 @@ public class FreePeoplePlayerAssignsMinionsGameProcess implements GameProcess { if (minions.size() > 0) { final Collection freePeopleTargets = Filters.filterActive(gameState, _game.getModifiersQuerying(), Filters.or( - Filters.type(CardType.COMPANION), + Filters.and( + Filters.type(CardType.COMPANION), + Filters.or( + Filters.not(Keyword.UNHASTY), + new Filter() { + @Override + public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) { + return modifiersQuerying.isParticipateInSkirmishes(gameState, Side.FREE_PEOPLE, physicalCard); + } + } + ) + ), Filters.and( Filters.type(CardType.ALLY), Filters.or( @@ -58,7 +69,7 @@ public class FreePeoplePlayerAssignsMinionsGameProcess implements GameProcess { new Filter() { @Override public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) { - return modifiersQuerying.isAllyParticipateInSkirmishes(gameState, Side.FREE_PEOPLE, physicalCard); + return modifiersQuerying.isParticipateInSkirmishes(gameState, Side.FREE_PEOPLE, 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 8f60acbf0..31b3a17de 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 @@ -61,7 +61,7 @@ public class ShadowPlayerAssignsHisMinionsGameProcess implements GameProcess { new Filter() { @Override public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) { - return modifiersQuerying.isAllyParticipateInSkirmishes(gameState, Side.SHADOW, physicalCard); + return modifiersQuerying.isParticipateInSkirmishes(gameState, Side.SHADOW, physicalCard); } } )