MagicStack no longer exposes getStack method, uses a synchronized queue to manage contents

This commit is contained in:
Maxmtg
2013-05-14 05:25:51 +00:00
parent 1551b2c2e8
commit cf2d6466a9
6 changed files with 49 additions and 93 deletions

View File

@@ -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<Player> tgtPlayers = getTargetPlayers(sa);
Stack<SpellAbilityStackInstance> stack = game.getStack().getStack();
List<Card> permanentSources = new ArrayList<Card>();
List<Card> stackSources = new ArrayList<Card>();
@@ -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);

View File

@@ -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());

View File

@@ -21,7 +21,6 @@ import java.util.HashMap;
import java.util.List;
import forge.Card;
import forge.game.player.Player;
/**
* <p>

View File

@@ -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;

View File

@@ -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<SpellAbilityStackInstance> {
private final List<SpellAbility> simultaneousStackEntryList = new ArrayList<SpellAbility>();
private final Stack<SpellAbilityStackInstance> stack = new Stack<SpellAbilityStackInstance>();
// They don't provide a LIFO queue, so had to use a deque
private final Deque<SpellAbilityStackInstance> stack = new LinkedBlockingDeque<SpellAbilityStackInstance>();
private final Stack<SpellAbilityStackInstance> frozenStack = new Stack<SpellAbilityStackInstance>();
private boolean frozen = false;
@@ -119,7 +124,7 @@ public class MagicStack extends MyObservable implements Iterable<SpellAbilitySta
* </p>
*/
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<SpellAbilitySta
* @return a boolean.
*/
public final boolean isSplitSecondOnStack() {
for(SpellAbilityStackInstance si : this.getStack()) {
for(SpellAbilityStackInstance si : this.stack) {
if (si.isSpell() && si.getSourceCard().hasKeyword("Split second")) {
return true;
}
@@ -529,7 +534,7 @@ public class MagicStack extends MyObservable implements Iterable<SpellAbilitySta
* @return a int.
*/
public final int size() {
return this.getStack().size();
return this.stack.size();
}
/**
@@ -540,18 +545,10 @@ public class MagicStack extends MyObservable implements Iterable<SpellAbilitySta
* @return a boolean.
*/
public final boolean isEmpty() {
return this.getStack().isEmpty();
return this.stack.isEmpty();
}
// Push should only be used by add.
/**
* <p>
* push.
* </p>
*
* @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<SpellAbilitySta
final SpellAbilityStackInstance si = new SpellAbilityStackInstance(sp);
synchronized (this.stack) {
this.getStack().push(si);
}
this.stack.addFirst(si);
// 2012-07-21 the following comparison needs to move below the pushes but somehow screws up priority
// When it's down there. That makes absolutely no sense to me, so i'm putting it back for now
@@ -597,7 +592,7 @@ public class MagicStack extends MyObservable implements Iterable<SpellAbilitySta
// The SpellAbility isn't removed from the Stack until it finishes resolving
// temporarily reverted removing SAs after resolution
final SpellAbility sa = this.top();
final SpellAbility sa = this.peekAbility();
//final SpellAbility sa = this.pop();
// ActivePlayer gains priority first after Resolve
@@ -839,28 +834,6 @@ public class MagicStack extends MyObservable implements Iterable<SpellAbilitySta
return hasFizzled(sa.getSubAbility(), source, fizzle) && fizzle;
}
/**
* <p>
* pop.
* </p>
*
* @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;
}
/**
* <p>
* peekAbility.
@@ -869,9 +842,8 @@ public class MagicStack extends MyObservable implements Iterable<SpellAbilitySta
* @return a {@link forge.card.spellability.SpellAbility} object.
*/
public final SpellAbility peekAbility() {
synchronized(this.stack) {
return this.getStack().peek().getSpellAbility();
}
return this.stack.peekFirst().getSpellAbility();
}
}
/**
@@ -902,10 +874,7 @@ public class MagicStack extends MyObservable implements Iterable<SpellAbilitySta
* object.
*/
public final void remove(final SpellAbilityStackInstance si) {
synchronized (this.stack) {
this.getStack().remove(si);
}
this.stack.remove(si);
this.getFrozenStack().remove(si);
this.updateObservers();
}
@@ -922,7 +891,7 @@ public class MagicStack extends MyObservable implements Iterable<SpellAbilitySta
*/
public final SpellAbilityStackInstance getInstanceFromSpellAbility(final SpellAbility sa) {
// TODO: Confirm this works!
for (final SpellAbilityStackInstance si : this.getStack()) {
for (final SpellAbilityStackInstance si : this.stack) {
if (si.compareToSpellAbility(sa)) {
return si;
}
@@ -1040,7 +1009,7 @@ public class MagicStack extends MyObservable implements Iterable<SpellAbilitySta
* @return true, if successful
*/
public final boolean hasStateTrigger(final int triggerID) {
for (final SpellAbilityStackInstance sasi : this.getStack()) {
for (final SpellAbilityStackInstance sasi : this.stack) {
if (sasi.isStateTrigger(triggerID)) {
return true;
}
@@ -1064,17 +1033,6 @@ public class MagicStack extends MyObservable implements Iterable<SpellAbilitySta
return this.simultaneousStackEntryList;
}
/**
* Gets the stack.
*
* @return the stack
*/
public final Stack<SpellAbilityStackInstance> getStack() {
synchronized(this.stack) {
return this.stack;
}
}
/**
* Gets the frozen stack.
*
@@ -1139,4 +1097,11 @@ public class MagicStack extends MyObservable implements Iterable<SpellAbilitySta
// TODO Auto-generated method stub
return stack.iterator();
}
/**
* TODO: Write javadoc for this method.
*/
public void clear() {
stack.clear();
}
}

View File

@@ -23,7 +23,6 @@ import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.swing.JCheckBoxMenuItem;
@@ -197,11 +196,7 @@ public enum VStack implements IVDoc<CStack> {
CMatchUI.SINGLETON_INSTANCE.setCard(spell.getSourceCard());
}
isFirst = false;
}
Collections.reverse(list);
for(JTextArea tar : list) {
parentCell.getBody().add(tar, "w 98%!");
stackTARs.add(tar);
}