From 7b8563516c712e8f6146427a6ccfa39c6d368bce Mon Sep 17 00:00:00 2001 From: Hanmac Date: Mon, 15 Aug 2016 08:03:33 +0000 Subject: [PATCH] TriggerHandler & TriggerWaiting: updated trigger for subabilities and waiting Trigger should look for the events they should trigger. that does fix the problem with subabilities and changeZone Triggers (no need to check for LastStateBattlefield) --- .../forge/game/trigger/TriggerHandler.java | 54 +++++++++++-------- .../forge/game/trigger/TriggerWaiting.java | 12 ++++- 2 files changed, 43 insertions(+), 23 deletions(-) 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); }