mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-17 03:08:02 +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.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Stack;
|
|
||||||
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
import com.google.common.base.Predicate;
|
import com.google.common.base.Predicate;
|
||||||
@@ -46,7 +44,6 @@ public class ChooseSourceEffect extends SpellAbilityEffect {
|
|||||||
final Target tgt = sa.getTarget();
|
final Target tgt = sa.getTarget();
|
||||||
final List<Player> tgtPlayers = getTargetPlayers(sa);
|
final List<Player> tgtPlayers = getTargetPlayers(sa);
|
||||||
|
|
||||||
Stack<SpellAbilityStackInstance> stack = game.getStack().getStack();
|
|
||||||
|
|
||||||
List<Card> permanentSources = new ArrayList<Card>();
|
List<Card> permanentSources = new ArrayList<Card>();
|
||||||
List<Card> stackSources = new ArrayList<Card>();
|
List<Card> stackSources = new ArrayList<Card>();
|
||||||
@@ -58,8 +55,8 @@ public class ChooseSourceEffect extends SpellAbilityEffect {
|
|||||||
permanentSources = game.getCardsIn(ZoneType.Battlefield);
|
permanentSources = game.getCardsIn(ZoneType.Battlefield);
|
||||||
|
|
||||||
// Get the list of cards that produce effects on the stack
|
// Get the list of cards that produce effects on the stack
|
||||||
if (stack != null) {
|
|
||||||
for (SpellAbilityStackInstance stackinst : stack) {
|
for (SpellAbilityStackInstance stackinst : game.getStack()) {
|
||||||
if (!stackSources.contains(stackinst.getSourceCard())) {
|
if (!stackSources.contains(stackinst.getSourceCard())) {
|
||||||
stackSources.add(stackinst.getSourceCard());
|
stackSources.add(stackinst.getSourceCard());
|
||||||
}
|
}
|
||||||
@@ -87,7 +84,7 @@ public class ChooseSourceEffect extends SpellAbilityEffect {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (sa.hasParam("Choices")) {
|
if (sa.hasParam("Choices")) {
|
||||||
permanentSources = CardLists.getValidCards(permanentSources, sa.getParam("Choices"), host.getController(), host);
|
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()) {
|
for (final Card c : game.getStackZone().getCards()) {
|
||||||
game.getAction().exile(c);
|
game.getAction().exile(c);
|
||||||
}
|
}
|
||||||
game.getStack().getStack().clear();
|
game.getStack().clear();
|
||||||
|
|
||||||
// 2) All attacking and blocking creatures are removed from combat.
|
// 2) All attacking and blocking creatures are removed from combat.
|
||||||
game.getCombat().reset(game.getPhaseHandler().getPlayerTurn());
|
game.getCombat().reset(game.getPhaseHandler().getPlayerTurn());
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ import java.util.HashMap;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import forge.Card;
|
import forge.Card;
|
||||||
import forge.game.player.Player;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p>
|
||||||
|
|||||||
@@ -584,7 +584,7 @@ public class GameState {
|
|||||||
if (c.isScheme() && !c.isType("Ongoing")) {
|
if (c.isScheme() && !c.isType("Ongoing")) {
|
||||||
|
|
||||||
boolean foundonstack = false;
|
boolean foundonstack = false;
|
||||||
for (SpellAbilityStackInstance si : getStack().getStack()) {
|
for (SpellAbilityStackInstance si : getStack()) {
|
||||||
if (si.getSourceCard().equals(c)) {
|
if (si.getSourceCard().equals(c)) {
|
||||||
|
|
||||||
foundonstack = true;
|
foundonstack = true;
|
||||||
|
|||||||
@@ -18,11 +18,15 @@
|
|||||||
package forge.game.zone;
|
package forge.game.zone;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Deque;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Stack;
|
import java.util.Stack;
|
||||||
|
import java.util.concurrent.LinkedBlockingDeque;
|
||||||
|
|
||||||
|
|
||||||
import com.esotericsoftware.minlog.Log;
|
import com.esotericsoftware.minlog.Log;
|
||||||
|
|
||||||
import forge.Card;
|
import forge.Card;
|
||||||
@@ -70,7 +74,8 @@ import forge.util.MyObservable;
|
|||||||
public class MagicStack extends MyObservable implements Iterable<SpellAbilityStackInstance> {
|
public class MagicStack extends MyObservable implements Iterable<SpellAbilityStackInstance> {
|
||||||
private final List<SpellAbility> simultaneousStackEntryList = new ArrayList<SpellAbility>();
|
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 final Stack<SpellAbilityStackInstance> frozenStack = new Stack<SpellAbilityStackInstance>();
|
||||||
|
|
||||||
private boolean frozen = false;
|
private boolean frozen = false;
|
||||||
@@ -119,7 +124,7 @@ public class MagicStack extends MyObservable implements Iterable<SpellAbilitySta
|
|||||||
* </p>
|
* </p>
|
||||||
*/
|
*/
|
||||||
public final void reset() {
|
public final void reset() {
|
||||||
this.getStack().clear();
|
this.clear();
|
||||||
this.simultaneousStackEntryList.clear();
|
this.simultaneousStackEntryList.clear();
|
||||||
this.frozen = false;
|
this.frozen = false;
|
||||||
this.lastTurnCast.clear();
|
this.lastTurnCast.clear();
|
||||||
@@ -137,7 +142,7 @@ public class MagicStack extends MyObservable implements Iterable<SpellAbilitySta
|
|||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
public final boolean isSplitSecondOnStack() {
|
public final boolean isSplitSecondOnStack() {
|
||||||
for(SpellAbilityStackInstance si : this.getStack()) {
|
for(SpellAbilityStackInstance si : this.stack) {
|
||||||
if (si.isSpell() && si.getSourceCard().hasKeyword("Split second")) {
|
if (si.isSpell() && si.getSourceCard().hasKeyword("Split second")) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -529,7 +534,7 @@ public class MagicStack extends MyObservable implements Iterable<SpellAbilitySta
|
|||||||
* @return a int.
|
* @return a int.
|
||||||
*/
|
*/
|
||||||
public final int size() {
|
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.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
public final boolean isEmpty() {
|
public final boolean isEmpty() {
|
||||||
return this.getStack().isEmpty();
|
return this.stack.isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Push should only be used by add.
|
// 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) {
|
private void push(final SpellAbility sp) {
|
||||||
if (null == sp.getActivatingPlayer()) {
|
if (null == sp.getActivatingPlayer()) {
|
||||||
sp.setActivatingPlayer(sp.getSourceCard().getController());
|
sp.setActivatingPlayer(sp.getSourceCard().getController());
|
||||||
@@ -560,9 +557,7 @@ public class MagicStack extends MyObservable implements Iterable<SpellAbilitySta
|
|||||||
|
|
||||||
final SpellAbilityStackInstance si = new SpellAbilityStackInstance(sp);
|
final SpellAbilityStackInstance si = new SpellAbilityStackInstance(sp);
|
||||||
|
|
||||||
synchronized (this.stack) {
|
this.stack.addFirst(si);
|
||||||
this.getStack().push(si);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 2012-07-21 the following comparison needs to move below the pushes but somehow screws up priority
|
// 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
|
// 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
|
// The SpellAbility isn't removed from the Stack until it finishes resolving
|
||||||
// temporarily reverted removing SAs after resolution
|
// temporarily reverted removing SAs after resolution
|
||||||
final SpellAbility sa = this.top();
|
final SpellAbility sa = this.peekAbility();
|
||||||
//final SpellAbility sa = this.pop();
|
//final SpellAbility sa = this.pop();
|
||||||
|
|
||||||
// ActivePlayer gains priority first after Resolve
|
// 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;
|
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>
|
* <p>
|
||||||
* peekAbility.
|
* peekAbility.
|
||||||
@@ -869,8 +842,7 @@ public class MagicStack extends MyObservable implements Iterable<SpellAbilitySta
|
|||||||
* @return a {@link forge.card.spellability.SpellAbility} object.
|
* @return a {@link forge.card.spellability.SpellAbility} object.
|
||||||
*/
|
*/
|
||||||
public final SpellAbility peekAbility() {
|
public final SpellAbility peekAbility() {
|
||||||
synchronized(this.stack) {
|
return this.stack.peekFirst().getSpellAbility();
|
||||||
return this.getStack().peek().getSpellAbility();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -902,10 +874,7 @@ public class MagicStack extends MyObservable implements Iterable<SpellAbilitySta
|
|||||||
* object.
|
* object.
|
||||||
*/
|
*/
|
||||||
public final void remove(final SpellAbilityStackInstance si) {
|
public final void remove(final SpellAbilityStackInstance si) {
|
||||||
synchronized (this.stack) {
|
this.stack.remove(si);
|
||||||
this.getStack().remove(si);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.getFrozenStack().remove(si);
|
this.getFrozenStack().remove(si);
|
||||||
this.updateObservers();
|
this.updateObservers();
|
||||||
}
|
}
|
||||||
@@ -922,7 +891,7 @@ public class MagicStack extends MyObservable implements Iterable<SpellAbilitySta
|
|||||||
*/
|
*/
|
||||||
public final SpellAbilityStackInstance getInstanceFromSpellAbility(final SpellAbility sa) {
|
public final SpellAbilityStackInstance getInstanceFromSpellAbility(final SpellAbility sa) {
|
||||||
// TODO: Confirm this works!
|
// TODO: Confirm this works!
|
||||||
for (final SpellAbilityStackInstance si : this.getStack()) {
|
for (final SpellAbilityStackInstance si : this.stack) {
|
||||||
if (si.compareToSpellAbility(sa)) {
|
if (si.compareToSpellAbility(sa)) {
|
||||||
return si;
|
return si;
|
||||||
}
|
}
|
||||||
@@ -1040,7 +1009,7 @@ public class MagicStack extends MyObservable implements Iterable<SpellAbilitySta
|
|||||||
* @return true, if successful
|
* @return true, if successful
|
||||||
*/
|
*/
|
||||||
public final boolean hasStateTrigger(final int triggerID) {
|
public final boolean hasStateTrigger(final int triggerID) {
|
||||||
for (final SpellAbilityStackInstance sasi : this.getStack()) {
|
for (final SpellAbilityStackInstance sasi : this.stack) {
|
||||||
if (sasi.isStateTrigger(triggerID)) {
|
if (sasi.isStateTrigger(triggerID)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -1064,17 +1033,6 @@ public class MagicStack extends MyObservable implements Iterable<SpellAbilitySta
|
|||||||
return this.simultaneousStackEntryList;
|
return this.simultaneousStackEntryList;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the stack.
|
|
||||||
*
|
|
||||||
* @return the stack
|
|
||||||
*/
|
|
||||||
public final Stack<SpellAbilityStackInstance> getStack() {
|
|
||||||
synchronized(this.stack) {
|
|
||||||
return this.stack;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the frozen stack.
|
* Gets the frozen stack.
|
||||||
*
|
*
|
||||||
@@ -1139,4 +1097,11 @@ public class MagicStack extends MyObservable implements Iterable<SpellAbilitySta
|
|||||||
// TODO Auto-generated method stub
|
// TODO Auto-generated method stub
|
||||||
return stack.iterator();
|
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.MouseAdapter;
|
||||||
import java.awt.event.MouseEvent;
|
import java.awt.event.MouseEvent;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import javax.swing.JCheckBoxMenuItem;
|
import javax.swing.JCheckBoxMenuItem;
|
||||||
@@ -197,11 +196,7 @@ public enum VStack implements IVDoc<CStack> {
|
|||||||
CMatchUI.SINGLETON_INSTANCE.setCard(spell.getSourceCard());
|
CMatchUI.SINGLETON_INSTANCE.setCard(spell.getSourceCard());
|
||||||
}
|
}
|
||||||
isFirst = false;
|
isFirst = false;
|
||||||
}
|
|
||||||
|
|
||||||
Collections.reverse(list);
|
|
||||||
|
|
||||||
for(JTextArea tar : list) {
|
|
||||||
parentCell.getBody().add(tar, "w 98%!");
|
parentCell.getBody().add(tar, "w 98%!");
|
||||||
stackTARs.add(tar);
|
stackTARs.add(tar);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user