diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index e8a485543e9..81e44e01124 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -124,7 +124,8 @@ public class Card extends GameEntity implements Comparable, IHasSVars { private final PlayerCollection mayLookFaceDownExile = new PlayerCollection(); private final PlayerCollection mayLookTemp = new PlayerCollection(); - private final Multimap cantHaveKeywords = MultimapBuilder.hashKeys().enumSetValues(Keyword.class).build(); + // don't use Enum Set Values or it causes a slow down + private final Multimap cantHaveKeywords = MultimapBuilder.hashKeys().hashSetValues().build(); private final Map counterTypeTimestamps = Maps.newHashMap(); diff --git a/forge-game/src/main/java/forge/game/keyword/KeywordCollection.java b/forge-game/src/main/java/forge/game/keyword/KeywordCollection.java index de9f14c2ecf..56a10e903c1 100644 --- a/forge-game/src/main/java/forge/game/keyword/KeywordCollection.java +++ b/forge-game/src/main/java/forge/game/keyword/KeywordCollection.java @@ -1,22 +1,22 @@ package forge.game.keyword; -import java.io.Serializable; - import java.util.Collection; import java.util.Iterator; +import java.util.List; +import com.google.common.collect.Lists; import com.google.common.collect.Multimap; import com.google.common.collect.MultimapBuilder; import forge.game.card.Card; -public class KeywordCollection implements Iterable, Serializable { - private static final long serialVersionUID = -2882986558147844702L; +public class KeywordCollection implements Iterable { private boolean hidden = false; private transient KeywordCollectionView view; - private final Multimap map = MultimapBuilder.enumKeys(Keyword.class) + // don't use enumKeys it causes a slow down + private final Multimap map = MultimapBuilder.hashKeys() .arrayListValues().build(); public KeywordCollection() { @@ -157,35 +157,20 @@ public class KeywordCollection implements Iterable, Serializable { return map.get(keyword); } + public List asStringList() { + List result = Lists.newArrayList(); + for (KeywordInterface kw : getValues()) { + result.add(kw.getOriginal()); + } + return result; + } + public void setHostCard(final Card host) { for (KeywordInterface k : map.values()) { k.setHostCard(host); } } - @Override - public Iterator iterator() { - return new Iterator() { - private final Iterator iterator = map.values().iterator(); - - @Override - public boolean hasNext() { - return iterator.hasNext(); - } - - @Override - public String next() { - KeywordInterface entry = iterator.next(); - return entry.getOriginal(); - } - - @Override - public void remove() { - //Don't support this - } - }; - } - /* (non-Javadoc) * @see java.lang.Object#toString() */ @@ -204,8 +189,7 @@ public class KeywordCollection implements Iterable, Serializable { return view; } - public class KeywordCollectionView implements Iterable, Serializable { - private static final long serialVersionUID = 7536969077044188264L; + public class KeywordCollectionView implements Iterable { protected KeywordCollectionView() { } @@ -229,9 +213,18 @@ public class KeywordCollection implements Iterable, Serializable { return KeywordCollection.this.contains(keyword); } + public List asStringList() { + return KeywordCollection.this.asStringList(); + } + @Override - public Iterator iterator() { + public Iterator iterator() { return KeywordCollection.this.iterator(); } } + + @Override + public Iterator iterator() { + return this.map.values().iterator(); + } } diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index e24173bef9e..3cf09db7d1f 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -1236,7 +1236,8 @@ public class Player extends GameEntity implements Comparable { public boolean hasProtectionFrom(final Card source, final boolean checkSBA, final boolean damageSource) { final boolean colorlessDamage = damageSource && source.hasKeyword("Colorless Damage Source"); - for (String kw : keywords) { + for (KeywordInterface ki : keywords) { + String kw = ki.getOriginal(); if (kw.startsWith("Protection")) { if (kw.startsWith("Protection:")) { // uses isValid final String characteristic = kw.split(":")[1]; @@ -3226,7 +3227,7 @@ public class Player extends GameEntity implements Comparable { keywordEffect.updateAbilityTextForView(); boolean headerAdded = false; StringBuilder kw = new StringBuilder(); - for(String k : keywords) { + for(KeywordInterface k : keywords) { if(!headerAdded) { headerAdded = true; kw.append(this.getName()).append(" has: \n"); diff --git a/forge-game/src/main/java/forge/game/player/PlayerView.java b/forge-game/src/main/java/forge/game/player/PlayerView.java index 311177cdc3e..19e6e1cb6fd 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerView.java +++ b/forge-game/src/main/java/forge/game/player/PlayerView.java @@ -311,7 +311,7 @@ public class PlayerView extends GameEntityView { return getKeywords().contains(keyword); } void updateKeywords(Player p) { - set(TrackableProperty.Keywords, ImmutableMultiset.copyOf(p.getKeywords())); + set(TrackableProperty.Keywords, ImmutableMultiset.copyOf(p.getKeywords().asStringList())); } public List getCommanders() {