From d800e06fa504f2b3f40f938c9f3cc8af7a80a0ba Mon Sep 17 00:00:00 2001 From: Hanmac Date: Fri, 9 Dec 2016 22:11:21 +0000 Subject: [PATCH] CardFactory: remove everything about unparsedAbilities its not needed anymore --- .../main/java/forge/ai/ability/TokenAi.java | 3 +- .../main/java/forge/game/GameActionUtil.java | 4 +- .../forge/game/ability/AbilityFactory.java | 12 ++- .../game/ability/effects/CloneEffect.java | 1 - .../game/ability/effects/TokenEffect.java | 2 - .../src/main/java/forge/game/card/Card.java | 16 +--- .../java/forge/game/card/CardFactory.java | 17 +++- .../java/forge/game/card/CardFactoryUtil.java | 91 +++++++++---------- .../main/java/forge/game/card/CardState.java | 49 +++++----- 9 files changed, 93 insertions(+), 102 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/TokenAi.java b/forge-ai/src/main/java/forge/ai/ability/TokenAi.java index e1540ee3039..764c83ef4d7 100644 --- a/forge-ai/src/main/java/forge/ai/ability/TokenAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/TokenAi.java @@ -6,6 +6,7 @@ import java.util.List; import com.google.common.base.Predicate; import com.google.common.collect.Iterables; + import forge.ai.ComputerUtil; import forge.ai.ComputerUtilCard; import forge.ai.ComputerUtilMana; @@ -456,8 +457,6 @@ public class TokenAi extends SpellAbilityAi { final String actualAbility = host.getSVar(s); final SpellAbility grantedAbility = AbilityFactory.getAbility(actualAbility, c); c.addSpellAbility(grantedAbility); - // added ability to intrinsic list so copies and clones work - c.getCurrentState().addUnparsedAbility(actualAbility); } } diff --git a/forge-game/src/main/java/forge/game/GameActionUtil.java b/forge-game/src/main/java/forge/game/GameActionUtil.java index 4e21d7d9a06..7d54ffaaef6 100644 --- a/forge-game/src/main/java/forge/game/GameActionUtil.java +++ b/forge-game/src/main/java/forge/game/GameActionUtil.java @@ -20,6 +20,7 @@ package forge.game; import com.google.common.base.Predicates; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; +import com.google.common.collect.Maps; import forge.card.MagicColor; import forge.game.ability.AbilityFactory; @@ -369,7 +370,8 @@ public final class GameActionUtil { if (spliceKwCost == null) continue; - Map params = AbilityFactory.getMapParams(c.getCurrentState().getFirstUnparsedAbility()); + SpellAbility firstSpell = c.getCurrentState().getFirstAbility(); + Map params = Maps.newHashMap(firstSpell.getMapParams()); AbilityRecordType rc = AbilityRecordType.getRecordType(params); ApiType api = rc.getApiTypeOf(params); AbilitySub subAbility = (AbilitySub) AbilityFactory.getAbility(AbilityRecordType.SubAbility, api, params, null, c, null); diff --git a/forge-game/src/main/java/forge/game/ability/AbilityFactory.java b/forge-game/src/main/java/forge/game/ability/AbilityFactory.java index ed58ed86a07..ead60cb1918 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityFactory.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityFactory.java @@ -30,6 +30,7 @@ import java.util.Map; import com.google.common.base.Function; import com.google.common.collect.Lists; +import com.google.common.collect.Maps; /** *

@@ -440,16 +441,17 @@ public final class AbilityFactory { if(!card.isSplitCard()) throw new IllegalStateException("Fuse ability may be built only on split cards"); - final String strLeftAbility = card.getState(CardStateName.LeftSplit).getFirstUnparsedAbility(); - Map leftMap = getMapParams(strLeftAbility); + SpellAbility leftAbility = card.getState(CardStateName.LeftSplit).getFirstAbility(); + Map leftMap = Maps.newHashMap(leftAbility.getMapParams()); AbilityRecordType leftType = AbilityRecordType.getRecordType(leftMap); ApiType leftApi = leftType.getApiTypeOf(leftMap); leftMap.put("StackDecription", leftMap.get("SpellDescription")); leftMap.put("SpellDescription", "Fuse (you may cast both halves of this card from your hand)."); leftMap.put("ActivationZone", "Hand"); - - final String strRightAbility = card.getState(CardStateName.RightSplit).getFirstUnparsedAbility(); - Map rightMap = getMapParams(strRightAbility); + + SpellAbility rightAbility = card.getState(CardStateName.RightSplit).getFirstAbility(); + Map rightMap = Maps.newHashMap(rightAbility.getMapParams()); + AbilityRecordType rightType = AbilityRecordType.getRecordType(leftMap); ApiType rightApi = leftType.getApiTypeOf(rightMap); rightMap.put("StackDecription", rightMap.get("SpellDescription")); diff --git a/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java index c36052e5138..00a409d76f3 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java @@ -255,7 +255,6 @@ public class CloneEffect extends SpellAbilityEffect { final String actualAbility = origSVars.get(s); final SpellAbility grantedAbility = AbilityFactory.getAbility(actualAbility, tgtCard); tgtCard.addSpellAbility(grantedAbility); - tgtCard.getCurrentState().addUnparsedAbility(actualAbility); } } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java b/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java index df607c2dd63..e4d75cb56bb 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java @@ -292,8 +292,6 @@ public class TokenEffect extends SpellAbilityEffect { for (final Card c : tokens) { final SpellAbility grantedAbility = AbilityFactory.getAbility(actualAbility, c); c.addSpellAbility(grantedAbility); - // added ability to intrinsic list so copies and clones work - c.getCurrentState().addUnparsedAbility(actualAbility); } } } 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 85b2d374067..09970996e15 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -2043,9 +2043,11 @@ public class Card extends GameEntity implements Comparable { public final FCollectionView getNonManaAbilities() { return currentState.getNonManaAbilities(); } - public final Iterable getUnparsedAbilities() { - return currentState.getUnparsedAbilities(); + + public final FCollectionView getIntrinsicSpellAbilities() { + return currentState.getIntrinsicSpellAbilities(); } + public final FCollectionView getAllSpellAbilities() { final FCollection res = new FCollection<>(); for (final CardStateName key : states.keySet()) { @@ -3276,20 +3278,12 @@ public class Card extends GameEntity implements Comparable { originalSVars.clear(); } - public final void setIntrinsicAbilities(final List a) { - currentState.setUnparsedAbilities(new ArrayList<>(a)); - } - public final void addIntrinsicKeyword(final String s) { if (currentState.addIntrinsicKeyword(s)) { currentState.getView().updateKeywords(this, currentState); } } - public final void addIntrinsicAbility(final String s) { - currentState.addIntrinsicAbility(s); - } - public final void removeIntrinsicKeyword(final String s) { if (currentState.removeIntrinsicKeyword(s)) { currentState.getView().updateKeywords(this, currentState); @@ -3300,7 +3294,7 @@ public class Card extends GameEntity implements Comparable { return extrinsicKeyword; } public final void setExtrinsicKeyword(final List a) { - extrinsicKeyword = new ArrayList<>(a); + extrinsicKeyword = Lists.newArrayList(a); } public void addExtrinsicKeyword(final String s) { diff --git a/forge-game/src/main/java/forge/game/card/CardFactory.java b/forge-game/src/main/java/forge/game/card/CardFactory.java index 2468f0ee26e..405ca844bc9 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactory.java +++ b/forge-game/src/main/java/forge/game/card/CardFactory.java @@ -91,7 +91,11 @@ public class CardFactory { out = CardFactory.copyStats(in, in.getController()); out.setToken(true); - CardFactoryUtil.addAbilityFactoryAbilities(out); + // add abilities + for (SpellAbility sa : in.getIntrinsicSpellAbilities()) { + out.addSpellAbility(sa); + } + for (String s : out.getStaticAbilityStrings()) { out.addStaticAbility(s); } @@ -313,7 +317,7 @@ public class CardFactory { continue; // Ignore FaceDown for DFC since they have none. } card.setState(state, false); - CardFactoryUtil.addAbilityFactoryAbilities(card); + for (String stAb : card.getStaticAbilityStrings()) { final StaticAbility s = card.addStaticAbility(stAb); s.setIntrinsic(true); @@ -441,13 +445,15 @@ public class CardFactory { } private static void readCardFace(Card c, ICardFace face) { - for (String a : face.getAbilities()) c.addIntrinsicAbility(a); + for (String k : face.getKeywords()) c.addIntrinsicKeyword(k); for (String r : face.getReplacements()) c.addReplacementEffect(ReplacementHandler.parseReplacement(r, c, true)); for (String s : face.getStaticAbilities()) c.addStaticAbilityString(s); for (String t : face.getTriggers()) c.addTrigger(TriggerHandler.parseTrigger(t, c, true)); for (Entry v : face.getVariables()) c.setSVar(v.getKey(), v.getValue()); + CardFactoryUtil.addAbilityFactoryAbilities(c, face.getAbilities()); + c.setName(face.getName()); c.setManaCost(face.getManaCost()); c.setText(face.getNonAbilityText()); @@ -636,7 +642,10 @@ public class CardFactory { to.setTriggers(fromCharacteristics.getTriggers(), true); to.setReplacementEffects(fromCharacteristics.getReplacementEffects()); // add abilities - CardFactoryUtil.addAbilityFactoryAbilities(to); + for (SpellAbility sa : fromCharacteristics.getIntrinsicSpellAbilities()) { + to.addSpellAbility(sa); + } + for (String staticAbility : to.getStaticAbilityStrings()) { to.addStaticAbility(staticAbility); } diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index c090342048f..ff1bb8af41b 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -2010,10 +2010,10 @@ public class CardFactoryUtil { * @param card * the card */ - public static final void addAbilityFactoryAbilities(final Card card) { + public static final void addAbilityFactoryAbilities(final Card card, final Iterable abilities) { // ************************************************** // AbilityFactory cards - for (String rawAbility : card.getUnparsedAbilities()) { + for (String rawAbility : abilities) { final SpellAbility intrinsicAbility = AbilityFactory.getAbility(rawAbility, card); card.addSpellAbility(intrinsicAbility); intrinsicAbility.setIntrinsic(true); @@ -2102,8 +2102,6 @@ public class CardFactoryUtil { " could cast a sorcery.)"; card.addSpellAbility(AbilityFactory.getAbility(effect, card)); - // add ability to instrinic strings so copies/clones create the ability also - card.getCurrentState().addUnparsedAbility(effect); } else if (keyword.startsWith("Cycling")) { addSpellAbility(keyword, card, null); @@ -2431,8 +2429,6 @@ public class CardFactoryUtil { // instantiate attach ability final SpellAbility sa = AbilityFactory.getAbility(abilityStr.toString(), card); card.addSpellAbility(sa); - // add ability to instrinic strings so copies/clones create the ability also - card.getCurrentState().addUnparsedAbility(abilityStr.toString()); } else if (keyword.startsWith("Outlast")) { addSpellAbility(keyword, card, null); @@ -2467,8 +2463,6 @@ public class CardFactoryUtil { // instantiate attach ability final SpellAbility sa = AbilityFactory.getAbility(abilityStr.toString(), card); card.addSpellAbility(sa); - // add ability to intrinsic strings so copies/clones create the ability also - card.getCurrentState().addUnparsedAbility(abilityStr.toString()); } else if (keyword.startsWith("Bestow")) { addSpellAbility(keyword, card, null); @@ -3462,10 +3456,10 @@ public class CardFactoryUtil { newSA.getMapParams().put("Secondary", "True"); newSA.setPayCosts(cost); newSA.setDescription(sa.getDescription() + " (by paying " + cost.toSimpleString() + " instead of its mana cost)"); + newSA.setIntrinsic(intrinsic); if (!intrinsic) { newSA.setTemporary(true); - newSA.setIntrinsic(false); kws.addSpellAbility(newSA); } card.addSpellAbility(newSA); @@ -3491,7 +3485,13 @@ public class CardFactoryUtil { awakenSpell.setDescription(desc); awakenSpell.setBasicSpell(false); awakenSpell.setPayCosts(awakenCost); + awakenSpell.setIntrinsic(intrinsic); + if (!intrinsic) { + awakenSpell.setTemporary(true); + //sa.setOriginalHost(hostCard); + kws.addSpellAbility(awakenSpell); + } card.addSpellAbility(awakenSpell); } else if (keyword.startsWith("Bestow")) { final String[] params = keyword.split(":"); @@ -3508,14 +3508,12 @@ public class CardFactoryUtil { " (" + Keyword.getInstance(keyword).getReminderText() + ")"); sa.setStackDescription("Bestow - " + card.getName()); sa.setBasicSpell(false); + sa.setIntrinsic(intrinsic); + if (!intrinsic) { sa.setTemporary(true); - sa.setIntrinsic(false); //sa.setOriginalHost(hostCard); kws.addSpellAbility(sa); - } else { - // add ability to instrinic strings so copies/clones create the ability also - card.getCurrentState().addUnparsedAbility(sbAttach.toString()); } card.addSpellAbility(sa); } else if (keyword.startsWith("Dash")) { @@ -3537,10 +3535,10 @@ public class CardFactoryUtil { newSA.setDescription(desc); newSA.setBasicSpell(false); newSA.setDash(true); + newSA.setIntrinsic(intrinsic); if (!intrinsic) { newSA.setTemporary(true); - newSA.setIntrinsic(false); kws.addSpellAbility(newSA); } card.addSpellAbility(newSA); @@ -3558,9 +3556,10 @@ public class CardFactoryUtil { newSA.setIsEmerge(true); newSA.setPayCosts(new Cost(costStr, false)); newSA.setDescription(sa.getDescription() + " (Emerge)"); + newSA.setIntrinsic(intrinsic); + if (!intrinsic) { newSA.setTemporary(true); - newSA.setIntrinsic(false); kws.addSpellAbility(newSA); } card.addSpellAbility(newSA); @@ -3576,9 +3575,10 @@ public class CardFactoryUtil { newSA.addOptionalCost(OptionalCost.Entwine); newSA.setDescription(sa.getDescription() + " (Entwine)"); newSA.setStackDescription(""); // Empty StackDescription to rebuild it. + newSA.setIntrinsic(intrinsic); + if (!intrinsic) { newSA.setTemporary(true); - newSA.setIntrinsic(false); kws.addSpellAbility(newSA); } card.addSpellAbility(newSA); @@ -3619,10 +3619,10 @@ public class CardFactoryUtil { newSA.setBasicSpell(false); newSA.setPayCosts(evokedCost); newSA.setEvoke(true); + newSA.setIntrinsic(intrinsic); if (!intrinsic) { newSA.setTemporary(true); - newSA.setIntrinsic(false); kws.addSpellAbility(newSA); } @@ -3638,6 +3638,7 @@ public class CardFactoryUtil { final SpellAbility sa = AbilityFactory.getAbility(abString, card); sa.setPayCosts(new Cost(card.getManaCost(), false)); + sa.setIntrinsic(intrinsic); card.addSpellAbility(sa); } } else if (keyword.startsWith("Monstrosity")) { @@ -3657,9 +3658,10 @@ public class CardFactoryUtil { } final SpellAbility sa = AbilityFactory.getAbility(effect, card); + sa.setIntrinsic(intrinsic); + if (!intrinsic) { sa.setTemporary(true); - sa.setIntrinsic(false); // sa.setOriginalHost(hostCard); kws.addSpellAbility(sa); } @@ -3676,14 +3678,12 @@ public class CardFactoryUtil { " SpellDescription$ (" + Keyword.getInstance(keyword).getReminderText() + ")"; final SpellAbility sa = AbilityFactory.getAbility(effect, card); + sa.setIntrinsic(intrinsic); + if (!intrinsic) { sa.setTemporary(true); - sa.setIntrinsic(false); //sa.setOriginalHost(hostCard); kws.addSpellAbility(sa); - } else { - // add ability to instrinic strings so copies/clones create the ability also - card.getCurrentState().addUnparsedAbility(effect); } card.addSpellAbility(sa); } else if (keyword.startsWith("Outlast")) { @@ -3705,14 +3705,12 @@ public class CardFactoryUtil { abilityStr.append("| SpellDescription$ (" + Keyword.getInstance(keyword).getReminderText() + ")"); final SpellAbility sa = AbilityFactory.getAbility(abilityStr.toString(), card); + sa.setIntrinsic(intrinsic); + if (!intrinsic) { sa.setTemporary(true); - sa.setIntrinsic(false); //sa.setOriginalHost(hostCard); kws.addSpellAbility(sa); - } else { - // add ability to instrinic strings so copies/clones create the ability also - card.getCurrentState().addUnparsedAbility(abilityStr.toString()); } card.addSpellAbility(sa); } else if (keyword.startsWith("Scavenge")) { @@ -3728,14 +3726,12 @@ public class CardFactoryUtil { card.setSVar("ScavengeX", "Count$CardPower"); final SpellAbility sa = AbilityFactory.getAbility(effect, card); + sa.setIntrinsic(intrinsic); + if (!intrinsic) { sa.setTemporary(true); - sa.setIntrinsic(false); //sa.setOriginalHost(hostCard); kws.addSpellAbility(sa); - } else { - // add ability to instrinic strings so copies/clones create the ability also - card.getCurrentState().addUnparsedAbility(effect); } card.addSpellAbility(sa); } else if (keyword.startsWith("Surge")) { @@ -3751,9 +3747,11 @@ public class CardFactoryUtil { String desc = "Surge " + surgeCost.toSimpleString() + " (" + Keyword.getInstance(keyword).getReminderText() + ")"; newSA.setDescription(desc); + + newSA.setIntrinsic(intrinsic); + if (!intrinsic) { newSA.setTemporary(true); - newSA.setIntrinsic(false); // sa.setOriginalHost(hostCard); kws.addSpellAbility(newSA); } @@ -3769,9 +3767,10 @@ public class CardFactoryUtil { + Keyword.getInstance(keyword).getReminderText() + ")"; final SpellAbility sa = AbilityFactory.getAbility(effect, card); + sa.setIntrinsic(intrinsic); + if (!intrinsic) { sa.setTemporary(true); - sa.setIntrinsic(false); //sa.setOriginalHost(hostCard); kws.addSpellAbility(sa); } @@ -3789,14 +3788,12 @@ public class CardFactoryUtil { " (" + Keyword.getInstance(keyword).getReminderText() + ")"; final SpellAbility sa = AbilityFactory.getAbility(effect, card); + sa.setIntrinsic(intrinsic); + if (!intrinsic) { sa.setTemporary(true); - sa.setIntrinsic(false); //sa.setOriginalHost(hostCard); kws.addSpellAbility(sa); - } else { - // add ability to instrinic strings so copies/clones create the ability also - card.getCurrentState().addUnparsedAbility(effect); } card.addSpellAbility(sa); } else if (keyword.endsWith(" offering")) { @@ -3814,9 +3811,10 @@ public class CardFactoryUtil { newSA.setIsOffering(true); newSA.setPayCosts(sa.getPayCosts()); newSA.setDescription(sa.getDescription() + " (" + offeringType + " offering)"); + newSA.setIntrinsic(intrinsic); + if (!intrinsic) { newSA.setTemporary(true); - newSA.setIntrinsic(false); kws.addSpellAbility(newSA); } card.addSpellAbility(newSA); @@ -3832,14 +3830,12 @@ public class CardFactoryUtil { "KeepSubtypes$ True | SpellDescription$ CARDNAME becomes an artifact creature until end of turn.)"; final SpellAbility sa = AbilityFactory.getAbility(effect, card); + sa.setIntrinsic(intrinsic); + if (!intrinsic) { sa.setTemporary(true); - sa.setIntrinsic(false); //sa.setOriginalHost(hostCard); kws.addSpellAbility(sa); - } else { - // add ability to instrinic strings so copies/clones create the ability also - card.getCurrentState().addUnparsedAbility(effect); } card.addSpellAbility(sa); } else if (keyword.startsWith("Cycling")) { @@ -3854,15 +3850,12 @@ public class CardFactoryUtil { SpellAbility sa = AbilityFactory.getAbility(sb.toString(), card); sa.setIsCycling(true); + sa.setIntrinsic(intrinsic); if (!intrinsic) { sa.setTemporary(true); - sa.setIntrinsic(false); //sa.setOriginalHost(hostCard); kws.addSpellAbility(sa); - } else { - // add ability to instrinic strings so copies/clones create the ability also - card.getCurrentState().addUnparsedAbility(sb.toString()); } card.addSpellAbility(sa); } else if (keyword.startsWith("TypeCycling")) { @@ -3886,15 +3879,12 @@ public class CardFactoryUtil { SpellAbility sa = AbilityFactory.getAbility(sb.toString(), card); sa.setIsCycling(true); + sa.setIntrinsic(intrinsic); if (!intrinsic) { sa.setTemporary(true); - sa.setIntrinsic(false); //sa.setOriginalHost(hostCard); kws.addSpellAbility(sa); - } else { - // add ability to instrinic strings so copies/clones create the ability also - card.getCurrentState().addUnparsedAbility(sb.toString()); } card.addSpellAbility(sa); } else if (keyword.equals("Retrace")) { @@ -3908,10 +3898,11 @@ public class CardFactoryUtil { final Cost cost = new Cost("Discard<1/Land>", false).add(sa.getPayCosts()); newSA.setPayCosts(cost); + newSA.setIntrinsic(intrinsic); + //newSA.setDescription(sa.getDescription() + " (Retrace)"); if (!intrinsic) { newSA.setTemporary(true); - newSA.setIntrinsic(false); kws.addSpellAbility(newSA); } card.addSpellAbility(newSA); diff --git a/forge-game/src/main/java/forge/game/card/CardState.java b/forge-game/src/main/java/forge/game/card/CardState.java index 268c898a7b5..d1a4b1a3113 100644 --- a/forge-game/src/main/java/forge/game/card/CardState.java +++ b/forge-game/src/main/java/forge/game/card/CardState.java @@ -17,14 +17,15 @@ */ package forge.game.card; -import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.TreeMap; import org.apache.commons.lang3.StringUtils; +import com.google.common.base.Predicate; import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; import forge.card.CardEdition; import forge.card.CardRarity; @@ -48,16 +49,15 @@ public class CardState { private byte color = MagicColor.COLORLESS; private int basePower = 0; private int baseToughness = 0; - private List intrinsicKeywords = new ArrayList(); + private List intrinsicKeywords = Lists.newArrayList(); private final FCollection nonManaAbilities = new FCollection(); private final FCollection manaAbilities = new FCollection(); - private List unparsedAbilities = new ArrayList(); private FCollection triggers = new FCollection(); private FCollection replacementEffects = new FCollection(); private FCollection staticAbilities = new FCollection(); - private List staticAbilityStrings = new ArrayList(); + private List staticAbilityStrings = Lists.newArrayList(); private String imageKey = ""; - private Map sVars = new TreeMap(); + private Map sVars = Maps.newTreeMap(); private CardRarity rarity = CardRarity.Unknown; private String setCode = CardEdition.UNKNOWN.getCode(); @@ -170,10 +170,6 @@ public class CardState { return changed; } - public final boolean addIntrinsicAbility(final String s) { - return s.trim().length() != 0 && unparsedAbilities.add(s); - } - public final boolean removeIntrinsicKeyword(final String s) { return intrinsicKeywords.remove(s); } @@ -195,6 +191,16 @@ public class CardState { public final FCollectionView getNonManaAbilities() { return nonManaAbilities; } + + public final FCollectionView getIntrinsicSpellAbilities() { + return new FCollection(Iterables.filter(getSpellAbilities(), new Predicate() { + @Override + public boolean apply(SpellAbility input) { + return input.isIntrinsic(); + } + })); + } + public final void setNonManaAbilities(SpellAbility sa) { nonManaAbilities.clear(); if (sa != null) { @@ -243,17 +249,8 @@ public class CardState { } } - public final Iterable getUnparsedAbilities() { - return unparsedAbilities; - } - public final String getFirstUnparsedAbility() { - return Iterables.getFirst(unparsedAbilities, null); - } - public final boolean addUnparsedAbility(String a) { - return unparsedAbilities.add(a); - } - public final void setUnparsedAbilities(final List list) { - unparsedAbilities = list; + public final SpellAbility getFirstAbility() { + return Iterables.getFirst(getIntrinsicSpellAbilities(), null); } public final FCollectionView getTriggers() { @@ -335,7 +332,8 @@ public class CardState { view.updateFoilIndex(this); } public final void setSVars(final Map newSVars) { - sVars = newSVars; + sVars = Maps.newTreeMap(); + sVars.putAll(newSVars); view.updateFoilIndex(this); } @@ -355,13 +353,12 @@ public class CardState { setColor(source.getColor()); setBasePower(source.getBasePower()); setBaseToughness(source.getBaseToughness()); - intrinsicKeywords = new ArrayList(source.intrinsicKeywords); - unparsedAbilities = new ArrayList(source.unparsedAbilities); - staticAbilityStrings = new ArrayList(source.staticAbilityStrings); + intrinsicKeywords = Lists.newArrayList(source.intrinsicKeywords); + staticAbilityStrings = Lists.newArrayList(source.staticAbilityStrings); setImageKey(source.getImageKey()); setRarity(source.rarity); setSetCode(source.setCode); - setSVars(new TreeMap(source.getSVars())); + setSVars(source.getSVars()); replacementEffects = new FCollection(); for (ReplacementEffect RE : source.getReplacementEffects()) { replacementEffects.add(RE.getCopy());