mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-18 03:38:01 +00:00
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:
@@ -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();
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user