From 23cf911e9b8bd508a6e60effe5e0fd22ca3cf6b8 Mon Sep 17 00:00:00 2001 From: "marcins78@gmail.com" Date: Tue, 15 Nov 2011 15:58:16 +0000 Subject: [PATCH] "More Yet To Come" --- .../lotro/cards/set10/dwarven/Card10_003.java | 62 ++++++++++++++++++ .../lotro/game/ActionsEnvironment.java | 2 + .../actions/DefaultActionsEnvironment.java | 5 ++ .../lotro/logic/timing/ActionStack.java | 9 +++ .../actions/ResolveSkirmishDamageAction.java | 65 +++++++++++++++++++ .../timing/rules/ResolveSkirmishRule.java | 23 +------ 6 files changed, 145 insertions(+), 21 deletions(-) create mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set10/dwarven/Card10_003.java create mode 100644 gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/actions/ResolveSkirmishDamageAction.java diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set10/dwarven/Card10_003.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set10/dwarven/Card10_003.java new file mode 100644 index 000000000..ba2e08a38 --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set10/dwarven/Card10_003.java @@ -0,0 +1,62 @@ +package com.gempukku.lotro.cards.set10.dwarven; + +import com.gempukku.lotro.cards.AbstractResponseEvent; +import com.gempukku.lotro.cards.actions.PlayEventAction; +import com.gempukku.lotro.common.CardType; +import com.gempukku.lotro.common.Culture; +import com.gempukku.lotro.common.Race; +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.ChooseAndWoundCharactersEffect; +import com.gempukku.lotro.logic.timing.EffectResult; +import com.gempukku.lotro.logic.timing.UnrespondableEffect; +import com.gempukku.lotro.logic.timing.actions.ResolveSkirmishDamageAction; +import com.gempukku.lotro.logic.timing.results.KillResult; + +import java.util.Collections; +import java.util.List; + +/** + * Set: Mount Doom + * Side: Free + * Culture: Dwarven + * Twilight Cost: 0 + * Type: Event • Response + * Game Text: If a Dwarf kills a minion in a skirmish and that minion did not take all wounds caused by that Dwarf's + * damage bonus, assign those remaining wounds to minions not assigned to a skirmish. + */ +public class Card10_003 extends AbstractResponseEvent { + public Card10_003() { + super(Side.FREE_PEOPLE, 0, Culture.DWARVEN, "More Yet To Come"); + } + + @Override + public List getOptionalAfterActions(final String playerId, LotroGame game, EffectResult effectResult, PhysicalCard self) { + if (effectResult.getType() == EffectResult.Type.KILL + && Filters.canSpot(game.getGameState(), game.getModifiersQuerying(), Filters.inSkirmish, Race.DWARF)) { + KillResult killResult = (KillResult) effectResult; + if (Filters.filter(killResult.getKilledCards(), game.getGameState(), game.getModifiersQuerying(), CardType.MINION).size() > 0) { + final ResolveSkirmishDamageAction resolveSkirmishDamageAction = game.getActionsEnvironment().findTopmostActionOfType(ResolveSkirmishDamageAction.class); + if (resolveSkirmishDamageAction != null + && resolveSkirmishDamageAction.getRemainingDamage() > 0) { + final PlayEventAction action = new PlayEventAction(self); + action.appendEffect( + new UnrespondableEffect() { + @Override + protected void doPlayEffect(LotroGame game) { + int remainingDamage = resolveSkirmishDamageAction.getRemainingDamage(); + resolveSkirmishDamageAction.consumeRemainingDamage(); + for (int i = 0; i < remainingDamage; i++) + action.appendEffect( + new ChooseAndWoundCharactersEffect(action, playerId, 1, 1, CardType.MINION, Filters.notAssignedToSkirmish)); + } + }); + return Collections.singletonList(action); + } + } + } + return null; + } +} 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 bbcb5760a..90efd188c 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 @@ -30,4 +30,6 @@ public interface ActionsEnvironment { public void addUntilEndOfTurnActionProxy(ActionProxy actionProxy); public void addActionToStack(Action action); + + public T findTopmostActionOfType(Class clazz); } 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 742bcb4f0..18c61c82d 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 @@ -232,6 +232,11 @@ public class DefaultActionsEnvironment implements ActionsEnvironment { _actionStack.stackAction(action); } + @Override + public T findTopmostActionOfType(Class clazz) { + return _actionStack.findTopmostActionOfType(clazz); + } + private class GatherRequiredAfterTriggers extends CompletePhysicalCardVisitor { private Collection _effectResults; private List _actions = new LinkedList(); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/ActionStack.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/ActionStack.java index 36357cbb8..fc137c72d 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/ActionStack.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/ActionStack.java @@ -31,4 +31,13 @@ public class ActionStack { return null; return _actionStack.peek(); } + + public T findTopmostActionOfType(Class clazz) { + for (int i = _actionStack.size() - 1; i >= 0; i--) { + final Action actionAtIndex = _actionStack.get(i); + if (actionAtIndex.getClass() == clazz) + return (T) actionAtIndex; + } + return null; + } } 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 new file mode 100644 index 000000000..c6b36325e --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/actions/ResolveSkirmishDamageAction.java @@ -0,0 +1,65 @@ +package com.gempukku.lotro.logic.timing.actions; + +import com.gempukku.lotro.common.Keyword; +import com.gempukku.lotro.filters.Filters; +import com.gempukku.lotro.game.PhysicalCard; +import com.gempukku.lotro.game.state.GameState; +import com.gempukku.lotro.game.state.LotroGame; +import com.gempukku.lotro.logic.actions.RequiredTriggerAction; +import com.gempukku.lotro.logic.effects.WoundCharactersEffect; +import com.gempukku.lotro.logic.modifiers.ModifiersQuerying; +import com.gempukku.lotro.logic.timing.Effect; +import com.gempukku.lotro.logic.timing.results.NormalSkirmishResult; + +import java.util.List; + +public class ResolveSkirmishDamageAction extends RequiredTriggerAction { + private NormalSkirmishResult _skirmishResult; + + private Integer _damageToDo; + private int _remainingDamage; + + public ResolveSkirmishDamageAction(NormalSkirmishResult skirmishResult) { + super(null); + _skirmishResult = skirmishResult; + } + + @Override + public String getText(LotroGame game) { + return "Resolving skirmish"; + } + + @Override + public Effect nextEffect(LotroGame game) { + if (_damageToDo == null) { + _damageToDo = calculateDamageToDo(game); + _remainingDamage = _damageToDo; + } + + if (_remainingDamage > 0) { + _remainingDamage--; + return new WoundCharactersEffect(_skirmishResult.getWinners(), Filters.in(_skirmishResult.getLosers())); + } + + return null; + } + + public void consumeRemainingDamage() { + _remainingDamage = 0; + } + + public int getRemainingDamage() { + return _remainingDamage; + } + + private int calculateDamageToDo(LotroGame game) { + List winners = _skirmishResult.getWinners(); + int dmg = 1; + ModifiersQuerying modifiersQuerying = game.getModifiersQuerying(); + GameState gameState = game.getGameState(); + for (PhysicalCard winner : winners) + dmg += modifiersQuerying.getKeywordCount(gameState, winner, Keyword.DAMAGE); + + return dmg; + } +} 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 adf7fa7a2..ae505de22 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 @@ -1,18 +1,14 @@ package com.gempukku.lotro.logic.timing.rules; -import com.gempukku.lotro.common.Keyword; -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.RequiredTriggerAction; import com.gempukku.lotro.logic.effects.KillEffect; -import com.gempukku.lotro.logic.effects.WoundCharactersEffect; -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.actions.ResolveSkirmishDamageAction; import com.gempukku.lotro.logic.timing.results.NormalSkirmishResult; import com.gempukku.lotro.logic.timing.results.OverwhelmSkirmishResult; @@ -36,22 +32,7 @@ public class ResolveSkirmishRule { public List getRequiredAfterTriggers(LotroGame lotroGame, EffectResult effectResult) { if (effectResult.getType() == EffectResult.Type.RESOLVE_SKIRMISH) { NormalSkirmishResult skirmishResult = (NormalSkirmishResult) effectResult; - List winners = skirmishResult.getWinners(); - int dmg = 1; - ModifiersQuerying modifiersQuerying = _lotroGame.getModifiersQuerying(); - GameState gameState = _lotroGame.getGameState(); - for (PhysicalCard winner : winners) - dmg += modifiersQuerying.getKeywordCount(gameState, winner, Keyword.DAMAGE); - - List losers = skirmishResult.getInSkirmishLosers(); - - RequiredTriggerAction action = new RequiredTriggerAction(null); - action.setText("Resolving skirmish"); - for (int i = 0; i < dmg; i++) { - action.appendEffect( - new WoundCharactersEffect(winners, Filters.in(losers))); - } - + ResolveSkirmishDamageAction action = new ResolveSkirmishDamageAction(skirmishResult); return Collections.singletonList(action); } else if (effectResult.getType() == EffectResult.Type.OVERWHELM_IN_SKIRMISH) { OverwhelmSkirmishResult skirmishResult = (OverwhelmSkirmishResult) effectResult;