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)
This commit is contained in:
Hanmac
2016-08-15 08:03:33 +00:00
parent 91f8fce6e8
commit 7b8563516c
2 changed files with 43 additions and 23 deletions

View File

@@ -196,7 +196,23 @@ public class TriggerHandler {
return mapParams; return mapParams;
} }
private void collectTriggerForWaiting() {
for (final TriggerWaiting wt : waitingTriggers) {
if (wt.getTriggers() != null)
continue;
List<Trigger> 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() { public final void resetActiveTriggers() {
collectTriggerForWaiting();
activeTriggers.clear(); activeTriggers.clear();
game.forEachCardInGame(new Visitor<Card>() { game.forEachCardInGame(new Visitor<Card>() {
@Override @Override
@@ -319,8 +335,8 @@ public class TriggerHandler {
if (runParams.containsKey("Destination")) { if (runParams.containsKey("Destination")) {
// Check static abilities when a card enters the battlefield // Check static abilities when a card enters the battlefield
if (runParams.get("Destination") instanceof String) { if (runParams.get("Destination") instanceof String) {
final String type = (String) runParams.get("Destination"); final String type = (String) runParams.get("Destination");
checkStatics |= type.equals("Battlefield"); checkStatics |= type.equals("Battlefield");
} else { } else {
final ZoneType zone = (ZoneType) runParams.get("Destination"); final ZoneType zone = (ZoneType) runParams.get("Destination");
checkStatics |= zone.equals(ZoneType.Battlefield); checkStatics |= zone.equals(ZoneType.Battlefield);
@@ -328,11 +344,11 @@ public class TriggerHandler {
} }
// AP // AP
checkStatics |= runNonStaticTriggersForPlayer(playerAP, mode, runParams, delayedTriggersWorkingCopy); checkStatics |= runNonStaticTriggersForPlayer(playerAP, wt, delayedTriggersWorkingCopy);
// NAPs // NAPs
for (final Player nap : game.getNonactivePlayers()) { for (final Player nap : game.getNonactivePlayers()) {
checkStatics |= runNonStaticTriggersForPlayer(nap, mode, runParams, delayedTriggersWorkingCopy); checkStatics |= runNonStaticTriggersForPlayer(nap, wt, delayedTriggersWorkingCopy);
} }
return checkStatics; return checkStatics;
} }
@@ -350,13 +366,16 @@ public class TriggerHandler {
} }
} }
private boolean runNonStaticTriggersForPlayer(final Player player, final TriggerType mode, private boolean runNonStaticTriggersForPlayer(final Player player, final TriggerWaiting wt, final List<Trigger> delayedTriggersWorkingCopy ) {
final Map<String, Object> runParams, final List<Trigger> delayedTriggersWorkingCopy ) {
final TriggerType mode = wt.getMode();
final Map<String, Object> runParams = wt.getParams();
final List<Trigger> triggers = wt.getTriggers() != null ? wt.getTriggers() : activeTriggers;
Card card = null; Card card = null;
boolean checkStatics = false; 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 (!t.isStatic() && t.getHostCard().getController().equals(player) && canRunTrigger(t, mode, runParams)) {
if (runParams.containsKey("Card") && runParams.get("Card") instanceof Card) { if (runParams.containsKey("Card") && runParams.get("Card") instanceof Card) {
card = (Card) runParams.get("Card"); card = (Card) runParams.get("Card");
@@ -404,16 +423,7 @@ public class TriggerHandler {
} }
if (!regtrig.zonesCheck(game.getZoneOf(regtrig.getHostCard()))) { if (!regtrig.zonesCheck(game.getZoneOf(regtrig.getHostCard()))) {
final Map<String, String> params = regtrig.getMapParams(); return false; // Host card isn't where it needs to be.
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.
}
} }
for (Trigger t : this.activeTriggers) { for (Trigger t : this.activeTriggers) {
@@ -494,11 +504,11 @@ public class TriggerHandler {
host = trigCard; host = trigCard;
} }
else { else {
// get CardState does not work for transformed cards // get CardState does not work for transformed cards
// also its about LKI // also its about LKI
if (host.isInZone(ZoneType.Battlefield) || !host.hasAlternateState()) { if (host.isInZone(ZoneType.Battlefield) || !host.hasAlternateState()) {
host = game.getCardState(host); host = game.getCardState(host);
} }
} }
sa = regtrig.getOverridingAbility(); sa = regtrig.getOverridingAbility();

View File

@@ -1,5 +1,6 @@
package forge.game.trigger; package forge.game.trigger;
import java.util.List;
import java.util.Map; import java.util.Map;
/** /**
@@ -8,6 +9,7 @@ import java.util.Map;
public class TriggerWaiting { public class TriggerWaiting {
private TriggerType mode; private TriggerType mode;
private Map<String, Object> params; private Map<String, Object> params;
private List<Trigger> triggers = null;
public TriggerWaiting(TriggerType m, Map<String, Object> p) { public TriggerWaiting(TriggerType m, Map<String, Object> p) {
mode = m; mode = m;
@@ -23,7 +25,15 @@ public class TriggerWaiting {
} }
@Override public List<Trigger> getTriggers() {
return triggers;
}
public void setTriggers(final List<Trigger> triggers) {
this.triggers = triggers;
}
@Override
public String toString() { public String toString() {
return String.format("Waiting trigger: %s with %s", mode, params); return String.format("Waiting trigger: %s with %s", mode, params);
} }