CardFactory: remove everything about unparsedAbilities its not needed anymore

This commit is contained in:
Hanmac
2016-12-09 22:11:21 +00:00
parent cd55be1c6d
commit d800e06fa5
9 changed files with 93 additions and 102 deletions

View File

@@ -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);
}
}

View File

@@ -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<String, String> params = AbilityFactory.getMapParams(c.getCurrentState().getFirstUnparsedAbility());
SpellAbility firstSpell = c.getCurrentState().getFirstAbility();
Map<String, String> 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);

View File

@@ -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;
/**
* <p>
@@ -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<String, String> leftMap = getMapParams(strLeftAbility);
SpellAbility leftAbility = card.getState(CardStateName.LeftSplit).getFirstAbility();
Map<String, String> 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<String, String> rightMap = getMapParams(strRightAbility);
SpellAbility rightAbility = card.getState(CardStateName.RightSplit).getFirstAbility();
Map<String, String> rightMap = Maps.newHashMap(rightAbility.getMapParams());
AbilityRecordType rightType = AbilityRecordType.getRecordType(leftMap);
ApiType rightApi = leftType.getApiTypeOf(rightMap);
rightMap.put("StackDecription", rightMap.get("SpellDescription"));

View File

@@ -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);
}
}
}

View File

@@ -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);
}
}
}

View File

@@ -2043,9 +2043,11 @@ public class Card extends GameEntity implements Comparable<Card> {
public final FCollectionView<SpellAbility> getNonManaAbilities() {
return currentState.getNonManaAbilities();
}
public final Iterable<String> getUnparsedAbilities() {
return currentState.getUnparsedAbilities();
public final FCollectionView<SpellAbility> getIntrinsicSpellAbilities() {
return currentState.getIntrinsicSpellAbilities();
}
public final FCollectionView<SpellAbility> getAllSpellAbilities() {
final FCollection<SpellAbility> res = new FCollection<>();
for (final CardStateName key : states.keySet()) {
@@ -3276,20 +3278,12 @@ public class Card extends GameEntity implements Comparable<Card> {
originalSVars.clear();
}
public final void setIntrinsicAbilities(final List<String> 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<Card> {
return extrinsicKeyword;
}
public final void setExtrinsicKeyword(final List<String> a) {
extrinsicKeyword = new ArrayList<>(a);
extrinsicKeyword = Lists.newArrayList(a);
}
public void addExtrinsicKeyword(final String s) {

View File

@@ -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<String, String> 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);
}

View File

@@ -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<String> 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);

View File

@@ -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<String> intrinsicKeywords = new ArrayList<String>();
private List<String> intrinsicKeywords = Lists.newArrayList();
private final FCollection<SpellAbility> nonManaAbilities = new FCollection<SpellAbility>();
private final FCollection<SpellAbility> manaAbilities = new FCollection<SpellAbility>();
private List<String> unparsedAbilities = new ArrayList<String>();
private FCollection<Trigger> triggers = new FCollection<Trigger>();
private FCollection<ReplacementEffect> replacementEffects = new FCollection<ReplacementEffect>();
private FCollection<StaticAbility> staticAbilities = new FCollection<StaticAbility>();
private List<String> staticAbilityStrings = new ArrayList<String>();
private List<String> staticAbilityStrings = Lists.newArrayList();
private String imageKey = "";
private Map<String, String> sVars = new TreeMap<String, String>();
private Map<String, String> 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<SpellAbility> getNonManaAbilities() {
return nonManaAbilities;
}
public final FCollectionView<SpellAbility> getIntrinsicSpellAbilities() {
return new FCollection<SpellAbility>(Iterables.filter(getSpellAbilities(), new Predicate<SpellAbility>() {
@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<String> 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<String> list) {
unparsedAbilities = list;
public final SpellAbility getFirstAbility() {
return Iterables.getFirst(getIntrinsicSpellAbilities(), null);
}
public final FCollectionView<Trigger> getTriggers() {
@@ -335,7 +332,8 @@ public class CardState {
view.updateFoilIndex(this);
}
public final void setSVars(final Map<String, String> 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<String>(source.intrinsicKeywords);
unparsedAbilities = new ArrayList<String>(source.unparsedAbilities);
staticAbilityStrings = new ArrayList<String>(source.staticAbilityStrings);
intrinsicKeywords = Lists.newArrayList(source.intrinsicKeywords);
staticAbilityStrings = Lists.newArrayList(source.staticAbilityStrings);
setImageKey(source.getImageKey());
setRarity(source.rarity);
setSetCode(source.setCode);
setSVars(new TreeMap<String, String>(source.getSVars()));
setSVars(source.getSVars());
replacementEffects = new FCollection<ReplacementEffect>();
for (ReplacementEffect RE : source.getReplacementEffects()) {
replacementEffects.add(RE.getCopy());