From 6a1622c84cb95ae7b7fd51020e9d3978c887b334 Mon Sep 17 00:00:00 2001 From: "marcins78@gmail.com" Date: Tue, 20 Sep 2011 19:58:39 +0000 Subject: [PATCH] Change how effects work. --- .../cards/effects/ExertCharacterEffect.java | 68 ++++++++++----- .../cards/effects/ExhaustCharacterEffect.java | 6 +- .../cards/effects/PreventExertEffect.java | 21 +++++ .../cards/effects/PutOnTheOneRingEffect.java | 4 +- .../cards/effects/RemoveBurdenEffect.java | 4 +- .../lotro/cards/set1/gandalf/Card1_085.java | 18 ++-- .../lotro/cards/set1/gondor/Card1_093.java | 8 +- .../lotro/cards/set1/gondor/Card1_100.java | 8 +- .../lotro/cards/set1/moria/Card1_182.java | 24 +++--- .../lotro/cards/set1/moria/Card1_189.java | 2 +- .../lotro/cards/set1/sauron/Card1_265.java | 2 +- .../lotro/cards/set1/sauron/Card1_273.java | 2 +- .../lotro/cards/set1/shire/Card1_310.java | 4 +- .../lotro/cards/set1/shire/Card1_311.java | 5 +- .../lotro/game/AbstractActionProxy.java | 2 +- .../com/gempukku/lotro/game/ActionProxy.java | 2 +- .../lotro/game/ActionsEnvironment.java | 6 +- .../actions/DefaultActionsEnvironment.java | 63 ++++++++------ .../lotro/logic/actions/KillAction.java | 14 ---- .../lotro/logic/effects/AssignmentEffect.java | 4 +- .../effects/DiscardAttachedCardsEffect.java | 4 +- .../effects/DiscardCardFromPlayEffect.java | 4 +- .../effects/DiscardCardsFromPlayEffect.java | 4 +- .../logic/effects/HealCharacterEffect.java | 4 +- .../lotro/logic/effects/KillEffect.java | 84 ++++++++++++++----- .../logic/effects/OverwhelmedEffect.java | 4 +- .../lotro/logic/effects/PlayCardEffect.java | 4 +- .../logic/effects/SkirmishResolvedEffect.java | 4 +- .../lotro/logic/effects/TriggeringEffect.java | 4 +- .../logic/effects/WoundCharacterEffect.java | 4 +- .../gempukku/lotro/logic/timing/Effect.java | 2 +- .../lotro/logic/timing/TurnProcedure.java | 26 +++--- .../logic/timing/UnrespondableEffect.java | 2 +- .../logic/timing/results/ExertResult.java | 14 ++-- .../logic/timing/results/KillResult.java | 14 ++-- .../timing/rules/CharacterDeathRule.java | 25 +++--- .../timing/rules/ResolveSkirmishRule.java | 15 ++-- 37 files changed, 298 insertions(+), 187 deletions(-) create mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/PreventExertEffect.java delete mode 100644 gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/actions/KillAction.java diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/ExertCharacterEffect.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/ExertCharacterEffect.java index 6c715468c..f717a33e2 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/ExertCharacterEffect.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/ExertCharacterEffect.java @@ -1,20 +1,40 @@ package com.gempukku.lotro.cards.effects; -import com.gempukku.lotro.cards.PlayConditions; +import com.gempukku.lotro.filters.Filter; +import com.gempukku.lotro.filters.Filters; import com.gempukku.lotro.game.PhysicalCard; import com.gempukku.lotro.game.state.LotroGame; import com.gempukku.lotro.logic.timing.AbstractEffect; import com.gempukku.lotro.logic.timing.EffectResult; import com.gempukku.lotro.logic.timing.results.ExertResult; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Set; + public class ExertCharacterEffect extends AbstractEffect { private String _playerId; - private PhysicalCard _physicalCard; - private boolean _prevented; + private final Filter _filter; + private Set _prevented = new HashSet(); - public ExertCharacterEffect(String playerId, PhysicalCard physicalCard) { + public ExertCharacterEffect(String playerId, PhysicalCard card) { _playerId = playerId; - _physicalCard = physicalCard; + _filter = Filters.sameCard(card); + } + + public ExertCharacterEffect(String playerId, Filter card) { + _playerId = playerId; + _filter = card; + } + + public List getCardsToBeExerted(LotroGame game) { + List cardsToExert = new LinkedList(); + for (PhysicalCard physicalCard : Filters.filterActive(game.getGameState(), game.getModifiersQuerying(), _filter)) { + cardsToExert.add(physicalCard); + } + cardsToExert.removeAll(_prevented); + return cardsToExert; } @Override @@ -22,31 +42,41 @@ public class ExertCharacterEffect extends AbstractEffect { return EffectResult.Type.EXERT; } - public PhysicalCard getExertedCard() { - return _physicalCard; - } - @Override public String getText(LotroGame game) { - return "Exert " + _physicalCard.getBlueprint().getName(); + List cards = getCardsToBeExerted(game); + return "Exert - " + getAppendedNames(cards); + } + + private String getAppendedNames(List cards) { + StringBuilder sb = new StringBuilder(); + for (PhysicalCard card : cards) + sb.append(card.getBlueprint().getName() + ", "); + + if (sb.length() == 0) + return "none"; + else + return sb.substring(0, sb.length() - 1); } @Override public boolean canPlayEffect(LotroGame game) { - return PlayConditions.canExert(game.getGameState(), game.getModifiersQuerying(), _physicalCard); + return getCardsToBeExerted(game).size() > 0; } @Override - public EffectResult playEffect(LotroGame game) { - if (!_prevented) { - game.getGameState().sendMessage(_playerId + " exerts " + _physicalCard.getBlueprint().getName()); - game.getGameState().addWound(_physicalCard); - return new ExertResult(_physicalCard); + public EffectResult[] playEffect(LotroGame game) { + List woundedCards = getCardsToBeExerted(game); + + for (PhysicalCard woundedCard : woundedCards) { + game.getGameState().sendMessage(_playerId + " exerts " + woundedCard.getBlueprint().getName()); + game.getGameState().addWound(woundedCard); } - return null; + + return new EffectResult[]{new ExertResult(woundedCards)}; } - public void prevent() { - _prevented = true; + public void prevent(PhysicalCard card) { + _prevented.add(card); } } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/ExhaustCharacterEffect.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/ExhaustCharacterEffect.java index dd8cb62f1..cf8f3fb61 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/ExhaustCharacterEffect.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/ExhaustCharacterEffect.java @@ -8,6 +8,8 @@ import com.gempukku.lotro.logic.timing.AbstractEffect; import com.gempukku.lotro.logic.timing.EffectResult; import com.gempukku.lotro.logic.timing.results.ExertResult; +import java.util.Collections; + public class ExhaustCharacterEffect extends AbstractEffect { private String _playerId; private CostToEffectAction _action; @@ -43,7 +45,7 @@ public class ExhaustCharacterEffect extends AbstractEffect { } @Override - public EffectResult playEffect(LotroGame game) { + public EffectResult[] playEffect(LotroGame game) { if (_sendMessage) game.getGameState().sendMessage(_playerId + " exhausts " + _physicalCard.getBlueprint().getName()); game.getGameState().addWound(_physicalCard); @@ -51,6 +53,6 @@ public class ExhaustCharacterEffect extends AbstractEffect { _action.addCost(new ExhaustCharacterEffect(_playerId, _action, _cost, _physicalCard, false)); else _action.addEffect(new ExhaustCharacterEffect(_playerId, _action, _cost, _physicalCard, false)); - return new ExertResult(_physicalCard); + return new EffectResult[]{new ExertResult(Collections.singletonList(_physicalCard))}; } } \ No newline at end of file diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/PreventExertEffect.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/PreventExertEffect.java new file mode 100644 index 000000000..c1942b53a --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/PreventExertEffect.java @@ -0,0 +1,21 @@ +package com.gempukku.lotro.cards.effects; + +import com.gempukku.lotro.game.PhysicalCard; +import com.gempukku.lotro.game.state.LotroGame; +import com.gempukku.lotro.logic.timing.UnrespondableEffect; + +public class PreventExertEffect extends UnrespondableEffect { + private ExertCharacterEffect _effect; + private PhysicalCard _card; + + public PreventExertEffect(ExertCharacterEffect effect, PhysicalCard card) { + _effect = effect; + _card = card; + } + + @Override + protected void doPlayEffect(LotroGame game) { + _effect.prevent(_card); + } +} + diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/PutOnTheOneRingEffect.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/PutOnTheOneRingEffect.java index c7e07645a..5ea32460b 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/PutOnTheOneRingEffect.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/PutOnTheOneRingEffect.java @@ -23,9 +23,9 @@ public class PutOnTheOneRingEffect extends AbstractEffect { } @Override - public EffectResult playEffect(LotroGame game) { + public EffectResult[] playEffect(LotroGame game) { game.getGameState().sendMessage("Ring-bearer puts on The One Ring"); game.getGameState().setWearingRing(true); - return new PutOnTheOneRingResult(); + return new EffectResult[]{new PutOnTheOneRingResult()}; } } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/RemoveBurdenEffect.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/RemoveBurdenEffect.java index b611dfa97..c4f2a9382 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/RemoveBurdenEffect.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/RemoveBurdenEffect.java @@ -28,9 +28,9 @@ public class RemoveBurdenEffect extends AbstractEffect { } @Override - public EffectResult playEffect(LotroGame game) { + public EffectResult[] playEffect(LotroGame game) { game.getGameState().sendMessage(_playerId + " removes a burden"); game.getGameState().removeBurdens(1); - return new RemoveBurdenResult(); + return new EffectResult[]{new RemoveBurdenResult()}; } } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/gandalf/Card1_085.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/gandalf/Card1_085.java index 80ac89f66..c835492e0 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/gandalf/Card1_085.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/gandalf/Card1_085.java @@ -3,6 +3,7 @@ package com.gempukku.lotro.cards.set1.gandalf; import com.gempukku.lotro.cards.AbstractResponseEvent; import com.gempukku.lotro.cards.actions.PlayEventAction; import com.gempukku.lotro.cards.effects.ExertCharacterEffect; +import com.gempukku.lotro.cards.effects.PreventExertEffect; import com.gempukku.lotro.common.CardType; import com.gempukku.lotro.common.Culture; import com.gempukku.lotro.common.Keyword; @@ -10,9 +11,9 @@ 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.effects.ChooseActiveCardEffect; import com.gempukku.lotro.logic.timing.Effect; import com.gempukku.lotro.logic.timing.EffectResult; -import com.gempukku.lotro.logic.timing.UnrespondableEffect; import java.util.Collections; import java.util.List; @@ -37,16 +38,19 @@ public class Card1_085 extends AbstractResponseEvent { } @Override - public List getOptionalBeforeActions(String playerId, LotroGame game, final Effect effect, PhysicalCard self) { + public List getOptionalBeforeActions(final String playerId, LotroGame game, final Effect effect, PhysicalCard self) { if (effect.getType() == EffectResult.Type.EXERT && Filters.canSpot(game.getGameState(), game.getModifiersQuerying(), Filters.name("Gandalf"))) { - if (((ExertCharacterEffect) effect).getExertedCard().getBlueprint().getCardType() == CardType.COMPANION) { - PlayEventAction action = new PlayEventAction(self); + final ExertCharacterEffect exertEffect = (ExertCharacterEffect) effect; + List exertedCharacters = exertEffect.getCardsToBeExerted(game); + if (Filters.filter(exertedCharacters, game.getGameState(), game.getModifiersQuerying(), Filters.type(CardType.COMPANION)).size() > 0) { + final PlayEventAction action = new PlayEventAction(self); action.addEffect( - new UnrespondableEffect() { + new ChooseActiveCardEffect(playerId, "Choose character", Filters.type(CardType.COMPANION), Filters.in(exertedCharacters)) { @Override - public void doPlayEffect(LotroGame game) { - ((ExertCharacterEffect) effect).prevent(); + protected void cardSelected(PhysicalCard card) { + action.addEffect( + new PreventExertEffect(exertEffect, card)); } }); return Collections.singletonList(action); diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/gondor/Card1_093.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/gondor/Card1_093.java index c743b8974..72fa62c23 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/gondor/Card1_093.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/gondor/Card1_093.java @@ -50,8 +50,8 @@ public class Card1_093 extends AbstractEvent { action.addCost( new ExertCharacterEffect(playerId, arwen) { @Override - public EffectResult playEffect(LotroGame game) { - EffectResult effectResult = super.playEffect(game); + public EffectResult[] playEffect(LotroGame game) { + EffectResult[] effectResult = super.playEffect(game); action.addEffect( new AddUntilEndOfPhaseModifierEffect( new StrengthModifier(self, Filters.name("Aragorn"), 3), Phase.SKIRMISH)); @@ -63,8 +63,8 @@ public class Card1_093 extends AbstractEvent { action.addCost( new ExertCharacterEffect(playerId, aragorn) { @Override - public EffectResult playEffect(LotroGame game) { - EffectResult effectResult = super.playEffect(game); + public EffectResult[] playEffect(LotroGame game) { + EffectResult[] effectResult = super.playEffect(game); action.addEffect( new AddUntilEndOfPhaseModifierEffect( new StrengthModifier(self, Filters.name("Arwen"), 3), Phase.SKIRMISH)); diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/gondor/Card1_100.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/gondor/Card1_100.java index 9271f93d4..b8366500d 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/gondor/Card1_100.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/gondor/Card1_100.java @@ -47,8 +47,8 @@ public class Card1_100 extends AbstractPermanent { action.addCost( new ExertCharacterEffect(playerId, arwen) { @Override - public EffectResult playEffect(LotroGame game) { - EffectResult effectResult = super.playEffect(game); + public EffectResult[] playEffect(LotroGame game) { + EffectResult[] effectResult = super.playEffect(game); if (aragorn != null) action.addEffect(new HealCharacterEffect(playerId, aragorn)); return effectResult; @@ -59,8 +59,8 @@ public class Card1_100 extends AbstractPermanent { action.addCost( new ExertCharacterEffect(playerId, aragorn) { @Override - public EffectResult playEffect(LotroGame game) { - EffectResult effectResult = super.playEffect(game); + public EffectResult[] playEffect(LotroGame game) { + EffectResult[] effectResult = super.playEffect(game); if (arwen != null) action.addEffect(new HealCharacterEffect(playerId, arwen)); return effectResult; diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/moria/Card1_182.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/moria/Card1_182.java index fd5d3e6be..a2896770a 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/moria/Card1_182.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/moria/Card1_182.java @@ -14,7 +14,7 @@ import com.gempukku.lotro.logic.modifiers.Modifier; import com.gempukku.lotro.logic.timing.EffectResult; import com.gempukku.lotro.logic.timing.results.KillResult; -import java.util.Collections; +import java.util.LinkedList; import java.util.List; /** @@ -46,16 +46,20 @@ public class Card1_182 extends AbstractAttachable { public List getRequiredAfterTriggers(LotroGame game, EffectResult effectResult, PhysicalCard self) { if (effectResult.getType() == EffectResult.Type.KILL) { KillResult killResult = (KillResult) effectResult; - PhysicalCard killedCard = killResult.getKilledCard(); - Skirmish skirmish = game.getGameState().getSkirmish(); - if (killedCard.getBlueprint().getCardType() == CardType.COMPANION && skirmish != null - && skirmish.getFellowshipCharacter() == killedCard && skirmish.getShadowCharacters().contains(self.getAttachedTo())) { - int burdens = (killedCard.getBlueprint().getRace() == Race.HOBBIT) ? 2 : 1; - RequiredTriggerAction action = new RequiredTriggerAction(self, null, "Add " + burdens + " burden(s)"); - for (int i = 0; i < burdens; i++) - action.addEffect(new AddBurdenEffect(self.getOwner())); - return Collections.singletonList(action); + List killedCards = killResult.getKilledCards(); + List actions = new LinkedList(); + for (PhysicalCard killedCard : killedCards) { + Skirmish skirmish = game.getGameState().getSkirmish(); + if (killedCard.getBlueprint().getCardType() == CardType.COMPANION + && skirmish != null && skirmish.getShadowCharacters().contains(self.getAttachedTo())) { + int burdens = (killedCard.getBlueprint().getRace() == Race.HOBBIT) ? 2 : 1; + RequiredTriggerAction action = new RequiredTriggerAction(self, null, "Add " + burdens + " burden(s)"); + for (int i = 0; i < burdens; i++) + action.addEffect(new AddBurdenEffect(self.getOwner())); + actions.add(action); + } } + return actions; } return null; } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/moria/Card1_189.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/moria/Card1_189.java index a655d83a0..55f8aaff1 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/moria/Card1_189.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/moria/Card1_189.java @@ -45,7 +45,7 @@ public class Card1_189 extends AbstractResponseEvent { public List getOptionalAfterActions(final String playerId, final LotroGame game, EffectResult effectResult, PhysicalCard self) { if ((( effectResult.getType() == EffectResult.Type.EXERT - && game.getModifiersQuerying().hasKeyword(game.getGameState(), ((ExertResult) effectResult).getExertedCard(), Keyword.RING_BEARER)) + && Filters.filter(((ExertResult) effectResult).getExertedCards(), game.getGameState(), game.getModifiersQuerying(), Filters.keyword(Keyword.RING_BEARER)).size() > 0) || ( effectResult.getType() == EffectResult.Type.WOUND && Filters.filter(((WoundResult) effectResult).getWoundedCards(), game.getGameState(), game.getModifiersQuerying(), Filters.keyword(Keyword.RING_BEARER)).size() > 0)) diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/sauron/Card1_265.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/sauron/Card1_265.java index d05d62bf5..d6a52bdd9 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/sauron/Card1_265.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/sauron/Card1_265.java @@ -40,7 +40,7 @@ public class Card1_265 extends AbstractResponseEvent { && PlayConditions.canPayForShadowCard(game, self, 0)) { Skirmish skirmish = game.getGameState().getSkirmish(); if (effectResult.getType() == EffectResult.Type.KILL - && ((KillResult) effectResult).getKilledCard().getBlueprint().getCardType() == CardType.COMPANION + && Filters.filter(((KillResult) effectResult).getKilledCards(), game.getGameState(), game.getModifiersQuerying(), Filters.type(CardType.COMPANION)).size() > 0 && skirmish != null && Filters.filter(skirmish.getShadowCharacters(), game.getGameState(), game.getModifiersQuerying(), Filters.culture(Culture.SAURON), Filters.race(Race.ORC)).size() > 0) { PlayEventAction action = new PlayEventAction(self); diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/sauron/Card1_273.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/sauron/Card1_273.java index e0f2a664c..e433e9b48 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/sauron/Card1_273.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/sauron/Card1_273.java @@ -39,7 +39,7 @@ public class Card1_273 extends AbstractResponseEvent { && PlayConditions.canPayForShadowCard(game, self, 0)) { Skirmish skirmish = game.getGameState().getSkirmish(); if (effectResult.getType() == EffectResult.Type.KILL - && ((KillResult) effectResult).getKilledCard().getBlueprint().getCardType() == CardType.COMPANION + && Filters.filter(((KillResult) effectResult).getKilledCards(), game.getGameState(), game.getModifiersQuerying(), Filters.type(CardType.COMPANION)).size() > 0 && skirmish != null && Filters.filter(skirmish.getShadowCharacters(), game.getGameState(), game.getModifiersQuerying(), Filters.culture(Culture.SAURON), Filters.race(Race.ORC)).size() > 0) { PlayEventAction action = new PlayEventAction(self); diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/shire/Card1_310.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/shire/Card1_310.java index 2a8cc8bcb..6276305e0 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/shire/Card1_310.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/shire/Card1_310.java @@ -53,9 +53,9 @@ public class Card1_310 extends AbstractCompanion { } @Override - public List getOptionalBeforeTriggers(String playerId, LotroGame lotroGame, Effect effect, PhysicalCard self) { + public List getOptionalBeforeTriggers(String playerId, LotroGame game, Effect effect, PhysicalCard self) { if (effect.getType() == EffectResult.Type.KILL) { - if (((KillEffect) effect).getKilledCard().getBlueprint().getName().equals("Frodo")) { + if (Filters.filter(((KillEffect) effect).getCharactersToBeKilled(), game.getGameState(), game.getModifiersQuerying(), Filters.name("Frodo")).size() > 0) { OptionalTriggerAction action = new OptionalTriggerAction(self, Keyword.RESPONSE, "Make Sam the Ring-Bearer"); action.addEffect(new MakeRingBearerEffect(self)); return Collections.singletonList(action); diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/shire/Card1_311.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/shire/Card1_311.java index fa7f5170e..11b3b3e0e 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/shire/Card1_311.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/shire/Card1_311.java @@ -6,6 +6,7 @@ import com.gempukku.lotro.cards.effects.ExertCharacterEffect; import com.gempukku.lotro.cards.effects.MakeRingBearerEffect; import com.gempukku.lotro.cards.effects.RemoveBurdenEffect; 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.DefaultCostToEffectAction; @@ -48,9 +49,9 @@ public class Card1_311 extends AbstractCompanion { } @Override - public List getOptionalBeforeTriggers(String playerId, LotroGame lotroGame, Effect effect, PhysicalCard self) { + public List getOptionalBeforeTriggers(String playerId, LotroGame game, Effect effect, PhysicalCard self) { if (effect.getType() == EffectResult.Type.KILL) { - if (((KillEffect) effect).getKilledCard().getBlueprint().getName().equals("Frodo")) { + if (Filters.filter(((KillEffect) effect).getCharactersToBeKilled(), game.getGameState(), game.getModifiersQuerying(), Filters.name("Frodo")).size() > 0) { OptionalTriggerAction action = new OptionalTriggerAction(self, Keyword.RESPONSE, "Make Sam the Ring-Bearer"); action.addEffect(new MakeRingBearerEffect(self)); return Collections.singletonList(action); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/AbstractActionProxy.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/AbstractActionProxy.java index fa036fcba..b7aafae81 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/AbstractActionProxy.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/AbstractActionProxy.java @@ -14,7 +14,7 @@ public abstract class AbstractActionProxy implements ActionProxy { } @Override - public List getRequiredAfterTriggers(LotroGame lotroGame, EffectResult effectResult) { + public List getRequiredAfterTriggers(LotroGame lotroGame, EffectResult effectResults) { return null; } } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/ActionProxy.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/ActionProxy.java index 0614d0886..f43035a97 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/ActionProxy.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/ActionProxy.java @@ -10,5 +10,5 @@ import java.util.List; public interface ActionProxy { public List getRequiredBeforeTriggers(LotroGame lotroGame, Effect effect); - public List getRequiredAfterTriggers(LotroGame lotroGame, EffectResult effectResult); + public List getRequiredAfterTriggers(LotroGame lotroGame, EffectResult effectResults); } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/ActionsEnvironment.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/ActionsEnvironment.java index 69bc658bf..38529dc45 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/ActionsEnvironment.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/ActionsEnvironment.java @@ -14,11 +14,11 @@ public interface ActionsEnvironment { public List getOptionalBeforeActions(String playerId, Effect effect); - public List getRequiredAfterTriggers(EffectResult effectResult); + public List getRequiredAfterTriggers(EffectResult[] effectResults); - public List getOptionalAfterTriggers(String playerId, EffectResult effectResult); + public List getOptionalAfterTriggers(String playerId, EffectResult[] effectResults); - public List getOptionalAfterActions(String playerId, EffectResult effectResult); + public List getOptionalAfterActions(String playerId, EffectResult[] effectResults); public void addUntilStartOfPhaseActionProxy(ActionProxy actionProxy, Phase phase); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/actions/DefaultActionsEnvironment.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/actions/DefaultActionsEnvironment.java index 34d667e6d..fcc7d73ed 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/actions/DefaultActionsEnvironment.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/actions/DefaultActionsEnvironment.java @@ -106,25 +106,27 @@ public class DefaultActionsEnvironment implements ActionsEnvironment { } @Override - public List getRequiredAfterTriggers(EffectResult effectResult) { - GatherRequiredAfterTriggers gatherActions = new GatherRequiredAfterTriggers(effectResult); + public List getRequiredAfterTriggers(EffectResult[] effectResults) { + GatherRequiredAfterTriggers gatherActions = new GatherRequiredAfterTriggers(effectResults); _lotroGame.getGameState().iterateActiveCards(gatherActions); List gatheredActions = gatherActions.getActions(); for (ActionProxy actionProxy : _actionProxies) { - List actions = actionProxy.getRequiredAfterTriggers(_lotroGame, effectResult); - if (actions != null) - gatheredActions.addAll(actions); + for (EffectResult effectResult : effectResults) { + List actions = actionProxy.getRequiredAfterTriggers(_lotroGame, effectResult); + if (actions != null) + gatheredActions.addAll(actions); + } } return gatheredActions; } @Override - public List getOptionalAfterTriggers(String playerId, EffectResult effectResult) { - GatherOptionalAfterTriggers gatherActions = new GatherOptionalAfterTriggers(playerId, effectResult); + public List getOptionalAfterTriggers(String playerId, EffectResult[] effectResults) { + GatherOptionalAfterTriggers gatherActions = new GatherOptionalAfterTriggers(playerId, effectResults); _lotroGame.getGameState().iterateActiveCards(playerId, gatherActions); @@ -132,8 +134,8 @@ public class DefaultActionsEnvironment implements ActionsEnvironment { } @Override - public List getOptionalAfterActions(String playerId, EffectResult effectResult) { - GatherOptionalAfterActions gatherAfterActions = new GatherOptionalAfterActions(playerId, effectResult); + public List getOptionalAfterActions(String playerId, EffectResult[] effectResults) { + GatherOptionalAfterActions gatherAfterActions = new GatherOptionalAfterActions(playerId, effectResults); _lotroGame.getGameState().iterateActivableCards(playerId, gatherAfterActions); @@ -146,18 +148,20 @@ public class DefaultActionsEnvironment implements ActionsEnvironment { } private class GatherRequiredAfterTriggers extends CompletePhysicalCardVisitor { - private EffectResult _effectResult; + private EffectResult[] _effectResults; private List _actions = new LinkedList(); - private GatherRequiredAfterTriggers(EffectResult effectResult) { - _effectResult = effectResult; + private GatherRequiredAfterTriggers(EffectResult[] effectResults) { + _effectResults = effectResults; } @Override protected void doVisitPhysicalCard(PhysicalCard physicalCard) { - List actions = physicalCard.getBlueprint().getRequiredAfterTriggers(_lotroGame, _effectResult, physicalCard); - if (actions != null) - _actions.addAll(actions); + for (EffectResult effectResult : _effectResults) { + List actions = physicalCard.getBlueprint().getRequiredAfterTriggers(_lotroGame, effectResult, physicalCard); + if (actions != null) + _actions.addAll(actions); + } } public List getActions() { @@ -209,19 +213,22 @@ public class DefaultActionsEnvironment implements ActionsEnvironment { private class GatherOptionalAfterTriggers extends CompletePhysicalCardVisitor { private String _playerId; - private EffectResult _effectResult; + private EffectResult[] _effectResults; private List _actions = new LinkedList(); - private GatherOptionalAfterTriggers(String playerId, EffectResult effectResult) { + private GatherOptionalAfterTriggers(String playerId, EffectResult[] effectResults) { _playerId = playerId; - _effectResult = effectResult; + _effectResults = effectResults; } @Override protected void doVisitPhysicalCard(PhysicalCard physicalCard) { - List actions = physicalCard.getBlueprint().getOptionalAfterTriggers(_playerId, _lotroGame, _effectResult, physicalCard); - if (actions != null) - _actions.addAll(actions); + for (EffectResult effectResult : _effectResults) { + List actions = physicalCard.getBlueprint().getOptionalAfterTriggers(_playerId, _lotroGame, effectResult, physicalCard); + if (actions != null) + _actions.addAll(actions); + + } } public List getActions() { @@ -253,19 +260,21 @@ public class DefaultActionsEnvironment implements ActionsEnvironment { private class GatherOptionalAfterActions extends CompletePhysicalCardVisitor { private String _playerId; - private EffectResult _effectResult; + private EffectResult[] _effectResults; private List _actions = new LinkedList(); - private GatherOptionalAfterActions(String playerId, EffectResult effectResult) { + private GatherOptionalAfterActions(String playerId, EffectResult[] effectResults) { _playerId = playerId; - _effectResult = effectResult; + _effectResults = effectResults; } @Override protected void doVisitPhysicalCard(PhysicalCard physicalCard) { - List actions = physicalCard.getBlueprint().getOptionalAfterActions(_playerId, _lotroGame, _effectResult, physicalCard); - if (actions != null) - _actions.addAll(actions); + for (EffectResult effectResult : _effectResults) { + List actions = physicalCard.getBlueprint().getOptionalAfterActions(_playerId, _lotroGame, effectResult, physicalCard); + if (actions != null) + _actions.addAll(actions); + } } public List getActions() { diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/actions/KillAction.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/actions/KillAction.java deleted file mode 100644 index 5f48fc115..000000000 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/actions/KillAction.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.gempukku.lotro.logic.actions; - -import com.gempukku.lotro.game.PhysicalCard; -import com.gempukku.lotro.logic.effects.DiscardAttachedCardsEffect; -import com.gempukku.lotro.logic.effects.KillEffect; - -public class KillAction extends DefaultCostToEffectAction { - public KillAction(PhysicalCard card) { - super(null, null, "Kill the character"); - - addEffect(new KillEffect(card)); - addEffect(new DiscardAttachedCardsEffect(card)); - } -} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/AssignmentEffect.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/AssignmentEffect.java index 6f049bdfa..6ff1df99c 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/AssignmentEffect.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/AssignmentEffect.java @@ -49,13 +49,13 @@ public class AssignmentEffect extends AbstractEffect { } @Override - public EffectResult playEffect(LotroGame game) { + public EffectResult[] playEffect(LotroGame game) { game.getGameState().sendMessage(_playerId + " assigns minion(s) to skirmish"); for (Map.Entry> physicalCardListEntry : _assignments.entrySet()) { PhysicalCard fpChar = physicalCardListEntry.getKey(); List minions = physicalCardListEntry.getValue(); game.getGameState().assignToSkirmishes(fpChar, minions); } - return new AssignmentResult(_assignments); + return new EffectResult[]{new AssignmentResult(_assignments)}; } } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/DiscardAttachedCardsEffect.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/DiscardAttachedCardsEffect.java index d96b1e033..4528f363f 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/DiscardAttachedCardsEffect.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/DiscardAttachedCardsEffect.java @@ -34,7 +34,7 @@ public class DiscardAttachedCardsEffect extends AbstractEffect { } @Override - public EffectResult playEffect(LotroGame game) { + public EffectResult[] playEffect(LotroGame game) { List discardedCards = new LinkedList(); GameState gameState = game.getGameState(); List attachedCards = gameState.getAttachedCards(_card); @@ -45,6 +45,6 @@ public class DiscardAttachedCardsEffect extends AbstractEffect { discardedCards.add(attachedCard); } - return new DiscardCardsFromPlayResult(discardedCards); + return new EffectResult[]{new DiscardCardsFromPlayResult(discardedCards)}; } } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/DiscardCardFromPlayEffect.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/DiscardCardFromPlayEffect.java index d6cbed04b..b4dab9665 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/DiscardCardFromPlayEffect.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/DiscardCardFromPlayEffect.java @@ -39,7 +39,7 @@ public class DiscardCardFromPlayEffect extends AbstractEffect { } @Override - public EffectResult playEffect(LotroGame game) { + public EffectResult[] playEffect(LotroGame game) { _discardedCards = new LinkedList(); if (_source == null || game.getModifiersQuerying().canBeDiscardedFromPlay(game.getGameState(), _card, _source)) { @@ -67,6 +67,6 @@ public class DiscardCardFromPlayEffect extends AbstractEffect { gameState.addCardToZone(stackedCard, Zone.DISCARD); } } - return new DiscardCardsFromPlayResult(_discardedCards); + return new EffectResult[]{new DiscardCardsFromPlayResult(_discardedCards)}; } } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/DiscardCardsFromPlayEffect.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/DiscardCardsFromPlayEffect.java index 039122aa1..ed9ec45fc 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/DiscardCardsFromPlayEffect.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/DiscardCardsFromPlayEffect.java @@ -59,7 +59,7 @@ public class DiscardCardsFromPlayEffect extends AbstractEffect { } @Override - public EffectResult playEffect(LotroGame game) { + public EffectResult[] playEffect(LotroGame game) { List cardsToDiscard = getCardsToBeDiscarded(game); List discardedCards = new LinkedList(); for (PhysicalCard card : cardsToDiscard) { @@ -88,6 +88,6 @@ public class DiscardCardsFromPlayEffect extends AbstractEffect { if (_source != null && discardedCards.size() > 0) game.getGameState().sendMessage(_source.getOwner() + " discards multiple cards from play using " + _source.getBlueprint().getName()); - return new DiscardCardsFromPlayResult(discardedCards); + return new EffectResult[]{new DiscardCardsFromPlayResult(discardedCards)}; } } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/HealCharacterEffect.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/HealCharacterEffect.java index b53918d5d..af470b7b2 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/HealCharacterEffect.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/HealCharacterEffect.java @@ -71,7 +71,7 @@ public class HealCharacterEffect extends AbstractEffect { } @Override - public EffectResult playEffect(LotroGame game) { + public EffectResult[] playEffect(LotroGame game) { List cardsToHeal = getCardsToBeHealed(game); for (PhysicalCard cardToHeal : cardsToHeal) { @@ -79,6 +79,6 @@ public class HealCharacterEffect extends AbstractEffect { game.getGameState().removeWound(cardToHeal); } - return new HealResult(cardsToHeal); + return new EffectResult[]{new HealResult(cardsToHeal)}; } } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/KillEffect.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/KillEffect.java index b8c813c42..5a1cff1c8 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/KillEffect.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/KillEffect.java @@ -7,13 +7,17 @@ import com.gempukku.lotro.game.state.GameState; import com.gempukku.lotro.game.state.LotroGame; import com.gempukku.lotro.logic.timing.AbstractEffect; import com.gempukku.lotro.logic.timing.EffectResult; +import com.gempukku.lotro.logic.timing.results.DiscardCardsFromPlayResult; import com.gempukku.lotro.logic.timing.results.KillResult; -public class KillEffect extends AbstractEffect { - private PhysicalCard _card; +import java.util.LinkedList; +import java.util.List; - public KillEffect(PhysicalCard card) { - _card = card; +public class KillEffect extends AbstractEffect { + private List _cards; + + public KillEffect(List cards) { + _cards = cards; } @Override @@ -21,32 +25,74 @@ public class KillEffect extends AbstractEffect { return EffectResult.Type.KILL; } - public PhysicalCard getKilledCard() { - return _card; + public List getCharactersToBeKilled() { + return _cards; } @Override public String getText(LotroGame game) { - return "Kill " + _card.getBlueprint().getName(); + List cards = getCharactersToBeKilled(); + return "Kill - " + getAppendedNames(cards); + } + + private String getAppendedNames(List cards) { + StringBuilder sb = new StringBuilder(); + for (PhysicalCard card : cards) + sb.append(card.getBlueprint().getName() + ", "); + + if (sb.length() == 0) + return "none"; + else + return sb.substring(0, sb.length() - 1); } @Override public boolean canPlayEffect(LotroGame game) { - Zone zone = _card.getZone(); - return zone == Zone.FREE_CHARACTERS || zone == Zone.FREE_SUPPORT || zone == Zone.SHADOW_CHARACTERS; + return true; } @Override - public EffectResult playEffect(LotroGame game) { - GameState gameState = game.getGameState(); - gameState.sendMessage(_card.getBlueprint().getName() + " gets killed"); - gameState.stopAffecting(_card); - gameState.removeCardFromZone(_card); - if (_card.getBlueprint().getSide() == Side.FREE_PEOPLE) - gameState.addCardToZone(_card, Zone.DEAD); - else - gameState.addCardToZone(_card, Zone.DISCARD); + public EffectResult[] playEffect(LotroGame game) { + List discardedCards = new LinkedList(); + List killedCards = new LinkedList(); - return new KillResult(_card); + for (PhysicalCard card : _cards) { + GameState gameState = game.getGameState(); + gameState.sendMessage(card.getBlueprint().getName() + " gets killed"); + gameState.stopAffecting(card); + gameState.removeCardFromZone(card); + if (card.getBlueprint().getSide() == Side.FREE_PEOPLE) { + killedCards.add(card); + gameState.addCardToZone(card, Zone.DEAD); + } else { + discardedCards.add(card); + gameState.addCardToZone(card, Zone.DISCARD); + } + + List attachedCards = gameState.getAttachedCards(card); + for (PhysicalCard attachedCard : attachedCards) { + discardedCards.add(attachedCard); + + gameState.stopAffecting(attachedCard); + gameState.removeCardFromZone(attachedCard); + gameState.addCardToZone(attachedCard, Zone.DISCARD); + } + + List stackedCards = gameState.getStackedCards(card); + for (PhysicalCard stackedCard : stackedCards) { + gameState.removeCardFromZone(stackedCard); + gameState.addCardToZone(stackedCard, Zone.DISCARD); + } + } + + if (killedCards.size() > 0 && discardedCards.size() > 0) { + return new EffectResult[]{new KillResult(killedCards), new DiscardCardsFromPlayResult(discardedCards)}; + } else if (killedCards.size() > 0) { + return new EffectResult[]{new KillResult(killedCards)}; + } else if (discardedCards.size() > 0) { + return new EffectResult[]{new DiscardCardsFromPlayResult(discardedCards)}; + } else { + return null; + } } } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/OverwhelmedEffect.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/OverwhelmedEffect.java index 86fca6337..7cdca31c2 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/OverwhelmedEffect.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/OverwhelmedEffect.java @@ -33,8 +33,8 @@ public class OverwhelmedEffect extends AbstractEffect { } @Override - public EffectResult playEffect(LotroGame game) { + public EffectResult[] playEffect(LotroGame game) { game.getGameState().sendMessage("Skirmish finishes with an overwhelm"); - return new OverwhelmSkirmishResult(_winners, _losers); + return new EffectResult[]{new OverwhelmSkirmishResult(_winners, _losers)}; } } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/PlayCardEffect.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/PlayCardEffect.java index 6d21bdd79..724a90cb3 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/PlayCardEffect.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/PlayCardEffect.java @@ -43,7 +43,7 @@ public class PlayCardEffect extends AbstractEffect { } @Override - public EffectResult playEffect(LotroGame game) { - return new PlayCardResult(_cardPlayed, _attachedToCard); + public EffectResult[] playEffect(LotroGame game) { + return new EffectResult[]{new PlayCardResult(_cardPlayed, _attachedToCard)}; } } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/SkirmishResolvedEffect.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/SkirmishResolvedEffect.java index 69ed0ec43..497de4d4c 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/SkirmishResolvedEffect.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/SkirmishResolvedEffect.java @@ -33,8 +33,8 @@ public class SkirmishResolvedEffect extends AbstractEffect { } @Override - public EffectResult playEffect(LotroGame game) { + public EffectResult[] playEffect(LotroGame game) { game.getGameState().sendMessage("Skirmish finishes with a normal win"); - return new NormalSkirmishResult(_winners, _losers); + return new EffectResult[]{new NormalSkirmishResult(_winners, _losers)}; } } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/TriggeringEffect.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/TriggeringEffect.java index 18bb8118f..cbb166091 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/TriggeringEffect.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/TriggeringEffect.java @@ -29,7 +29,7 @@ public class TriggeringEffect extends AbstractEffect { } @Override - public EffectResult playEffect(LotroGame game) { - return _effectResult; + public EffectResult[] playEffect(LotroGame game) { + return new EffectResult[]{_effectResult}; } } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/WoundCharacterEffect.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/WoundCharacterEffect.java index 4120e4261..4e9b76724 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/WoundCharacterEffect.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/WoundCharacterEffect.java @@ -66,7 +66,7 @@ public class WoundCharacterEffect extends AbstractEffect { } @Override - public EffectResult playEffect(LotroGame game) { + public EffectResult[] playEffect(LotroGame game) { List woundedCards = getCardsToBeWounded(game); for (PhysicalCard woundedCard : woundedCards) { @@ -74,7 +74,7 @@ public class WoundCharacterEffect extends AbstractEffect { game.getGameState().addWound(woundedCard); } - return new WoundResult(woundedCards); + return new EffectResult[]{new WoundResult(woundedCards)}; } public void prevent(PhysicalCard card) { 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 0688da589..60c25c535 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 @@ -17,5 +17,5 @@ public interface Effect { public boolean canPlayEffect(LotroGame game); - public EffectResult playEffect(LotroGame game); + public EffectResult[] playEffect(LotroGame game); } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/TurnProcedure.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/TurnProcedure.java index 0e67768b0..fea53cfc6 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/TurnProcedure.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/TurnProcedure.java @@ -61,7 +61,7 @@ public class TurnProcedure { private class PlayOutRecognizableEffect extends SystemAction { private Effect _effect; - private EffectResult _effectResult; + private EffectResult[] _effectResults; private boolean _checkedPlayability; private boolean _checkedIsAboutToRequiredResponses; private boolean _checkedIsAboutToOptionalResponses; @@ -109,17 +109,17 @@ public class TurnProcedure { } if (!_effectPlayed) { if (_effect.canPlayEffect(_game)) - _effectResult = _effect.playEffect(_game); + _effectResults = _effect.playEffect(_game); else { _effect.setFailed(); return null; } _effectPlayed = true; } - if (_effectResult != null) { + if (_effectResults != null) { if (!_checkedRequiredWhenResponses) { _checkedRequiredWhenResponses = true; - List requiredResponses = _game.getActionsEnvironment().getRequiredAfterTriggers(_effectResult); + List requiredResponses = _game.getActionsEnvironment().getRequiredAfterTriggers(_effectResults); if (requiredResponses.size() > 0) { DefaultCostToEffectAction action = new DefaultCostToEffectAction(null, null, null); action.addEffect(new PlayoutAllActionsIfEffectNotCancelledEffect(action, _effect, requiredResponses)); @@ -130,7 +130,7 @@ public class TurnProcedure { _checkedOptionalWhenResponses = true; DefaultCostToEffectAction action = new DefaultCostToEffectAction(null, null, null); action.addEffect( - new PlayoutOptionalAfterResponsesEffect(action, new HashSet(), _game.getGameState().getPlayerOrder().getCounterClockwisePlayOrder(_game.getGameState().getCurrentPlayerId(), true), 0, _effect, _effectResult)); + new PlayoutOptionalAfterResponsesEffect(action, new HashSet(), _game.getGameState().getPlayerOrder().getCounterClockwisePlayOrder(_game.getGameState().getCurrentPlayerId(), true), 0, _effect, _effectResults)); return new StackActionEffect(action); } } @@ -204,29 +204,29 @@ public class TurnProcedure { private PlayOrder _playOrder; private int _passCount; private Effect _effect; - private EffectResult _effectResult; + private EffectResult[] _effectResults; - private PlayoutOptionalAfterResponsesEffect(DefaultCostToEffectAction action, Set cardTriggersUsed, PlayOrder playOrder, int passCount, Effect effect, EffectResult effectResult) { + private PlayoutOptionalAfterResponsesEffect(DefaultCostToEffectAction action, Set cardTriggersUsed, PlayOrder playOrder, int passCount, Effect effect, EffectResult[] effectResults) { _action = action; _cardTriggersUsed = cardTriggersUsed; _playOrder = playOrder; _passCount = passCount; _effect = effect; - _effectResult = effectResult; + _effectResults = effectResults; } @Override public void doPlayEffect(LotroGame game) { final String activePlayer = _playOrder.getNextPlayer(); - final List optionalAfterTriggers = game.getActionsEnvironment().getOptionalAfterTriggers(activePlayer, _effectResult); + final List optionalAfterTriggers = game.getActionsEnvironment().getOptionalAfterTriggers(activePlayer, _effectResults); // Remove triggers already resolved final Iterator triggersIterator = optionalAfterTriggers.iterator(); while (triggersIterator.hasNext()) if (_cardTriggersUsed.contains(triggersIterator.next().getActionSource())) triggersIterator.remove(); - final List optionalAfterActions = _game.getActionsEnvironment().getOptionalAfterActions(activePlayer, _effectResult); + final List optionalAfterActions = _game.getActionsEnvironment().getOptionalAfterActions(activePlayer, _effectResults); List possibleActions = new LinkedList(optionalAfterTriggers); possibleActions.addAll(optionalAfterActions); @@ -241,17 +241,17 @@ public class TurnProcedure { _game.getActionsEnvironment().addActionToStack(action); if (optionalAfterTriggers.contains(action)) _cardTriggersUsed.add(action.getActionSource()); - _action.addEffect(new PlayoutOptionalAfterResponsesEffect(_action, _cardTriggersUsed, _playOrder, 0, _effect, _effectResult)); + _action.addEffect(new PlayoutOptionalAfterResponsesEffect(_action, _cardTriggersUsed, _playOrder, 0, _effect, _effectResults)); } else { if ((_passCount + 1) < _playOrder.getPlayerCount()) { - _action.addEffect(new PlayoutOptionalAfterResponsesEffect(_action, _cardTriggersUsed, _playOrder, _passCount + 1, _effect, _effectResult)); + _action.addEffect(new PlayoutOptionalAfterResponsesEffect(_action, _cardTriggersUsed, _playOrder, _passCount + 1, _effect, _effectResults)); } } } }); } else { if ((_passCount + 1) < _playOrder.getPlayerCount()) { - _action.addEffect(new PlayoutOptionalAfterResponsesEffect(_action, _cardTriggersUsed, _playOrder, _passCount + 1, _effect, _effectResult)); + _action.addEffect(new PlayoutOptionalAfterResponsesEffect(_action, _cardTriggersUsed, _playOrder, _passCount + 1, _effect, _effectResults)); } } } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/UnrespondableEffect.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/UnrespondableEffect.java index 50067e9b1..0a95c7c92 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/UnrespondableEffect.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/UnrespondableEffect.java @@ -44,7 +44,7 @@ public abstract class UnrespondableEffect implements Effect { protected abstract void doPlayEffect(LotroGame game); @Override - public final EffectResult playEffect(LotroGame game) { + public final EffectResult[] playEffect(LotroGame game) { doPlayEffect(game); return null; } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/results/ExertResult.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/results/ExertResult.java index 226e731f3..e344bc61c 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/results/ExertResult.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/results/ExertResult.java @@ -3,15 +3,17 @@ package com.gempukku.lotro.logic.timing.results; import com.gempukku.lotro.game.PhysicalCard; import com.gempukku.lotro.logic.timing.EffectResult; -public class ExertResult extends EffectResult { - private PhysicalCard _card; +import java.util.List; - public ExertResult(PhysicalCard card) { +public class ExertResult extends EffectResult { + private List _cards; + + public ExertResult(List cards) { super(Type.EXERT); - _card = card; + _cards = cards; } - public PhysicalCard getExertedCard() { - return _card; + public List getExertedCards() { + return _cards; } } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/results/KillResult.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/results/KillResult.java index face98ede..0787b3ee1 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/results/KillResult.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/results/KillResult.java @@ -3,15 +3,17 @@ package com.gempukku.lotro.logic.timing.results; import com.gempukku.lotro.game.PhysicalCard; import com.gempukku.lotro.logic.timing.EffectResult; -public class KillResult extends EffectResult { - private PhysicalCard _killedCard; +import java.util.List; - public KillResult(PhysicalCard killedCard) { +public class KillResult extends EffectResult { + private List _killedCards; + + public KillResult(List killedCards) { super(EffectResult.Type.KILL); - _killedCard = killedCard; + _killedCards = killedCards; } - public PhysicalCard getKilledCard() { - return _killedCard; + public List getKilledCards() { + return _killedCards; } } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/CharacterDeathRule.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/CharacterDeathRule.java index f71ea6c86..0232d2e0b 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/CharacterDeathRule.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/CharacterDeathRule.java @@ -1,18 +1,18 @@ package com.gempukku.lotro.logic.timing.rules; import com.gempukku.lotro.common.CardType; -import com.gempukku.lotro.common.Side; import com.gempukku.lotro.filters.Filters; import com.gempukku.lotro.game.AbstractActionProxy; 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.actions.DefaultActionsEnvironment; -import com.gempukku.lotro.logic.actions.DiscardMinionFromPlayAction; -import com.gempukku.lotro.logic.actions.KillAction; +import com.gempukku.lotro.logic.actions.RequiredTriggerAction; +import com.gempukku.lotro.logic.effects.KillEffect; import com.gempukku.lotro.logic.timing.Action; import com.gempukku.lotro.logic.timing.EffectResult; +import java.util.Collections; import java.util.LinkedList; import java.util.List; @@ -28,21 +28,24 @@ public class CharacterDeathRule { new AbstractActionProxy() { @Override public List getRequiredAfterTriggers(LotroGame game, EffectResult effectResult) { - List actions = new LinkedList(); - GameState gameState = game.getGameState(); + List deadCharacters = new LinkedList(); + List characters = Filters.filterActive(gameState, game.getModifiersQuerying(), Filters.or(Filters.type(CardType.ALLY), Filters.type(CardType.COMPANION), Filters.type(CardType.MINION))); for (PhysicalCard character : characters) if (gameState.getWounds(character) >= game.getModifiersQuerying().getVitality(gameState, character)) - if (character.getBlueprint().getSide() == Side.FREE_PEOPLE) { - actions.add(new KillAction(character)); - } else { - actions.add(new DiscardMinionFromPlayAction(character)); - } + deadCharacters.add(character); - return actions; + if (deadCharacters.size() > 0) { + RequiredTriggerAction action = new RequiredTriggerAction(null, null, "Character death from wounds"); + action.addEffect( + new KillEffect(deadCharacters)); + return Collections.singletonList(action); + } + + return null; } } ); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/ResolveSkirmishRule.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/ResolveSkirmishRule.java index 918e821c9..8179ff301 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/ResolveSkirmishRule.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/ResolveSkirmishRule.java @@ -7,14 +7,16 @@ 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.actions.DefaultActionsEnvironment; -import com.gempukku.lotro.logic.actions.KillAction; +import com.gempukku.lotro.logic.actions.RequiredTriggerAction; import com.gempukku.lotro.logic.actions.WoundAction; +import com.gempukku.lotro.logic.effects.KillEffect; import com.gempukku.lotro.logic.modifiers.ModifiersQuerying; import com.gempukku.lotro.logic.timing.Action; import com.gempukku.lotro.logic.timing.EffectResult; import com.gempukku.lotro.logic.timing.results.NormalSkirmishResult; import com.gempukku.lotro.logic.timing.results.OverwhelmSkirmishResult; +import java.util.Collections; import java.util.LinkedList; import java.util.List; @@ -51,13 +53,12 @@ public class ResolveSkirmishRule { OverwhelmSkirmishResult skirmishResult = (OverwhelmSkirmishResult) effectResult; List losers = skirmishResult.getLosers(); - List actions = new LinkedList(); - for (PhysicalCard loser : losers) - actions.add(new KillAction(loser)); - return actions; - } else { - return null; + RequiredTriggerAction action = new RequiredTriggerAction(null, null, "Kill overwhelmed characters"); + action.addEffect(new KillEffect(losers)); + + return Collections.singletonList(action); } + return null; } } );