From cf2d6466a94f4bf5f84b6c41f64ffa08d6f65a55 Mon Sep 17 00:00:00 2001
From: Maxmtg
Date: Tue, 14 May 2013 05:25:51 +0000
Subject: [PATCH] MagicStack no longer exposes getStack method, uses a
synchronized queue to manage contents
---
.../ability/effects/ChooseSourceEffect.java | 47 +++++------
.../card/ability/effects/EndTurnEffect.java | 2 +-
.../SpellAbilityStackInstance.java | 1 -
src/main/java/forge/game/GameState.java | 2 +-
src/main/java/forge/game/zone/MagicStack.java | 83 ++++++-------------
.../java/forge/gui/match/views/VStack.java | 7 +-
6 files changed, 49 insertions(+), 93 deletions(-)
diff --git a/src/main/java/forge/card/ability/effects/ChooseSourceEffect.java b/src/main/java/forge/card/ability/effects/ChooseSourceEffect.java
index 42cb0f9b64a..dee1ecdd19b 100644
--- a/src/main/java/forge/card/ability/effects/ChooseSourceEffect.java
+++ b/src/main/java/forge/card/ability/effects/ChooseSourceEffect.java
@@ -2,8 +2,6 @@ package forge.card.ability.effects;
import java.util.ArrayList;
import java.util.List;
-import java.util.Stack;
-
import org.apache.commons.lang3.StringUtils;
import com.google.common.base.Predicate;
@@ -46,7 +44,6 @@ public class ChooseSourceEffect extends SpellAbilityEffect {
final Target tgt = sa.getTarget();
final List tgtPlayers = getTargetPlayers(sa);
- Stack stack = game.getStack().getStack();
List permanentSources = new ArrayList();
List stackSources = new ArrayList();
@@ -58,37 +55,37 @@ public class ChooseSourceEffect extends SpellAbilityEffect {
permanentSources = game.getCardsIn(ZoneType.Battlefield);
// Get the list of cards that produce effects on the stack
- if (stack != null) {
- for (SpellAbilityStackInstance stackinst : stack) {
- if (!stackSources.contains(stackinst.getSourceCard())) {
- stackSources.add(stackinst.getSourceCard());
- }
- // Get the list of cards that are referenced by effects on the stack
- if (null != stackinst.getSpellAbility().getTriggeringObjects()) {
- for (Object c : stackinst.getSpellAbility().getTriggeringObjects().values()) {
- if (c instanceof Card) {
- if (!stackSources.contains((Card) c)) {
- referencedSources.add((Card) c);
- }
+
+ for (SpellAbilityStackInstance stackinst : game.getStack()) {
+ if (!stackSources.contains(stackinst.getSourceCard())) {
+ stackSources.add(stackinst.getSourceCard());
+ }
+ // Get the list of cards that are referenced by effects on the stack
+ if (null != stackinst.getSpellAbility().getTriggeringObjects()) {
+ for (Object c : stackinst.getSpellAbility().getTriggeringObjects().values()) {
+ if (c instanceof Card) {
+ if (!stackSources.contains((Card) c)) {
+ referencedSources.add((Card) c);
}
}
}
- if (null != stackinst.getSpellAbility().getTargetCard()) {
- referencedSources.add(stackinst.getSpellAbility().getTargetCard());
- }
- // TODO: is this necessary?
- if (null != stackinst.getSpellAbility().getReplacingObjects()) {
- for (Object c : stackinst.getSpellAbility().getReplacingObjects().values()) {
- if (c instanceof Card) {
- if (!stackSources.contains((Card) c)) {
- referencedSources.add((Card) c);
- }
+ }
+ if (null != stackinst.getSpellAbility().getTargetCard()) {
+ referencedSources.add(stackinst.getSpellAbility().getTargetCard());
+ }
+ // TODO: is this necessary?
+ if (null != stackinst.getSpellAbility().getReplacingObjects()) {
+ for (Object c : stackinst.getSpellAbility().getReplacingObjects().values()) {
+ if (c instanceof Card) {
+ if (!stackSources.contains((Card) c)) {
+ referencedSources.add((Card) c);
}
}
}
}
}
+
if (sa.hasParam("Choices")) {
permanentSources = CardLists.getValidCards(permanentSources, sa.getParam("Choices"), host.getController(), host);
diff --git a/src/main/java/forge/card/ability/effects/EndTurnEffect.java b/src/main/java/forge/card/ability/effects/EndTurnEffect.java
index 0bba39ab3d8..0692c1d45c5 100644
--- a/src/main/java/forge/card/ability/effects/EndTurnEffect.java
+++ b/src/main/java/forge/card/ability/effects/EndTurnEffect.java
@@ -28,7 +28,7 @@ public class EndTurnEffect extends SpellAbilityEffect {
for (final Card c : game.getStackZone().getCards()) {
game.getAction().exile(c);
}
- game.getStack().getStack().clear();
+ game.getStack().clear();
// 2) All attacking and blocking creatures are removed from combat.
game.getCombat().reset(game.getPhaseHandler().getPlayerTurn());
diff --git a/src/main/java/forge/card/spellability/SpellAbilityStackInstance.java b/src/main/java/forge/card/spellability/SpellAbilityStackInstance.java
index aa40c21af2b..e55690fd803 100644
--- a/src/main/java/forge/card/spellability/SpellAbilityStackInstance.java
+++ b/src/main/java/forge/card/spellability/SpellAbilityStackInstance.java
@@ -21,7 +21,6 @@ import java.util.HashMap;
import java.util.List;
import forge.Card;
-import forge.game.player.Player;
/**
*
diff --git a/src/main/java/forge/game/GameState.java b/src/main/java/forge/game/GameState.java
index d6584abdcad..69076cd2fae 100644
--- a/src/main/java/forge/game/GameState.java
+++ b/src/main/java/forge/game/GameState.java
@@ -584,7 +584,7 @@ public class GameState {
if (c.isScheme() && !c.isType("Ongoing")) {
boolean foundonstack = false;
- for (SpellAbilityStackInstance si : getStack().getStack()) {
+ for (SpellAbilityStackInstance si : getStack()) {
if (si.getSourceCard().equals(c)) {
foundonstack = true;
diff --git a/src/main/java/forge/game/zone/MagicStack.java b/src/main/java/forge/game/zone/MagicStack.java
index 0caebdf95e5..e3ac0fec896 100644
--- a/src/main/java/forge/game/zone/MagicStack.java
+++ b/src/main/java/forge/game/zone/MagicStack.java
@@ -18,11 +18,15 @@
package forge.game.zone;
import java.util.ArrayList;
+import java.util.Deque;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Stack;
+import java.util.concurrent.LinkedBlockingDeque;
+
+
import com.esotericsoftware.minlog.Log;
import forge.Card;
@@ -70,7 +74,8 @@ import forge.util.MyObservable;
public class MagicStack extends MyObservable implements Iterable {
private final List simultaneousStackEntryList = new ArrayList();
- private final Stack stack = new Stack();
+ // They don't provide a LIFO queue, so had to use a deque
+ private final Deque stack = new LinkedBlockingDeque();
private final Stack frozenStack = new Stack();
private boolean frozen = false;
@@ -119,7 +124,7 @@ public class MagicStack extends MyObservable implements Iterable
*/
public final void reset() {
- this.getStack().clear();
+ this.clear();
this.simultaneousStackEntryList.clear();
this.frozen = false;
this.lastTurnCast.clear();
@@ -137,7 +142,7 @@ public class MagicStack extends MyObservable implements Iterable
- * push.
- *
- *
- * @param sp
- * a {@link forge.card.spellability.SpellAbility} object.
- */
private void push(final SpellAbility sp) {
if (null == sp.getActivatingPlayer()) {
sp.setActivatingPlayer(sp.getSourceCard().getController());
@@ -560,9 +557,7 @@ public class MagicStack extends MyObservable implements Iterable
- * pop.
- *
- *
- * @return a {@link forge.card.spellability.SpellAbility} object.
- */
- public final SpellAbility pop() {
- synchronized(this.stack)
- {
- final SpellAbilityStackInstance si = this.getStack().pop();
- final SpellAbility sp = si.getSpellAbility();
- return sp;
- }
- }
-
- private final SpellAbility top() {
- final SpellAbilityStackInstance si = this.getStack().peek();
- final SpellAbility sa = si.getSpellAbility();
- return sa;
- }
-
/**
*
* peekAbility.
@@ -869,9 +842,8 @@ public class MagicStack extends MyObservable implements Iterable getStack() {
- synchronized(this.stack) {
- return this.stack;
- }
- }
-
/**
* Gets the frozen stack.
*
@@ -1139,4 +1097,11 @@ public class MagicStack extends MyObservable implements Iterable {
CMatchUI.SINGLETON_INSTANCE.setCard(spell.getSourceCard());
}
isFirst = false;
- }
-
- Collections.reverse(list);
-
- for(JTextArea tar : list) {
+
parentCell.getBody().add(tar, "w 98%!");
stackTARs.add(tar);
}