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); }