"More Yet To Come"

This commit is contained in:
marcins78@gmail.com
2011-11-15 15:58:16 +00:00
parent 1b4ed2ebcd
commit 23cf911e9b
6 changed files with 145 additions and 21 deletions

View File

@@ -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<PlayEventAction> 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;
}
}

View File

@@ -30,4 +30,6 @@ public interface ActionsEnvironment {
public void addUntilEndOfTurnActionProxy(ActionProxy actionProxy);
public void addActionToStack(Action action);
public <T extends Action> T findTopmostActionOfType(Class<T> clazz);
}

View File

@@ -232,6 +232,11 @@ public class DefaultActionsEnvironment implements ActionsEnvironment {
_actionStack.stackAction(action);
}
@Override
public <T extends Action> T findTopmostActionOfType(Class<T> clazz) {
return _actionStack.findTopmostActionOfType(clazz);
}
private class GatherRequiredAfterTriggers extends CompletePhysicalCardVisitor {
private Collection<? extends EffectResult> _effectResults;
private List<Action> _actions = new LinkedList<Action>();

View File

@@ -31,4 +31,13 @@ public class ActionStack {
return null;
return _actionStack.peek();
}
public <T extends Action> T findTopmostActionOfType(Class<T> 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;
}
}

View File

@@ -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<PhysicalCard> 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;
}
}

View File

@@ -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<? extends Action> getRequiredAfterTriggers(LotroGame lotroGame, EffectResult effectResult) {
if (effectResult.getType() == EffectResult.Type.RESOLVE_SKIRMISH) {
NormalSkirmishResult skirmishResult = (NormalSkirmishResult) effectResult;
List<PhysicalCard> 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<PhysicalCard> 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;