diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java
index b1d71844b4b..d29ecd5bd7d 100644
--- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java
+++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java
@@ -20,11 +20,13 @@ package forge.game.spellability;
import forge.game.card.Card;
import forge.game.player.Player;
import forge.game.trigger.TriggerType;
+import forge.game.zone.ZoneType;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
+import java.util.Map;
/**
*
@@ -76,6 +78,9 @@ public class SpellAbilityStackInstance {
private final HashMap storedSVars = new HashMap();
+ private final List zonesToOpen;
+ private final Map playersWithValidTargets;
+
/**
*
* Constructor for SpellAbility_StackInstance.
@@ -125,6 +130,25 @@ public class SpellAbilityStackInstance {
source.setSVar(store, "");
}
}
+
+ //store zones to open and players to open them for at the time the SpellAbility first goes on the stack based on the selected targets
+ if (tc == null) {
+ zonesToOpen = null;
+ playersWithValidTargets = null;
+ }
+ else {
+ zonesToOpen = new ArrayList();
+ playersWithValidTargets = new HashMap();
+ for (Card card : tc.getTargetCards()) {
+ ZoneType zoneType = card.getZone() != null ? card.getZone().getZoneType() : null;
+ if (zoneType != ZoneType.Battlefield) { //don't need to worry about targets on battlefield
+ if (zoneType != null && !zonesToOpen.contains(zoneType)) {
+ zonesToOpen.add(zoneType);
+ }
+ playersWithValidTargets.put(card.getController(), null);
+ }
+ }
+ }
}
/**
@@ -252,6 +276,14 @@ public class SpellAbilityStackInstance {
return this.tc;
}
+ public final List getZonesToOpen() {
+ return this.zonesToOpen;
+ }
+
+ public final Map getPlayersWithValidTargets() {
+ return this.playersWithValidTargets;
+ }
+
public void updateTarget(TargetChoices target) {
if (target != null) {
this.tc = target;
diff --git a/forge-gui-mobile/src/forge/screens/match/views/VStack.java b/forge-gui-mobile/src/forge/screens/match/views/VStack.java
index da38d01e123..ce972cded02 100644
--- a/forge-gui-mobile/src/forge/screens/match/views/VStack.java
+++ b/forge-gui-mobile/src/forge/screens/match/views/VStack.java
@@ -1,10 +1,9 @@
package forge.screens.match.views;
-import java.util.ArrayList;
-import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment;
import com.badlogic.gdx.math.Vector2;
@@ -68,19 +67,11 @@ public class VStack extends FDropDown {
//temporarily reveal zones targeted by active stack instance
private void revealTargetZones() {
- if (activeStackInstance == null || activeStackInstance.getTargetChoices() == null) { return; }
+ if (activeStackInstance == null) { return; }
- final List zones = new ArrayList();
- playersWithValidTargets = new HashMap();
- for (Card card : activeStackInstance.getTargetChoices().getTargetCards()) {
- ZoneType zoneType = card.getZone() != null ? card.getZone().getZoneType() : null;
- if (zoneType != null && !zones.contains(zoneType)) {
- zones.add(zoneType);
- }
- playersWithValidTargets.put(card.getController(), null);
- }
-
- if (zones.size() > 0 && playersWithValidTargets.size() > 0) {
+ final List zones = activeStackInstance.getZonesToOpen();
+ playersWithValidTargets = activeStackInstance.getPlayersWithValidTargets();
+ if (zones != null && zones.size() > 0 && playersWithValidTargets != null && playersWithValidTargets.size() > 0) {
GuiBase.getInterface().openZones(zones, playersWithValidTargets);
}
}