diff --git a/.gitattributes b/.gitattributes index 629b1b0f245..d9edee37bcb 100644 --- a/.gitattributes +++ b/.gitattributes @@ -4703,6 +4703,7 @@ res/cardsfolder/m/meliras_keepers.txt svneol=native#text/plain res/cardsfolder/m/meloku_the_clouded_mirror.txt svneol=native#text/plain res/cardsfolder/m/melt_terrain.txt svneol=native#text/plain res/cardsfolder/m/meltdown.txt svneol=native#text/plain +res/cardsfolder/m/melting.txt -text res/cardsfolder/m/memnarch.txt svneol=native#text/plain res/cardsfolder/m/memnite.txt svneol=native#text/plain res/cardsfolder/m/memory_erosion.txt svneol=native#text/plain diff --git a/res/cardsfolder/m/melting.txt b/res/cardsfolder/m/melting.txt new file mode 100644 index 00000000000..0725909c8cb --- /dev/null +++ b/res/cardsfolder/m/melting.txt @@ -0,0 +1,11 @@ +Name:Melting +ManaCost:3 R +Types:Enchantment +Text:no text +S:Mode$ Continuous | Affected$ Land | RemoveType$ Snow | Description$ All lands are no longer snow. +SVar:RemRandomDeck:True +SVar:Rarity:Rare +SVar:Picture:http://www.wizards.com/global/images/magic/general/melting.jpg +Oracle:All lands are no longer snow. +SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/201.jpg +End \ No newline at end of file diff --git a/src/main/java/forge/Card.java b/src/main/java/forge/Card.java index f365f187237..1fb05894fc9 100644 --- a/src/main/java/forge/Card.java +++ b/src/main/java/forge/Card.java @@ -3120,13 +3120,11 @@ public class Card extends GameEntity implements Comparable { ArrayList newType = new ArrayList(type); 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(); + removeTypes.addAll(ct.getRemoveType()); //remove old types for (int i = 0; i < newType.size(); i++) { String t = newType.get(i); @@ -3141,7 +3139,9 @@ public class Card extends GameEntity implements Comparable { } newType.removeAll(removeTypes); //add new types - newType.addAll(ct.getType()); + if (ct.getType() != null) { + newType.addAll(ct.getType()); + } } @@ -3160,16 +3160,26 @@ public class Card extends GameEntity implements Comparable { return changedCardTypes; } - public void addChangedCardTypes(ArrayList types, boolean removeSuperTypes, boolean removeCardTypes, - boolean removeSubTypes, boolean removeCreatureTypes, long timestamp) { + public void addChangedCardTypes(ArrayList types, ArrayList removeTypes, boolean removeSuperTypes, + boolean removeCardTypes, boolean removeSubTypes, boolean removeCreatureTypes, long timestamp) { - changedCardTypes.add(new Card_Type(types, removeSuperTypes, removeCardTypes, removeSubTypes, removeCreatureTypes, timestamp)); + changedCardTypes.add(new Card_Type(types, removeTypes, removeSuperTypes, removeCardTypes, removeSubTypes, removeCreatureTypes, + timestamp)); } - public void addChangedCardTypes(String[] types, boolean removeSuperTypes, boolean removeCardTypes, + public void addChangedCardTypes(String[] types, String[] removeTypes, boolean removeSuperTypes, boolean removeCardTypes, boolean removeSubTypes, boolean removeCreatureTypes, long timestamp) { - ArrayList typeList = new ArrayList(Arrays.asList(types)); - addChangedCardTypes(typeList, removeSuperTypes, removeCardTypes, removeSubTypes, removeCreatureTypes, timestamp); + ArrayList typeList = null; + ArrayList removeTypeList = null; + if(types != null) { + typeList = new ArrayList(Arrays.asList(types)); + } + + if(removeTypes != null) { + removeTypeList = new ArrayList(Arrays.asList(removeTypes)); + } + + addChangedCardTypes(typeList, removeTypeList, removeSuperTypes, removeCardTypes, removeSubTypes, removeCreatureTypes, timestamp); } public void removeChangedCardTypes(long timestamp) { diff --git a/src/main/java/forge/Card_Type.java b/src/main/java/forge/Card_Type.java index fe586fc0e54..7be508425bb 100644 --- a/src/main/java/forge/Card_Type.java +++ b/src/main/java/forge/Card_Type.java @@ -12,6 +12,7 @@ import java.util.ArrayList; public class Card_Type implements Comparable { // takes care of individual card types private ArrayList type = new ArrayList(); + private ArrayList removeType = new ArrayList(); private boolean removeSuperTypes; private boolean removeCardTypes; private boolean removeSubTypes; @@ -36,10 +37,11 @@ public class Card_Type implements Comparable { * @param removeCreatureType a boolean * @param stamp a long */ - Card_Type(final ArrayList types, final boolean removeSuperType, final boolean removeCardType, - final boolean removeSubType, final boolean removeCreatureType, final long stamp) + Card_Type(final ArrayList types, final ArrayList removeTypes, final boolean removeSuperType, + final boolean removeCardType, final boolean removeSubType, final boolean removeCreatureType, final long stamp) { type = types; + removeType = removeTypes; removeSuperTypes = removeSuperType; removeCardTypes = removeCardType; removeSubTypes = removeSubType; @@ -49,16 +51,25 @@ public class Card_Type implements Comparable { /** * - * TODO Write javadoc for this method. + * Write javadoc for this method. * @return type */ public final ArrayList getType() { return type; } + + /** + * + * Write javadoc for this method. + * @return removeType + */ + public final ArrayList getRemoveType() { + return removeType; + } /** * - * TODO Write javadoc for this method. + * Write javadoc for this method. * @return removeSuperTypes */ public final boolean isRemoveSuperTypes() { @@ -67,7 +78,7 @@ public class Card_Type implements Comparable { /** * - * TODO Write javadoc for this method. + * Write javadoc for this method. * @return removeCardTypes */ public final boolean isRemoveCardTypes() { @@ -76,7 +87,7 @@ public class Card_Type implements Comparable { /** * - * TODO Write javadoc for this method. + * Write javadoc for this method. * @return removeSubTypes */ public final boolean isRemoveSubTypes() { @@ -85,7 +96,7 @@ public class Card_Type implements Comparable { /** * - * TODO Write javadoc for this method. + * Write javadoc for this method. * @return removeCreatureTypes */ public final boolean isRemoveCreatureTypes() { diff --git a/src/main/java/forge/StaticEffects.java b/src/main/java/forge/StaticEffects.java index b992879fb35..17a674ccb40 100644 --- a/src/main/java/forge/StaticEffects.java +++ b/src/main/java/forge/StaticEffects.java @@ -130,7 +130,7 @@ public class StaticEffects { } //remove Types - if (params.containsKey("AddType")) { + if (params.containsKey("AddType") || params.containsKey("RemoveType")) { affectedCard.removeChangedCardTypes(se.getTimestamp()); } diff --git a/src/main/java/forge/card/abilityFactory/AbilityFactory_Animate.java b/src/main/java/forge/card/abilityFactory/AbilityFactory_Animate.java index 7b4a989a6cb..a6f1d39580d 100644 --- a/src/main/java/forge/card/abilityFactory/AbilityFactory_Animate.java +++ b/src/main/java/forge/card/abilityFactory/AbilityFactory_Animate.java @@ -425,6 +425,11 @@ public class AbilityFactory_Animate { if (params.containsKey("Types")) { types.addAll(Arrays.asList(params.get("Types").split(","))); } + + final ArrayList removeTypes = new ArrayList(); + if (params.containsKey("RemoveTypes")) { + removeTypes.addAll(Arrays.asList(params.get("RemoveTypes").split(","))); + } //allow ChosenType - overrides anything else specified if (types.contains("ChosenType")) { @@ -493,7 +498,7 @@ public class AbilityFactory_Animate { for (final Card c : tgts) { - final long colorTimestamp = doAnimate(c, af, power, toughness, types, finalDesc, keywords, timestamp); + final long colorTimestamp = doAnimate(c, af, power, toughness, types, removeTypes, finalDesc, keywords, timestamp); //give abilities final ArrayList addedAbilities = new ArrayList(); @@ -572,7 +577,8 @@ public class AbilityFactory_Animate { * @return a long. */ private static long doAnimate(final Card c, final AbilityFactory af, final int power, final int toughness, - final ArrayList types, final String colors, final ArrayList keywords, final long timestamp) + final ArrayList types, final ArrayList removeTypes, final String colors, final ArrayList keywords, + final long timestamp) { HashMap params = af.getMapParams(); @@ -617,7 +623,7 @@ public class AbilityFactory_Animate { } if (!types.isEmpty()) { - c.addChangedCardTypes(types, removeSuperTypes, removeCardTypes, removeSubTypes, + c.addChangedCardTypes(types, removeTypes, removeSuperTypes, removeCardTypes, removeSubTypes, removeCreatureTypes, timestamp); } @@ -920,6 +926,11 @@ public class AbilityFactory_Animate { if (params.containsKey("Types")) { types.addAll(Arrays.asList(params.get("Types").split(","))); } + + final ArrayList removeTypes = new ArrayList(); + if (params.containsKey("RemoveTypes")) { + removeTypes.addAll(Arrays.asList(params.get("RemoveTypes").split(","))); + } //allow ChosenType - overrides anything else specified if (types.contains("ChosenType")) { @@ -976,7 +987,7 @@ public class AbilityFactory_Animate { for (final Card c : list) { - final long colorTimestamp = doAnimate(c, af, power, toughness, types, finalDesc, keywords, timestamp); + final long colorTimestamp = doAnimate(c, af, power, toughness, types, removeTypes, finalDesc, keywords, timestamp); //give abilities final ArrayList addedAbilities = new ArrayList(); diff --git a/src/main/java/forge/card/staticAbility/StaticAbility.java b/src/main/java/forge/card/staticAbility/StaticAbility.java index d1b079a76a9..bd2b2de1e30 100644 --- a/src/main/java/forge/card/staticAbility/StaticAbility.java +++ b/src/main/java/forge/card/staticAbility/StaticAbility.java @@ -87,7 +87,7 @@ public class StaticAbility { if(mapParams.containsKey("AddColor") || mapParams.containsKey("RemoveColor") || mapParams.containsKey("SetColor")) return 5; - if(mapParams.containsKey("AddType") || mapParams.containsKey("RemoveCardType") + if(mapParams.containsKey("AddType") || mapParams.containsKey("RemoveType") || mapParams.containsKey("RemoveCardType") || mapParams.containsKey("RemoveSubType") || mapParams.containsKey("RemoveSuperType")) return 4; diff --git a/src/main/java/forge/card/staticAbility/StaticAbility_Continuous.java b/src/main/java/forge/card/staticAbility/StaticAbility_Continuous.java index 163a01e1479..6a80fffdd0a 100644 --- a/src/main/java/forge/card/staticAbility/StaticAbility_Continuous.java +++ b/src/main/java/forge/card/staticAbility/StaticAbility_Continuous.java @@ -39,6 +39,7 @@ public class StaticAbility_Continuous { String addAbilities[] = null; String addSVars[] = null; String addTypes[] = null; + String removeTypes[] = null; String addColors = null; String addTriggers[] = null; boolean removeSuperTypes = false; @@ -104,6 +105,15 @@ public class StaticAbility_Continuous { } } + if (params.containsKey("RemoveType")) { + removeTypes = params.get("RemoveType").split(" & "); + if(removeTypes[0].equals("ChosenType")) { + String chosenType = hostCard.getChosenType(); + removeTypes[0] = chosenType; + se.setChosenType(chosenType); + } + } + if (params.containsKey("RemoveSuperTypes")) { removeSuperTypes = true; } @@ -175,8 +185,8 @@ public class StaticAbility_Continuous { affectedCard.setSVar(sVar, hostCard.getSVar(sVar)); // add Types - if (addTypes != null) - affectedCard.addChangedCardTypes(addTypes, removeSuperTypes, removeCardTypes, removeSubTypes, + if (addTypes != null || removeTypes != null) + affectedCard.addChangedCardTypes(addTypes, removeTypes, removeSuperTypes, removeCardTypes, removeSubTypes, removeCreatureTypes, hostCard.getTimestamp()); // add colors