mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-16 10:48:00 +00:00
MagicStack no longer exposes getStack method, uses a synchronized queue to manage contents
This commit is contained in:
@@ -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);
|
||||
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -21,7 +21,6 @@ import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
import forge.Card;
|
||||
import forge.game.player.Player;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user