diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java index 2962f35e042..4ac405b46cf 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java @@ -196,7 +196,23 @@ public class TriggerHandler { return mapParams; } + private void collectTriggerForWaiting() { + for (final TriggerWaiting wt : waitingTriggers) { + if (wt.getTriggers() != null) + continue; + + List trigger = Lists.newArrayList(); + for (final Trigger t : activeTriggers) { + if (canRunTrigger(t,wt.getMode(),wt.getParams())) { + trigger.add(t); + } + } + wt.setTriggers(trigger); + } + } + public final void resetActiveTriggers() { + collectTriggerForWaiting(); activeTriggers.clear(); game.forEachCardInGame(new Visitor() { @Override @@ -319,8 +335,8 @@ public class TriggerHandler { if (runParams.containsKey("Destination")) { // Check static abilities when a card enters the battlefield if (runParams.get("Destination") instanceof String) { - final String type = (String) runParams.get("Destination"); - checkStatics |= type.equals("Battlefield"); + final String type = (String) runParams.get("Destination"); + checkStatics |= type.equals("Battlefield"); } else { final ZoneType zone = (ZoneType) runParams.get("Destination"); checkStatics |= zone.equals(ZoneType.Battlefield); @@ -328,11 +344,11 @@ public class TriggerHandler { } // AP - checkStatics |= runNonStaticTriggersForPlayer(playerAP, mode, runParams, delayedTriggersWorkingCopy); + checkStatics |= runNonStaticTriggersForPlayer(playerAP, wt, delayedTriggersWorkingCopy); // NAPs for (final Player nap : game.getNonactivePlayers()) { - checkStatics |= runNonStaticTriggersForPlayer(nap, mode, runParams, delayedTriggersWorkingCopy); + checkStatics |= runNonStaticTriggersForPlayer(nap, wt, delayedTriggersWorkingCopy); } return checkStatics; } @@ -350,13 +366,16 @@ public class TriggerHandler { } } - private boolean runNonStaticTriggersForPlayer(final Player player, final TriggerType mode, - final Map runParams, final List delayedTriggersWorkingCopy ) { + private boolean runNonStaticTriggersForPlayer(final Player player, final TriggerWaiting wt, final List delayedTriggersWorkingCopy ) { + + final TriggerType mode = wt.getMode(); + final Map runParams = wt.getParams(); + final List triggers = wt.getTriggers() != null ? wt.getTriggers() : activeTriggers; Card card = null; boolean checkStatics = false; - for (final Trigger t : activeTriggers) { + for (final Trigger t : triggers) { if (!t.isStatic() && t.getHostCard().getController().equals(player) && canRunTrigger(t, mode, runParams)) { if (runParams.containsKey("Card") && runParams.get("Card") instanceof Card) { card = (Card) runParams.get("Card"); @@ -404,16 +423,7 @@ public class TriggerHandler { } if (!regtrig.zonesCheck(game.getZoneOf(regtrig.getHostCard()))) { - final Map params = regtrig.getMapParams(); - final Card hostCard = regtrig.getHostCard(); - if (!(regtrig instanceof TriggerChangesZone && - "Battlefield".equals(params.get("Origin")) && - "Graveyard".equals(params.get("Destination")) && - hostCard.getZone().is(ZoneType.Graveyard) && - regtrig.getActiveZone().contains(ZoneType.Battlefield) && - game.getLastStateBattlefield().contains(hostCard))) { - return false; // Host card isn't where it needs to be. - } + return false; // Host card isn't where it needs to be. } for (Trigger t : this.activeTriggers) { @@ -494,11 +504,11 @@ public class TriggerHandler { host = trigCard; } else { - // get CardState does not work for transformed cards - // also its about LKI - if (host.isInZone(ZoneType.Battlefield) || !host.hasAlternateState()) { - host = game.getCardState(host); - } + // get CardState does not work for transformed cards + // also its about LKI + if (host.isInZone(ZoneType.Battlefield) || !host.hasAlternateState()) { + host = game.getCardState(host); + } } sa = regtrig.getOverridingAbility(); diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerWaiting.java b/forge-game/src/main/java/forge/game/trigger/TriggerWaiting.java index 04cc64ad6ee..dced50d71e7 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerWaiting.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerWaiting.java @@ -1,5 +1,6 @@ package forge.game.trigger; +import java.util.List; import java.util.Map; /** @@ -8,6 +9,7 @@ import java.util.Map; public class TriggerWaiting { private TriggerType mode; private Map params; + private List triggers = null; public TriggerWaiting(TriggerType m, Map p) { mode = m; @@ -23,7 +25,15 @@ public class TriggerWaiting { } - @Override + public List getTriggers() { + return triggers; + } + + public void setTriggers(final List triggers) { + this.triggers = triggers; + } + + @Override public String toString() { return String.format("Waiting trigger: %s with %s", mode, params); }