diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set7/gondor/Card7_093.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set7/gondor/Card7_093.java new file mode 100644 index 000000000..b657d4a4c --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set7/gondor/Card7_093.java @@ -0,0 +1,77 @@ +package com.gempukku.lotro.cards.set7.gondor; + +import com.gempukku.lotro.cards.AbstractAttachableFPPossession; +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.choose.ChooseAndDiscardCardsFromHandEffect; +import com.gempukku.lotro.cards.effects.choose.ChooseAndDiscardCardsFromPlayEffect; +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.ResolveSkirmishEffect; +import com.gempukku.lotro.logic.modifiers.StrengthModifier; +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 Return of the King + * Side: Free + * Culture: Gondor + * Twilight Cost: 1 + * Type: Possession • Armor + * Game Text: Bearer must be a [GONDOR] Man. Response: if bearer is about to be overwhelmed, discard a [GONDOR] + * fortification or a card from hand to make bearer strength +2. + */ +public class Card7_093 extends AbstractAttachableFPPossession { + public Card7_093() { + super(1, 0, 0, Culture.GONDOR, PossessionClass.ARMOR, "Footman's Armor"); + } + + @Override + protected Filterable getValidTargetFilter(String playerId, LotroGame game, PhysicalCard self) { + return Filters.and(Culture.GONDOR, Race.MAN); + } + + @Override + public List getOptionalInPlayBeforeActions(String playerId, LotroGame game, Effect effect, PhysicalCard self) { + if (effect.getType() == Effect.Type.BEFORE_SKIRMISH_RESOLVED) { + ResolveSkirmishEffect resolveEffect = (ResolveSkirmishEffect) effect; + if (resolveEffect.getUpcomingResult(game) == ResolveSkirmishEffect.Result.FELLOWSHIP_OVERWHELMED + && game.getGameState().getSkirmish().getFellowshipCharacter() == self.getAttachedTo()) { + if (PlayConditions.canDiscardFromPlay(self, game, Culture.GONDOR, Keyword.FORTIFICATION) + || PlayConditions.canDiscardFromHand(game, playerId, 1, Filters.any)) { + ActivateCardAction action = new ActivateCardAction(self); + List possibleCosts = new LinkedList(); + possibleCosts.add( + new ChooseAndDiscardCardsFromPlayEffect(action, playerId, 1, 1, Culture.GONDOR, Keyword.FORTIFICATION) { + @Override + public String getText(LotroGame game) { + return "Discard a GONDOR Fortification"; + } + }); + possibleCosts.add( + new ChooseAndDiscardCardsFromHandEffect(action, playerId, false, 1) { + @Override + public String getText(LotroGame game) { + return "Discard a card from hand"; + } + }); + action.appendCost( + new ChoiceEffect(action, playerId, possibleCosts)); + action.appendEffect( + new AddUntilEndOfPhaseModifierEffect( + new StrengthModifier(self, Filters.hasAttached(self), 2), Phase.SKIRMISH)); + return Collections.singletonList(action); + } + } + } + return null; + } +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/ResolveSkirmishEffect.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/ResolveSkirmishEffect.java new file mode 100644 index 000000000..b13245f69 --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/ResolveSkirmishEffect.java @@ -0,0 +1,90 @@ +package com.gempukku.lotro.logic.effects; + +import com.gempukku.lotro.game.PhysicalCard; +import com.gempukku.lotro.game.state.LotroGame; +import com.gempukku.lotro.game.state.Skirmish; +import com.gempukku.lotro.logic.timing.AbstractEffect; +import com.gempukku.lotro.logic.timing.EffectResult; +import com.gempukku.lotro.logic.timing.RuleUtils; +import com.gempukku.lotro.logic.timing.results.NormalSkirmishResult; +import com.gempukku.lotro.logic.timing.results.OverwhelmSkirmishResult; + +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class ResolveSkirmishEffect extends AbstractEffect { + private Skirmish _skirmish; + + public enum Result { + FELLOWSHIP_OVERWHELMED, FELLOWSHIP_LOSES, SHADOW_LOSES, SHADOW_OVERWHELMED + } + + public ResolveSkirmishEffect(Skirmish skirmish) { + _skirmish = skirmish; + } + + @Override + public String getText(LotroGame game) { + return "Resolve skirmish"; + } + + @Override + public Type getType() { + return Type.BEFORE_SKIRMISH_RESOLVED; + } + + @Override + public boolean isPlayableInFull(LotroGame game) { + return true; + } + + public Result getUpcomingResult(LotroGame game) { + int fpStrength = RuleUtils.getFellowshipSkirmishStrength(game); + int shadowStrength = RuleUtils.getShadowSkirmishStrength(game); + + final PhysicalCard fellowshipCharacter = _skirmish.getFellowshipCharacter(); + + int multiplier = game.getModifiersQuerying().getOverwhelmMultiplier(game.getGameState(), fellowshipCharacter); + + if (fpStrength * multiplier <= shadowStrength && shadowStrength != 0) { + return Result.FELLOWSHIP_OVERWHELMED; + } else if (shadowStrength >= fpStrength) { + return Result.FELLOWSHIP_LOSES; + } else if (fpStrength >= 2 * shadowStrength) { + return Result.SHADOW_OVERWHELMED; + } else { + return Result.SHADOW_LOSES; + } + } + + @Override + protected FullEffectResult playEffectReturningResult(LotroGame game) { + Result result = getUpcomingResult(game); + Set results = new HashSet(); + + if (result == Result.FELLOWSHIP_LOSES) { + game.getGameState().sendMessage("Skirmish finishes with a normal win"); + results.add(new NormalSkirmishResult(_skirmish.getShadowCharacters(), fpList(_skirmish.getFellowshipCharacter()))); + } else if (result == Result.SHADOW_LOSES) { + game.getGameState().sendMessage("Skirmish finishes with a normal win"); + results.add(new NormalSkirmishResult(fpList(_skirmish.getFellowshipCharacter()), _skirmish.getShadowCharacters())); + } else if (result == Result.FELLOWSHIP_OVERWHELMED) { + game.getGameState().sendMessage("Skirmish finishes with an overwhelm"); + results.add(new OverwhelmSkirmishResult(_skirmish.getShadowCharacters(), fpList(_skirmish.getFellowshipCharacter()))); + } else { + game.getGameState().sendMessage("Skirmish finishes with an overwhelm"); + results.add(new OverwhelmSkirmishResult(fpList(_skirmish.getFellowshipCharacter()), _skirmish.getShadowCharacters())); + } + + return new FullEffectResult(results, true, true); + } + + private List fpList(PhysicalCard card) { + if (card != null) + return Collections.singletonList(card); + else + return Collections.emptyList(); + } +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/Effect.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/Effect.java index ff33597a3..2ae2627a3 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/Effect.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/Effect.java @@ -9,6 +9,7 @@ public interface Effect { BEFORE_WOUND, BEFORE_EXERT, BEFORE_ADD_BURDENS, BEFORE_DISCARD_FROM_PLAY, BEFORE_ADD_TWILIGHT, BEFORE_KILLED, BEFORE_HEALED, BEFORE_TAKE_CONTROL_OF_A_SITE, + BEFORE_SKIRMISH_RESOLVED, START_OF_PHASE, END_OF_PHASE, END_OF_TURN } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/actions/ResolveSkirmishAction.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/actions/ResolveSkirmishAction.java index e2bcf0152..ce7f6f35a 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/actions/ResolveSkirmishAction.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/actions/ResolveSkirmishAction.java @@ -2,19 +2,15 @@ package com.gempukku.lotro.logic.timing.actions; import com.gempukku.lotro.common.Phase; import com.gempukku.lotro.game.PhysicalCard; -import com.gempukku.lotro.game.state.GameState; import com.gempukku.lotro.game.state.LotroGame; import com.gempukku.lotro.game.state.Skirmish; -import com.gempukku.lotro.logic.effects.OverwhelmedEffect; -import com.gempukku.lotro.logic.effects.SkirmishResolvedEffect; +import com.gempukku.lotro.logic.effects.ResolveSkirmishEffect; import com.gempukku.lotro.logic.effects.TriggeringResultEffect; import com.gempukku.lotro.logic.timing.Action; import com.gempukku.lotro.logic.timing.Effect; -import com.gempukku.lotro.logic.timing.RuleUtils; import com.gempukku.lotro.logic.timing.UnrespondableEffect; import com.gempukku.lotro.logic.timing.results.SkirmishAboutToEndResult; -import java.util.Collections; import java.util.Iterator; import java.util.LinkedList; import java.util.List; @@ -78,42 +74,17 @@ public class ResolveSkirmishAction implements Action { private Iterator resolveSkirmish() { List effects = new LinkedList(); - final GameState gameState = _game.getGameState(); - - int fpStrength = RuleUtils.getFellowshipSkirmishStrength(_game); - int shadowStrength = RuleUtils.getShadowSkirmishStrength(_game); - - final PhysicalCard fellowshipCharacter = _skirmish.getFellowshipCharacter(); - - final List shadowCharacters = _skirmish.getShadowCharacters(); - - int multiplier = _game.getModifiersQuerying().getOverwhelmMultiplier(gameState, fellowshipCharacter); - - if (fpStrength * multiplier <= shadowStrength && shadowStrength != 0) - effects.add(new OverwhelmedEffect(shadowCharacters, fpList(fellowshipCharacter))); - else if (shadowStrength >= fpStrength) - effects.add(new SkirmishResolvedEffect(shadowCharacters, fpList(fellowshipCharacter))); - else if (fpStrength >= 2 * shadowStrength) - effects.add(new OverwhelmedEffect(fpList(fellowshipCharacter), shadowCharacters)); - else - effects.add(new SkirmishResolvedEffect(fpList(fellowshipCharacter), shadowCharacters)); + effects.add(new ResolveSkirmishEffect(_skirmish)); effects.add(new TriggeringResultEffect(new SkirmishAboutToEndResult(), "Skirmish about to end")); effects.add(new UnrespondableEffect() { @Override public void doPlayEffect(LotroGame game) { - gameState.finishSkirmish(); + game.getGameState().finishSkirmish(); } }); return effects.iterator(); } - - private List fpList(PhysicalCard card) { - if (card != null) - return Collections.singletonList(card); - else - return Collections.emptyList(); - } }