From 7e4057b492ca58cc6afcf23958a92d086f4c9e09 Mon Sep 17 00:00:00 2001 From: drdev Date: Mon, 21 Jul 2014 04:49:56 +0000 Subject: [PATCH] Prevent graveyard opening after resolving a removal spell with another spell targeting that creature below it that will now be countered --- .../SpellAbilityStackInstance.java | 32 +++++++++++++++++++ .../src/forge/screens/match/views/VStack.java | 19 +++-------- 2 files changed, 37 insertions(+), 14 deletions(-) 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); } }