diff --git a/src/main/java/forge/Card.java b/src/main/java/forge/Card.java index 26b3689d70e..dcc9aaa62ea 100644 --- a/src/main/java/forge/Card.java +++ b/src/main/java/forge/Card.java @@ -4,6 +4,7 @@ package forge; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; @@ -3174,8 +3175,12 @@ public class Card extends MyObservable implements Comparable { if (!changedCardTypes.isEmpty()) { ArrayList newType = new ArrayList(type); - ArrayList types = sortByTimestamp(changedCardTypes); - + ArrayList types = changedCardTypes; + //TODO: Any reason why changedCardTypes can't be sorted in place + // Does changedCardTypes ever get out of increasing time + // stamp order? + Collections.sort(types); // sorts types by timeStamp + for (Card_Type ct : types) { ArrayList removeTypes = new ArrayList(); //remove old types @@ -3203,21 +3208,7 @@ public class Card extends MyObservable implements Comparable { return new ArrayList(type); } - private ArrayList sortByTimestamp(ArrayList cardTypes) { - ArrayList remainingCardTypes = cardTypes; - ArrayList types = new ArrayList(); - for(int i = 0; i < cardTypes.size(); i++) { - Card_Type nextCT = remainingCardTypes.get(i); - long nextLowest = nextCT.getTimestamp(); - for(Card_Type ct : remainingCardTypes) { - if (nextLowest > ct.getTimestamp()) - nextCT = ct; - } - types.add(nextCT); - } - return types; - } - + public void addChangedCardTypes(ArrayList types, boolean removeSuperTypes, boolean removeCardTypes, boolean removeSubTypes, boolean removeCreatureTypes, long timestamp) { diff --git a/src/main/java/forge/Card_Type.java b/src/main/java/forge/Card_Type.java index 5093ba9c4d7..42e53afaffc 100644 --- a/src/main/java/forge/Card_Type.java +++ b/src/main/java/forge/Card_Type.java @@ -2,13 +2,14 @@ package forge; import java.util.ArrayList; + /** *

Card_Color class.

* * @author Forge * @version $Id$ */ -public class Card_Type { +public class Card_Type implements Comparable { // takes care of individual card types private ArrayList type = new ArrayList(); private boolean removeSuperTypes; @@ -43,24 +44,36 @@ public class Card_Type { removeCreatureTypes = removeCreatureType; timeStamp = stamp; } - + public ArrayList getType() { return type; } - + public boolean isRemoveSuperTypes() { return removeSuperTypes; } - + public boolean isRemoveCardTypes() { return removeCardTypes; } - + public boolean isRemoveSubTypes() { return removeSubTypes; } - + public boolean isRemoveCreatureTypes() { return removeCreatureTypes; } + + @Override + public int compareTo(final Card_Type anotherCardType) { + int returnValue = 0; + long anotherTimeStamp = anotherCardType.getTimestamp(); + if (this.timeStamp < anotherTimeStamp) + returnValue = -1; + else if (this.timeStamp > anotherTimeStamp) + returnValue = 1; + return returnValue; + } + } diff --git a/src/main/java/forge/card/abilityFactory/AbilityFactory_Animate.java b/src/main/java/forge/card/abilityFactory/AbilityFactory_Animate.java index d56b26e0b01..003e7279b10 100644 --- a/src/main/java/forge/card/abilityFactory/AbilityFactory_Animate.java +++ b/src/main/java/forge/card/abilityFactory/AbilityFactory_Animate.java @@ -355,8 +355,8 @@ public class AbilityFactory_Animate { if (params.containsKey("Toughness")) toughness = AbilityFactory.calculateAmount(host, params.get("Toughness"), sa); - if (power != -1 || toughness != -1) - timest = AllZone.getNextTimestamp(); + // Every Animate event needs a unique time stamp + timest = AllZone.getNextTimestamp(); final long timestamp = timest; @@ -784,10 +784,10 @@ public class AbilityFactory_Animate { int toughness = -1; if (params.containsKey("Toughness")) toughness = AbilityFactory.calculateAmount(host, params.get("Toughness"), sa); - - if (power != -1 || toughness != -1) - timest = AllZone.getNextTimestamp(); - + + // Every Animate event needs a unique time stamp + timest = AllZone.getNextTimestamp(); + final long timestamp = timest; boolean permanent = params.containsKey("Permanent") ? true : false;