diff --git a/forge-game/src/main/java/forge/game/ability/effects/DelayedTriggerEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DelayedTriggerEffect.java index 51f314fc72d..f21b362b4f6 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DelayedTriggerEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DelayedTriggerEffect.java @@ -74,6 +74,7 @@ public class DelayedTriggerEffect extends SpellAbilityEffect { if (mapParams.containsKey("Execute")) { SpellAbility overridingSA = sa.getAdditonalAbility("Execute"); overridingSA.setActivatingPlayer(sa.getActivatingPlayer()); + overridingSA.setDeltrigActivatingPlayer(sa.getActivatingPlayer()); // ensure that the original activator can be restored later // Set Transform timestamp when the delayed trigger is created if (ApiType.SetState == overridingSA.getApi()) { overridingSA.setSVar("StoredTransform", String.valueOf(sa.getHostCard().getTransformedTimestamp())); diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java index 2ac73bdf776..d13a4a3d761 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -81,6 +81,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit private String originalStackDescription = "", stackDescription = ""; private ManaCost multiKickerManaCost = null; private Player activatingPlayer = null; + private Player deltrigActivatingPlayer = null; // used by delayed triggers to ensure the original activator can be restored private Player targetingPlayer = null; private boolean basicLandAbility; // granted by basic land type @@ -374,6 +375,13 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit view.updateCanPlay(this, false); } + public Player getDeltrigActivatingPlayer() { + return deltrigActivatingPlayer; + } + public void setDeltrigActivatingPlayer(final Player player) { + deltrigActivatingPlayer = player; + } + public Player getTargetingPlayer() { return targetingPlayer; } 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 5049b5316e8..68a98f2ba61 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java @@ -578,9 +578,15 @@ public class TriggerHandler { if (regtrig.getStoredTriggeredObjects() != null) { sa.setTriggeringObjects(regtrig.getStoredTriggeredObjects()); } + if (sa.getActivatingPlayer() == null) { // overriding delayed trigger should have set activator sa.setActivatingPlayer(host.getController()); + } else if (sa.getDeltrigActivatingPlayer() != null) { + // make sure that the original delayed trigger activator is restored + // (may have been overwritten by the AI simulation routines, e.g. Rainbow Vale) + sa.setActivatingPlayer(sa.getDeltrigActivatingPlayer()); } + if (triggerParams.containsKey("TriggerController")) { Player p = AbilityUtils.getDefinedPlayers(regtrig.getHostCard(), triggerParams.get("TriggerController"), sa).get(0); sa.setActivatingPlayer(p);