From 9879a377282c7549950bb304672ceca65e818d2c Mon Sep 17 00:00:00 2001 From: "marcins78@gmail.com" Date: Thu, 26 Jan 2012 17:10:59 +0000 Subject: [PATCH] "Tremendous Wall" --- ...tTakeWoundsFromLosingSkirmishModifier.java | 28 +++++++ .../lotro/cards/set15/gondor/Card15_070.java | 82 +++++++++++++++++++ .../logic/modifiers/AbstractModifier.java | 5 ++ .../lotro/logic/modifiers/Modifier.java | 2 + .../lotro/logic/modifiers/ModifiersLogic.java | 14 ++++ .../logic/modifiers/ModifiersQuerying.java | 2 + .../actions/ResolveSkirmishDamageAction.java | 9 +- 7 files changed, 141 insertions(+), 1 deletion(-) create mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/CantTakeWoundsFromLosingSkirmishModifier.java create mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set15/gondor/Card15_070.java diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/CantTakeWoundsFromLosingSkirmishModifier.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/CantTakeWoundsFromLosingSkirmishModifier.java new file mode 100644 index 000000000..3870ca48b --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/CantTakeWoundsFromLosingSkirmishModifier.java @@ -0,0 +1,28 @@ +package com.gempukku.lotro.cards.modifiers; + +import com.gempukku.lotro.common.Filterable; +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.ModifierEffect; +import com.gempukku.lotro.logic.modifiers.ModifiersQuerying; + +import java.util.Set; + +public class CantTakeWoundsFromLosingSkirmishModifier extends AbstractModifier { + private Filterable _winnersFilter; + + public CantTakeWoundsFromLosingSkirmishModifier(PhysicalCard source, Filterable affectFilter, Filterable winnersFilter) { + super(source, "Can't take wounds", affectFilter, ModifierEffect.WOUND_MODIFIER); + _winnersFilter = winnersFilter; + } + + @Override + public boolean canTakeWoundsFromLosingSkirmish(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, Set winners) { + if (_winnersFilter == null + || Filters.filter(winners, gameState, modifiersQuerying, _winnersFilter).size() > 0) + return false; + return true; + } +} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set15/gondor/Card15_070.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set15/gondor/Card15_070.java new file mode 100644 index 000000000..a8779c206 --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set15/gondor/Card15_070.java @@ -0,0 +1,82 @@ +package com.gempukku.lotro.cards.set15.gondor; + +import com.gempukku.lotro.cards.AbstractPermanent; +import com.gempukku.lotro.cards.PlayConditions; +import com.gempukku.lotro.cards.effects.ChoiceEffect; +import com.gempukku.lotro.cards.effects.SpotEffect; +import com.gempukku.lotro.cards.effects.TransferPermanentEffect; +import com.gempukku.lotro.cards.effects.choose.ChooseAndExertCharactersEffect; +import com.gempukku.lotro.cards.modifiers.CantTakeWoundsFromLosingSkirmishModifier; +import com.gempukku.lotro.common.*; +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.ChooseActiveCardEffect; +import com.gempukku.lotro.logic.modifiers.Modifier; +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: The Hunters + * Side: Free + * Culture: Gondor + * Twilight Cost: 2 + * Type: Condition • Support Area + * Game Text: Fortification. Characters skirmishing bearer cannot take wounds from losing a skirmish involving bearer. + * Skirmish: Exert a [GONDOR] Man or spot 3 rangers to transfer this condition from your support area to a minion + * skirmishing a [GONDOR] Man. + */ +public class Card15_070 extends AbstractPermanent { + public Card15_070() { + super(Side.FREE_PEOPLE, 2, CardType.CONDITION, Culture.GONDOR, Zone.SUPPORT, "Tremendous Wall", true); + addKeyword(Keyword.FORTIFICATION); + } + + @Override + public Modifier getAlwaysOnModifier(PhysicalCard self) { + return new CantTakeWoundsFromLosingSkirmishModifier(self, + Filters.and(Filters.character, Filters.inSkirmishAgainst(Filters.hasAttached(self))), Filters.hasAttached(self)); + } + + @Override + protected List getExtraPhaseActions(String playerId, LotroGame game, final PhysicalCard self) { + if (PlayConditions.canUseFPCardDuringPhase(game, Phase.SKIRMISH, self) + && (PlayConditions.canExert(self, game, Culture.GONDOR, Race.MAN) + || PlayConditions.canSpot(game, 3, Keyword.RANGER)) + && self.getZone() == Zone.SUPPORT) { + final ActivateCardAction action = new ActivateCardAction(self); + List possibleCosts = new LinkedList(); + possibleCosts.add( + new ChooseAndExertCharactersEffect(action, playerId, 1, 1, Culture.GONDOR, Race.MAN) { + @Override + public String getText(LotroGame game) { + return "Exert a GONDOR Man"; + } + }); + possibleCosts.add( + new SpotEffect(3, Keyword.RANGER) { + @Override + public String getText(LotroGame game) { + return "Spot 3 rangers"; + } + }); + action.appendCost( + new ChoiceEffect(action, playerId, possibleCosts)); + action.appendEffect( + new ChooseActiveCardEffect(self, playerId, "Choose a minion", CardType.MINION, Filters.inSkirmishAgainst(Culture.GONDOR, Race.MAN)) { + @Override + protected void cardSelected(LotroGame game, PhysicalCard card) { + action.appendEffect( + new TransferPermanentEffect(self, card)); + } + }); + 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 406a8cbb4..16ed16458 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 @@ -136,6 +136,11 @@ public abstract class AbstractModifier implements Modifier { return true; } + @Override + public boolean canTakeWoundsFromLosingSkirmish(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, Set winners) { + return true; + } + @Override public boolean canTakeArcheryWound(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) { 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 170cb3a55..fe0db4e9e 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 @@ -56,6 +56,8 @@ public interface Modifier { public boolean canTakeWounds(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, int woundsAlreadyTakenInPhase, int woundsToTake); + public boolean canTakeWoundsFromLosingSkirmish(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, Set winners); + public boolean canTakeArcheryWound(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard); public boolean canBeExerted(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard source, 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 20649b818..380a9f950 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 @@ -465,6 +465,20 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying { } } + @Override + public boolean canTakeWoundsFromLosingSkirmish(GameState gameState, PhysicalCard card, Set winners) { + LoggingThreadLocal.logMethodStart(card, "canTakeWound"); + try { + for (Modifier modifier : getModifiersAffectingCard(gameState, ModifierEffect.WOUND_MODIFIER, card)) { + if (!modifier.canTakeWoundsFromLosingSkirmish(gameState, this, card, winners)) + return false; + } + return true; + } finally { + LoggingThreadLocal.logMethodEnd(); + } + } + @Override public boolean canTakeArcheryWound(GameState gameState, PhysicalCard card) { LoggingThreadLocal.logMethodStart(card, "canTakeArcheryWound"); 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 a2889f41d..5951bf7b5 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 @@ -55,6 +55,8 @@ public interface ModifiersQuerying { // Wounds/exertions public boolean canTakeWounds(GameState gameState, PhysicalCard card, int woundsToTake); + public boolean canTakeWoundsFromLosingSkirmish(GameState gameState, PhysicalCard card, Set winners); + public boolean canTakeArcheryWound(GameState gameState, PhysicalCard card); public boolean canBeExerted(GameState gameState, PhysicalCard exertionSource, PhysicalCard card); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/actions/ResolveSkirmishDamageAction.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/actions/ResolveSkirmishDamageAction.java index 99da08d2b..47d0e2813 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/actions/ResolveSkirmishDamageAction.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/actions/ResolveSkirmishDamageAction.java @@ -1,6 +1,7 @@ package com.gempukku.lotro.logic.timing.actions; 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; @@ -43,7 +44,13 @@ public class ResolveSkirmishDamageAction extends RequiredTriggerAction { if (_remainingDamage > 0) { _remainingDamage--; - return new WoundCharactersEffect(_skirmishResult.getWinners(), Filters.in(_skirmishResult.getInSkirmishLosers())); + return new WoundCharactersEffect(_skirmishResult.getWinners(), Filters.in(_skirmishResult.getInSkirmishLosers()), + new Filter() { + @Override + public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) { + return modifiersQuerying.canTakeWoundsFromLosingSkirmish(gameState, physicalCard, _skirmishResult.getWinners()); + } + }); } return null;