"More Yet To Come"
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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>();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user