diff --git a/.gitattributes b/.gitattributes index 3631e12c2db..583c6b4f5e2 100644 --- a/.gitattributes +++ b/.gitattributes @@ -9561,6 +9561,7 @@ src/main/java/forge/CardPowerToughness.java svneol=native#text/plain src/main/java/forge/CardReader.java svneol=native#text/plain src/main/java/forge/CardUtil.java svneol=native#text/plain src/main/java/forge/Card_Color.java svneol=native#text/plain +src/main/java/forge/Card_Keywords.java -text src/main/java/forge/Card_Type.java svneol=native#text/plain src/main/java/forge/Color.java svneol=native#text/plain src/main/java/forge/ColorChanger.java -text diff --git a/src/main/java/forge/Card.java b/src/main/java/forge/Card.java index 28742216285..86098ff8ead 100644 --- a/src/main/java/forge/Card.java +++ b/src/main/java/forge/Card.java @@ -68,6 +68,7 @@ public class Card extends GameEntity implements Comparable { private ArrayList cardColor = new ArrayList(); //changes by AF animate and continuous static effects private ArrayList changedCardTypes = new ArrayList(); + private ArrayList changedCardKeywords = new ArrayList(); private ArrayList staticAbilities = new ArrayList(); private ArrayList rememberedObjects = new ArrayList(); @@ -3903,34 +3904,16 @@ public class Card extends GameEntity implements Comparable { * @return a {@link java.util.ArrayList} object. */ public final ArrayList getKeyword() { - ArrayList a1 = new ArrayList(getIntrinsicKeyword()); - ArrayList a2 = new ArrayList(getExtrinsicKeyword()); + ArrayList keywords = getUnhiddenKeyword(); ArrayList a4 = new ArrayList(getHiddenExtrinsicKeyword()); - a1.addAll(a2); - a1.addAll(a4); + keywords.addAll(a4); - // SOL Changes for Mana - //for(Ability_Mana sa:getManaAbility()) - // if(sa.isBasic()) a1.add((sa).orig); - - return a1; + return keywords; } public int getKeywordAmount(final String keyword) { int res = 0; - for (String k : getIntrinsicKeyword()) { - if (k.equals(keyword)) { - res++; - } - } - - for (String k : getExtrinsicKeyword()) { - if (k.equals(keyword)) { - res++; - } - } - - for (String k : getHiddenExtrinsicKeyword()) { + for (String k : getKeyword()) { if (k.equals(keyword)) { res++; } @@ -3938,8 +3921,44 @@ public class Card extends GameEntity implements Comparable { return res; } + + public void setChangedCardKeywords(ArrayList kw) { + changedCardKeywords = kw; + } + + public ArrayList getChangedCardKeywords() { + return changedCardKeywords; + } + + public void addChangedCardKeywords(ArrayList keywords, ArrayList removeKeywords, boolean removeAllKeywords, + long timestamp) { + + changedCardKeywords.add(new Card_Keywords(keywords, removeKeywords, removeAllKeywords, timestamp)); + } + + public void addChangedCardKeywords(String[] keywords, String[] removeKeywords, boolean removeAllKeywords, long timestamp) { + ArrayList keywordsList = null; + ArrayList removeKeywordsList = null; + if(keywords != null) { + keywordsList = new ArrayList(Arrays.asList(keywords)); + } + + if(removeKeywords != null) { + removeKeywordsList = new ArrayList(Arrays.asList(removeKeywords)); + } + + addChangedCardKeywords(keywordsList, removeKeywordsList, removeAllKeywords, timestamp); + } + + public void removeChangedCardKeywords(long timestamp) { + for (int i = 0; i < changedCardKeywords.size(); i++) { + Card_Keywords cardK = changedCardKeywords.get(i); + if (cardK.getTimestamp() == timestamp) { + changedCardKeywords.remove(cardK); + } + } + } - //keywords are like flying, fear, first strike, etc... // Hidden keywords will be left out /** *

getUnhiddenKeyword.

@@ -3947,15 +3966,32 @@ public class Card extends GameEntity implements Comparable { * @return a {@link java.util.ArrayList} object. */ public final ArrayList getUnhiddenKeyword() { - ArrayList a1 = new ArrayList(getIntrinsicKeyword()); + ArrayList keywords = new ArrayList(getIntrinsicKeyword()); ArrayList a2 = new ArrayList(getExtrinsicKeyword()); - a1.addAll(a2); + keywords.addAll(a2); - // SOL Changes for Mana - //for(Ability_Mana sa:getManaAbility()) - // if(sa.isBasic()) a1.add((sa).orig); + // see if keyword changes are in effect + if (!changedCardKeywords.isEmpty()) { - return a1; + ArrayList newKeywords = changedCardKeywords; + Collections.sort(newKeywords); // sorts newKeywords by timeStamp + + for (Card_Keywords ck : newKeywords) { + + if(ck.isRemoveAllKeywords()) { + keywords.clear(); + } else if (ck.getRemoveKeywords() != null) { + keywords.removeAll(ck.getRemoveKeywords()); + } + + if (ck.getKeywords() != null) { + keywords.addAll(ck.getKeywords()); + } + + } + } + + return keywords; } /** diff --git a/src/main/java/forge/Card_Keywords.java b/src/main/java/forge/Card_Keywords.java new file mode 100644 index 00000000000..803fa50e6f0 --- /dev/null +++ b/src/main/java/forge/Card_Keywords.java @@ -0,0 +1,60 @@ +package forge; + +import java.util.ArrayList; + + +/** + *

Card_Keywords class.

+ * + * @author Forge + * @version $Id: Card_Keywords.java 10217 2011-09-04 10:14:19Z Sloth $ + */ +public class Card_Keywords implements Comparable{ + // takes care of individual card types + private ArrayList keywords = new ArrayList(); + private ArrayList removeKeywords = new ArrayList(); + private boolean removeAllKeywords =false; + private long timeStamp = 0; + + /** + *

getTimestamp.

+ * + * @return a long. + */ + public final long getTimestamp() { + return timeStamp; + } + + Card_Keywords(final ArrayList keywordList, final ArrayList removeKeywordList, final boolean removeAll, + final long stamp) { + keywords = keywordList; + removeKeywords = removeKeywordList; + removeAllKeywords = removeAll; + timeStamp = stamp; + } + + public final ArrayList getKeywords() { + return keywords; + } + + public final ArrayList getRemoveKeywords() { + return removeKeywords; + } + + public final boolean isRemoveAllKeywords() { + return removeAllKeywords; + } + + @Override + public final int compareTo(final Card_Keywords anotherCardKeywords) { + int returnValue = 0; + long anotherTimeStamp = anotherCardKeywords.getTimestamp(); + if (this.timeStamp < anotherTimeStamp) { + returnValue = -1; + } else if (this.timeStamp > anotherTimeStamp) { + returnValue = 1; + } + return returnValue; + } + +} diff --git a/src/main/java/forge/StaticEffects.java b/src/main/java/forge/StaticEffects.java index 45550933899..5e77db89b20 100644 --- a/src/main/java/forge/StaticEffects.java +++ b/src/main/java/forge/StaticEffects.java @@ -87,10 +87,6 @@ public class StaticEffects { } } - if (params.containsKey("AddKeyword")) { - addKeywords = params.get("AddKeyword").split(" & "); - } - if (params.containsKey("AddColor")) { addColors = CardUtil.getShortColorsString( new ArrayList(Arrays.asList(params.get("AddColor").split(" & ")))); @@ -103,6 +99,9 @@ public class StaticEffects { //modify players for (Player p : affectedPlayers) { + if (params.containsKey("AddKeyword")) { + addKeywords = params.get("AddKeyword").split(" & "); + } // add keywords if (addKeywords != null) @@ -124,10 +123,8 @@ public class StaticEffects { affectedCard.addSemiPermanentDefenseBoost(toughnessBonus * -1); //remove keywords - if (addKeywords != null) { - for (String keyword : addKeywords) { - affectedCard.removeExtrinsicKeyword(keyword); - } + if (params.containsKey("AddKeyword") || params.containsKey("RemoveKeyword") || params.containsKey("RemoveAllAbilities")) { + affectedCard.removeChangedCardKeywords(se.getTimestamp()); } //remove abilities @@ -142,10 +139,11 @@ public class StaticEffects { //remove abilities if (params.containsKey("RemoveAllAbilities")) { - SpellAbility[] spellAbility = affectedCard.getSpellAbility(); - for (SpellAbility s : spellAbility) { - s.setTemporarilySuppressed(false); + ArrayList abilities = affectedCard.getSpellAbilities(); + for (SpellAbility ab : abilities) { + ab.setTemporarilySuppressed(false); } + ArrayList staticAbilities = affectedCard.getStaticAbilities(); for (StaticAbility stA : staticAbilities) { stA.setTemporarilySuppressed(false); diff --git a/src/main/java/forge/card/staticAbility/StaticAbility_Continuous.java b/src/main/java/forge/card/staticAbility/StaticAbility_Continuous.java index 7ac53ff518e..60867a4a6e3 100644 --- a/src/main/java/forge/card/staticAbility/StaticAbility_Continuous.java +++ b/src/main/java/forge/card/staticAbility/StaticAbility_Continuous.java @@ -43,12 +43,14 @@ public class StaticAbility_Continuous { int setPower = -1; int setToughness = -1; String[] addKeywords = null; + String[] removeKeywords = null; String[] addAbilities = null; String[] addSVars = null; String[] addTypes = null; String[] removeTypes = null; String addColors = null; String[] addTriggers = null; + boolean removeAllAbilities = false ; boolean removeSuperTypes = false; boolean removeCardTypes = false; boolean removeSubTypes = false; @@ -95,6 +97,14 @@ public class StaticAbility_Continuous { if (params.containsKey("AddKeyword")) { addKeywords = params.get("AddKeyword").split(" & "); } + + if (params.containsKey("RemoveKeyword")) { + removeKeywords = params.get("RemoveKeyword").split(" & "); + } + + if (params.containsKey("RemoveAllAbilities")) { + removeAllAbilities = true; + } if (params.containsKey("AddAbility")) { String[] sVars = params.get("AddAbility").split(" & "); @@ -195,10 +205,8 @@ public class StaticAbility_Continuous { affectedCard.addSemiPermanentDefenseBoost(toughnessBonus); // add keywords - if (addKeywords != null) { - for (String keyword : addKeywords) { - affectedCard.addExtrinsicKeyword(keyword); - } + if (addKeywords != null || removeKeywords != null || removeAllAbilities) { + affectedCard.addChangedCardKeywords(addKeywords, removeKeywords, removeAllAbilities, hostCard.getTimestamp()); } // add abilities @@ -243,7 +251,7 @@ public class StaticAbility_Continuous { } // remove triggers - if (params.containsKey("RemoveTriggers") || params.containsKey("RemoveAllAbilities")) { + if (params.containsKey("RemoveTriggers") || removeAllAbilities) { ArrayList triggers = affectedCard.getTriggers(); for (Trigger trigger : triggers) { trigger.setTemporarilySuppressed(true); @@ -251,7 +259,7 @@ public class StaticAbility_Continuous { } // remove activated and static abilities - if (params.containsKey("RemoveAllAbilities")) { + if (removeAllAbilities) { ArrayList abilities = affectedCard.getSpellAbilities(); for (SpellAbility ab : abilities) { ab.setTemporarilySuppressed(true);