diff --git a/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java b/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java index c1e84bc35fb..95d1835c9a6 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java @@ -6,7 +6,6 @@ import com.google.common.collect.Maps; import forge.ai.*; import forge.card.CardType; import forge.game.Game; -import forge.game.ability.AbilityFactory; import forge.game.ability.AbilityUtils; import forge.game.ability.ApiType; import forge.game.card.*; @@ -14,15 +13,11 @@ import forge.game.cost.CostPutCounter; import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; import forge.game.player.Player; -import forge.game.replacement.ReplacementEffect; -import forge.game.replacement.ReplacementHandler; import forge.game.spellability.SpellAbility; import forge.game.spellability.TargetRestrictions; import forge.game.staticability.StaticAbility; import forge.game.staticability.StaticAbilityContinuous; import forge.game.staticability.StaticAbilityLayer; -import forge.game.trigger.Trigger; -import forge.game.trigger.TriggerHandler; import forge.game.zone.ZoneType; import java.util.Arrays; @@ -474,75 +469,15 @@ public class AnimateAi extends SpellAbilityAi { sVars.addAll(Arrays.asList(sa.getParam("sVars").split(","))); } - AnimateEffectBase.doAnimate(card, sa, power, toughness, types, removeTypes, finalDesc, keywords, removeKeywords, hiddenKeywords, timestamp); + AnimateEffectBase.doAnimate(card, sa, power, toughness, types, removeTypes, finalDesc, + keywords, removeKeywords, hiddenKeywords, + abilities, triggers, replacements, stAbs, + timestamp); - - // remove abilities - final List removedAbilities = Lists.newArrayList(); - boolean clearSpells = sa.hasParam("OverwriteSpells"); - boolean removeAll = sa.hasParam("RemoveAllAbilities"); - boolean removeIntrinsic = sa.hasParam("RemoveIntrinsicAbilities"); - - if (clearSpells) { - removedAbilities.addAll(Lists.newArrayList(card.getSpells())); - } - - if (sa.hasParam("RemoveThisAbility") && !removedAbilities.contains(sa)) { - removedAbilities.add(sa); - } - - // give abilities - final List addedAbilities = Lists.newArrayList(); - if (abilities.size() > 0) { - for (final String s : abilities) { - final String actualAbility = source.getSVar(s); - addedAbilities.add(AbilityFactory.getAbility(actualAbility, card)); - } - } - - // Grant triggers - final List addedTriggers = Lists.newArrayList(); - if (triggers.size() > 0) { - for (final String s : triggers) { - final String actualTrigger = source.getSVar(s); - final Trigger parsedTrigger = TriggerHandler.parseTrigger(actualTrigger, card, false); - addedTriggers.add(parsedTrigger); - } - } - - // give replacement effects - final List addedReplacements = Lists.newArrayList(); - if (replacements.size() > 0) { - for (final String s : replacements) { - final String actualReplacement = source.getSVar(s); - final ReplacementEffect parsedReplacement = ReplacementHandler.parseReplacement(actualReplacement, card, false); - addedReplacements.add(parsedReplacement); - } - } - - // give static abilities (should only be used by cards to give - // itself a static ability) - final List addedStaticAbilities = Lists.newArrayList(); - if (stAbs.size() > 0) { - for (final String s : stAbs) { - final String actualAbility = source.getSVar(s); - addedStaticAbilities.add(new StaticAbility(actualAbility, card)); - } - } - - if (removeAll || removeIntrinsic - || !addedAbilities.isEmpty() || !removedAbilities.isEmpty() || !addedTriggers.isEmpty() - || !addedReplacements.isEmpty() || !addedStaticAbilities.isEmpty()) { - card.addChangedCardTraits(addedAbilities, removedAbilities, addedTriggers, addedReplacements, - addedStaticAbilities, removeAll, false, removeIntrinsic, timestamp); - } - - // give static abilities (should only be used by cards to give - // itself a static ability) - if (stAbs.size() > 0) { - for (final String s : stAbs) { - final String actualAbility = source.getSVar(s); - final StaticAbility stAb = card.addStaticAbility(actualAbility); + // check if animate added static Abilities + CardTraitChanges traits = card.getChangedCardTraits().get(timestamp); + if (traits != null) { + for (StaticAbility stAb : traits.getStaticAbilities()) { if ("Continuous".equals(stAb.getParam("Mode"))) { for (final StaticAbilityLayer layer : stAb.getLayers()) { StaticAbilityContinuous.applyContinuousAbility(stAb, new CardCollection(card), layer); diff --git a/forge-game/src/main/java/forge/game/StaticEffect.java b/forge-game/src/main/java/forge/game/StaticEffect.java index 8dd75487274..37b630098eb 100644 --- a/forge-game/src/main/java/forge/game/StaticEffect.java +++ b/forge-game/src/main/java/forge/game/StaticEffect.java @@ -261,7 +261,7 @@ public class StaticEffect { // remove abilities if (hasParam("AddAbility") || hasParam("GainsAbilitiesOf") || hasParam("AddTrigger") || hasParam("AddStaticAbility") || hasParam("AddReplacementEffects") - || hasParam("RemoveAllAbilities") || hasParam("RemoveIntrinsicAbilities")) { + || hasParam("RemoveAllAbilities") || hasParam("RemoveLandTypes")) { affectedCard.removeChangedCardTraits(getTimestamp()); } diff --git a/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java b/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java index 2ff72428be1..72b311cc763 100644 --- a/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java +++ b/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java @@ -22,6 +22,7 @@ import forge.game.card.CardCollection; import forge.game.card.CardFactoryUtil; import forge.game.combat.Combat; import forge.game.player.Player; +import forge.game.player.PlayerCollection; import forge.game.replacement.ReplacementEffect; import forge.game.replacement.ReplacementHandler; import forge.game.replacement.ReplacementLayer; @@ -34,7 +35,6 @@ import forge.game.zone.ZoneType; import forge.util.CardTranslation; import forge.util.Lang; import forge.util.Localizer; -import forge.util.collect.FCollection; import forge.util.collect.FCollectionView; /** @@ -192,14 +192,14 @@ public abstract class SpellAbilityEffect { } // Players - protected final static FCollection getTargetPlayers(final SpellAbility sa) { return getPlayers(false, "Defined", sa); } - protected final static FCollection getTargetPlayers(final SpellAbility sa, final String definedParam) { return getPlayers(false, definedParam, sa); } - protected final static FCollection getDefinedPlayersOrTargeted(final SpellAbility sa ) { return getPlayers(true, "Defined", sa); } - protected final static FCollection getDefinedPlayersOrTargeted(final SpellAbility sa, final String definedParam) { return getPlayers(true, definedParam, sa); } + protected final static PlayerCollection getTargetPlayers(final SpellAbility sa) { return getPlayers(false, "Defined", sa); } + protected final static PlayerCollection getTargetPlayers(final SpellAbility sa, final String definedParam) { return getPlayers(false, definedParam, sa); } + protected final static PlayerCollection getDefinedPlayersOrTargeted(final SpellAbility sa ) { return getPlayers(true, "Defined", sa); } + protected final static PlayerCollection getDefinedPlayersOrTargeted(final SpellAbility sa, final String definedParam) { return getPlayers(true, definedParam, sa); } - private static FCollection getPlayers(final boolean definedFirst, final String definedParam, final SpellAbility sa) { + private static PlayerCollection getPlayers(final boolean definedFirst, final String definedParam, final SpellAbility sa) { final boolean useTargets = sa.usesTargeting() && (!definedFirst || !sa.hasParam(definedParam)); - return useTargets ? new FCollection<>(sa.getTargets().getTargetPlayers()) + return useTargets ? new PlayerCollection(sa.getTargets().getTargetPlayers()) : AbilityUtils.getDefinedPlayers(sa.getHostCard(), sa.getParam(definedParam), sa); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/AnimateAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/AnimateAllEffect.java index d777368c2d6..20aff886597 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/AnimateAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/AnimateAllEffect.java @@ -3,19 +3,13 @@ package forge.game.ability.effects; import forge.GameCommand; import forge.card.CardType; import forge.game.Game; -import forge.game.ability.AbilityFactory; import forge.game.ability.AbilityUtils; import forge.game.card.Card; import forge.game.card.CardCollectionView; import forge.game.card.CardLists; import forge.game.card.CardUtil; import forge.game.event.GameEventCardStatsChanged; -import forge.game.player.Player; -import forge.game.replacement.ReplacementEffect; -import forge.game.replacement.ReplacementHandler; import forge.game.spellability.SpellAbility; -import forge.game.trigger.Trigger; -import forge.game.trigger.TriggerHandler; import forge.game.zone.ZoneType; import java.util.ArrayList; @@ -23,6 +17,8 @@ import java.util.Arrays; import java.util.List; import java.util.Map; +import com.google.common.collect.ImmutableList; + public class AnimateAllEffect extends AnimateEffectBase { @Override @@ -131,63 +127,24 @@ public class AnimateAllEffect extends AnimateEffectBase { } CardCollectionView list; - List tgtPlayers = getTargetPlayers(sa); if (!sa.usesTargeting() && !sa.hasParam("Defined")) { list = game.getCardsIn(ZoneType.Battlefield); - } - else { - list = tgtPlayers.get(0).getCardsIn(ZoneType.Battlefield); + } else { + list = getTargetPlayers(sa).getCardsIn(ZoneType.Battlefield); } list = CardLists.getValidCards(list, valid.split(","), host.getController(), host, sa); - boolean removeAll = sa.hasParam("RemoveAllAbilities"); - boolean removeIntrinsic = sa.hasParam("RemoveIntrinsicAbilities"); - for (final Card c : list) { doAnimate(c, sa, power, toughness, types, removeTypes, finalDesc, - keywords, removeKeywords, hiddenKeywords, timestamp); - - // give abilities - final List addedAbilities = new ArrayList<>(); - if (abilities.size() > 0) { - for (final String s : abilities) { - final String actualAbility = host.getSVar(s); - final SpellAbility grantedAbility = AbilityFactory.getAbility(actualAbility, c); - addedAbilities.add(grantedAbility); - } - } - - // give replacement effects - final List addedReplacements = new ArrayList<>(); - if (replacements.size() > 0) { - for (final String s : replacements) { - final String actualReplacement = host.getSVar(s); - final ReplacementEffect parsedReplacement = ReplacementHandler.parseReplacement(actualReplacement, c, false); - addedReplacements.add(parsedReplacement); - } - } - // Grant triggers - final List addedTriggers = new ArrayList<>(); - if (triggers.size() > 0) { - for (final String s : triggers) { - final String actualTrigger = host.getSVar(s); - final Trigger parsedTrigger = TriggerHandler.parseTrigger(actualTrigger, c, false); - addedTriggers.add(parsedTrigger); - } - } - - if (!addedAbilities.isEmpty() || !addedTriggers.isEmpty() || !addedReplacements.isEmpty()) { - c.addChangedCardTraits(addedAbilities, null, addedTriggers, addedReplacements, null, removeAll, false, removeIntrinsic, timestamp); - } + keywords, removeKeywords, hiddenKeywords, + abilities, triggers, replacements, ImmutableList.of(), + timestamp); // give sVars - if (sVars.size() > 0) { - for (final String s : sVars) { - final String actualsVar = host.getSVar(s); - c.setSVar(s, actualsVar); - } + for (final String s : sVars) { + c.setSVar(s, AbilityUtils.getSVar(sa, s)); } game.fireEvent(new GameEventCardStatsChanged(c)); diff --git a/forge-game/src/main/java/forge/game/ability/effects/AnimateEffect.java b/forge-game/src/main/java/forge/game/ability/effects/AnimateEffect.java index 8be2736c313..ea85169c33d 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/AnimateEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/AnimateEffect.java @@ -1,29 +1,19 @@ package forge.game.ability.effects; -import forge.GameCommand; import forge.card.CardType; -import forge.card.mana.ManaCost; -import forge.card.mana.ManaCostParser; import forge.game.Game; -import forge.game.ability.AbilityFactory; import forge.game.ability.AbilityUtils; import forge.game.card.Card; import forge.game.card.CardUtil; import forge.game.event.GameEventCardStatsChanged; -import forge.game.phase.PhaseType; -import forge.game.replacement.ReplacementEffect; -import forge.game.replacement.ReplacementHandler; -import forge.game.spellability.AbilityStatic; import forge.game.spellability.SpellAbility; -import forge.game.staticability.StaticAbility; -import forge.game.trigger.Trigger; -import forge.game.trigger.TriggerHandler; + +import com.google.common.collect.Lists; import java.util.Arrays; import java.util.List; import java.util.Map; -import com.google.common.collect.Lists; public class AnimateEffect extends AnimateEffectBase { @@ -62,8 +52,6 @@ public class AnimateEffect extends AnimateEffectBase { // Every Animate event needs a unique time stamp final long timestamp = game.getNextTimestamp(); - final boolean permanent = sa.hasParam("Permanent"); - final CardType types = new CardType(true); if (sa.hasParam("Types")) { types.addAll(Arrays.asList(sa.getParam("Types").split(","))); @@ -150,81 +138,23 @@ public class AnimateEffect extends AnimateEffectBase { for (final Card c : tgts) { doAnimate(c, sa, power, toughness, types, removeTypes, finalDesc, - keywords, removeKeywords, hiddenKeywords, timestamp); + keywords, removeKeywords, hiddenKeywords, + abilities, triggers, replacements, stAbs, timestamp); if (sa.hasParam("Name")) { c.addChangedName(sa.getParam("Name"), timestamp); } - if (sa.hasParam("LeaveBattlefield")) { - addLeaveBattlefieldReplacement(c, sa, sa.getParam("LeaveBattlefield")); - } - - // remove abilities - final List removedAbilities = Lists.newArrayList(); - boolean clearSpells = sa.hasParam("OverwriteSpells"); - boolean removeAll = sa.hasParam("RemoveAllAbilities"); - boolean removeIntrinsic = sa.hasParam("RemoveIntrinsicAbilities"); - - if (clearSpells) { - removedAbilities.addAll(Lists.newArrayList(c.getSpells())); - } - - if (sa.hasParam("RemoveThisAbility") && !removedAbilities.contains(sa)) { - removedAbilities.add(sa); - } - - // give abilities - final List addedAbilities = Lists.newArrayList(); - if (abilities.size() > 0) { - for (final String s : abilities) { - final String actualAbility = source.getSVar(s); - addedAbilities.add(AbilityFactory.getAbility(actualAbility, c)); - } - } - - // Grant triggers - final List addedTriggers = Lists.newArrayList(); - if (triggers.size() > 0) { - for (final String s : triggers) { - final String actualTrigger = source.getSVar(s); - final Trigger parsedTrigger = TriggerHandler.parseTrigger(actualTrigger, c, false); - addedTriggers.add(parsedTrigger); - } - } - - // give replacement effects - final List addedReplacements = Lists.newArrayList(); - if (replacements.size() > 0) { - for (final String s : replacements) { - final String actualReplacement = source.getSVar(s); - final ReplacementEffect parsedReplacement = ReplacementHandler.parseReplacement(actualReplacement, c, false); - addedReplacements.add(parsedReplacement); - } - } - - // give static abilities (should only be used by cards to give - // itself a static ability) - final List addedStaticAbilities = Lists.newArrayList(); - if (stAbs.size() > 0) { - for (final String s : stAbs) { - final String actualAbility = source.getSVar(s); - addedStaticAbilities.add(new StaticAbility(actualAbility, c)); - } - } - // give sVars - if (sVars.size() > 0) { - for (final String s : sVars) { - String actualsVar = source.getSVar(s); - String name = s; - if (actualsVar.startsWith("SVar:")) { - actualsVar = actualsVar.split("SVar:")[1]; - name = actualsVar.split(":")[0]; - actualsVar = actualsVar.split(":")[1]; - } - c.setSVar(name, actualsVar); + for (final String s : sVars) { + String actualsVar = AbilityUtils.getSVar(sa, s); + String name = s; + if (actualsVar.startsWith("SVar:")) { + actualsVar = actualsVar.split("SVar:")[1]; + name = actualsVar.split(":")[0]; + actualsVar = actualsVar.split(":")[1]; } + c.setSVar(name, actualsVar); } // give Remembered @@ -234,73 +164,6 @@ public class AnimateEffect extends AnimateEffectBase { } } - final GameCommand unanimate = new GameCommand() { - private static final long serialVersionUID = -5861759814760561373L; - - @Override - public void run() { - doUnanimate(c, sa, hiddenKeywords, timestamp); - - c.removeChangedName(timestamp); - c.updateStateForView(); - - game.fireEvent(new GameEventCardStatsChanged(c)); - } - }; - - - if (sa.hasParam("RevertCost")) { - final ManaCost cost = new ManaCost(new ManaCostParser(sa.getParam("RevertCost"))); - final String desc = this.getStackDescription(sa); - final SpellAbility revertSA = new AbilityStatic(c, cost) { - @Override - public void resolve() { - unanimate.run(); - } - @Override - public String getDescription() { - return cost + ": End Effect: " + desc; - } - }; - addedAbilities.add(revertSA); - } - - // after unanimate to add RevertCost - if (removeAll || removeIntrinsic - || !addedAbilities.isEmpty() || !removedAbilities.isEmpty() || !addedTriggers.isEmpty() - || !addedReplacements.isEmpty() || !addedStaticAbilities.isEmpty()) { - c.addChangedCardTraits(addedAbilities, removedAbilities, addedTriggers, addedReplacements, - addedStaticAbilities, removeAll, false, removeIntrinsic, timestamp); - } - - if (!permanent) { - if (sa.hasParam("UntilEndOfCombat")) { - game.getEndOfCombat().addUntil(unanimate); - } else if (sa.hasParam("UntilHostLeavesPlay")) { - source.addLeavesPlayCommand(unanimate); - } else if (sa.hasParam("UntilLoseControlOfHost")) { - sa.getHostCard().addLeavesPlayCommand(unanimate); - sa.getHostCard().addChangeControllerCommand(unanimate); - } else if (sa.hasParam("UntilYourNextUpkeep")) { - game.getUpkeep().addUntil(source.getController(), unanimate); - } else if (sa.hasParam("UntilTheEndOfYourNextUpkeep")) { - if (game.getPhaseHandler().is(PhaseType.UPKEEP)) { - game.getUpkeep().registerUntilEnd(source.getController(), unanimate); - } else { - game.getUpkeep().addUntilEnd(source.getController(), unanimate); - } - } else if (sa.hasParam("UntilControllerNextUntap")) { - game.getUntap().addUntil(c.getController(), unanimate); - } else if (sa.hasParam("UntilAPlayerCastSpell")) { - game.getStack().addCastCommand(sa.getParam("UntilAPlayerCastSpell"), unanimate); - } else if (sa.hasParam("UntilYourNextTurn")) { - game.getCleanup().addUntil(source.getController(), unanimate); - } else { - game.getEndOfTurn().addUntil(unanimate); - } - } - - game.fireEvent(new GameEventCardStatsChanged(c)); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/AnimateEffectBase.java b/forge-game/src/main/java/forge/game/ability/effects/AnimateEffectBase.java index 0762a16835a..af5ffbdaa3c 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/AnimateEffectBase.java +++ b/forge-game/src/main/java/forge/game/ability/effects/AnimateEffectBase.java @@ -6,29 +6,49 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package forge.game.ability.effects; +import forge.GameCommand; import forge.card.CardType; +import forge.card.mana.ManaCost; +import forge.card.mana.ManaCostParser; +import forge.game.Game; +import forge.game.ability.AbilityFactory; +import forge.game.ability.AbilityUtils; import forge.game.ability.SpellAbilityEffect; import forge.game.card.Card; +import forge.game.event.GameEventCardStatsChanged; import forge.game.keyword.Keyword; +import forge.game.phase.PhaseType; +import forge.game.replacement.ReplacementEffect; +import forge.game.replacement.ReplacementHandler; +import forge.game.spellability.AbilityStatic; import forge.game.spellability.SpellAbility; +import forge.game.staticability.StaticAbility; +import forge.game.trigger.Trigger; +import forge.game.trigger.TriggerHandler; + import java.util.List; +import com.google.common.collect.Lists; + public abstract class AnimateEffectBase extends SpellAbilityEffect { public static void doAnimate(final Card c, final SpellAbility sa, final Integer power, final Integer toughness, final CardType addType, final CardType removeType, final String colors, - final List keywords, final List removeKeywords, - final List hiddenKeywords, final long timestamp) { + final List keywords, final List removeKeywords, final List hiddenKeywords, + List abilities, final List triggers, final List replacements, final List stAbs, + final long timestamp) { + final Card source = sa.getHostCard(); + final Game game = source.getGame(); boolean removeSuperTypes = false; boolean removeCardTypes = false; @@ -38,6 +58,8 @@ public abstract class AnimateEffectBase extends SpellAbilityEffect { boolean removeArtifactTypes = false; boolean removeEnchantmentTypes = false; + boolean removeAll = sa.hasParam("RemoveAllAbilities"); + if (sa.hasParam("OverwriteTypes")) { removeSuperTypes = true; removeCardTypes = true; @@ -98,8 +120,7 @@ public abstract class AnimateEffectBase extends SpellAbilityEffect { removeLandTypes, removeCreatureTypes, removeArtifactTypes, removeEnchantmentTypes, timestamp); } - c.addChangedCardKeywords(keywords, removeKeywords, - sa.hasParam("RemoveAllAbilities"), sa.hasParam("RemoveIntrinsicAbilities"), timestamp); + c.addChangedCardKeywords(keywords, removeKeywords, removeAll, removeLandTypes, timestamp); if (sa.hasParam("CantHaveKeyword")) { c.addCantHaveKeyword(timestamp, Keyword.setValueOf(sa.getParam("CantHaveKeyword"))); @@ -111,13 +132,119 @@ public abstract class AnimateEffectBase extends SpellAbilityEffect { c.addColor(colors, !sa.hasParam("OverwriteColors"), timestamp); + if (sa.hasParam("LeaveBattlefield")) { + addLeaveBattlefieldReplacement(c, sa, sa.getParam("LeaveBattlefield")); + } + + // remove abilities + final List removedAbilities = Lists.newArrayList(); + boolean clearSpells = sa.hasParam("OverwriteSpells"); + + if (clearSpells) { + removedAbilities.addAll(Lists.newArrayList(c.getSpells())); + } + + if (sa.hasParam("RemoveThisAbility") && !removedAbilities.contains(sa)) { + removedAbilities.add(sa); + } + + // give abilities + final List addedAbilities = Lists.newArrayList(); + for (final String s : abilities) { + addedAbilities.add(AbilityFactory.getAbility(AbilityUtils.getSVar(sa, s), c)); + } + + // Grant triggers + final List addedTriggers = Lists.newArrayList(); + for (final String s : triggers) { + addedTriggers.add(TriggerHandler.parseTrigger(AbilityUtils.getSVar(sa, s), c, false)); + } + + // give replacement effects + final List addedReplacements = Lists.newArrayList(); + for (final String s : replacements) { + addedReplacements.add(ReplacementHandler.parseReplacement(AbilityUtils.getSVar(sa, s), c, false)); + } + + // give static abilities (should only be used by cards to give + // itself a static ability) + final List addedStaticAbilities = Lists.newArrayList(); + for (final String s : stAbs) { + addedStaticAbilities.add(new StaticAbility(AbilityUtils.getSVar(sa, s), c)); + } + + final GameCommand unanimate = new GameCommand() { + private static final long serialVersionUID = -5861759814760561373L; + + @Override + public void run() { + doUnanimate(c, sa, hiddenKeywords, timestamp); + + c.removeChangedName(timestamp); + c.updateStateForView(); + + game.fireEvent(new GameEventCardStatsChanged(c)); + } + }; + + + if (sa.hasParam("RevertCost")) { + final ManaCost cost = new ManaCost(new ManaCostParser(sa.getParam("RevertCost"))); + final String desc = sa.getStackDescription(); + final SpellAbility revertSA = new AbilityStatic(c, cost) { + @Override + public void resolve() { + unanimate.run(); + } + @Override + public String getDescription() { + return cost + ": End Effect: " + desc; + } + }; + addedAbilities.add(revertSA); + } + + // after unanimate to add RevertCost + if (removeAll || removeLandTypes + || !addedAbilities.isEmpty() || !removedAbilities.isEmpty() || !addedTriggers.isEmpty() + || !addedReplacements.isEmpty() || !addedStaticAbilities.isEmpty()) { + c.addChangedCardTraits(addedAbilities, removedAbilities, addedTriggers, addedReplacements, + addedStaticAbilities, removeAll, false, removeLandTypes, timestamp); + } + + if (!sa.hasParam("Permanent")) { + if (sa.hasParam("UntilEndOfCombat")) { + game.getEndOfCombat().addUntil(unanimate); + } else if (sa.hasParam("UntilHostLeavesPlay")) { + source.addLeavesPlayCommand(unanimate); + } else if (sa.hasParam("UntilLoseControlOfHost")) { + sa.getHostCard().addLeavesPlayCommand(unanimate); + sa.getHostCard().addChangeControllerCommand(unanimate); + } else if (sa.hasParam("UntilYourNextUpkeep")) { + game.getUpkeep().addUntil(source.getController(), unanimate); + } else if (sa.hasParam("UntilTheEndOfYourNextUpkeep")) { + if (game.getPhaseHandler().is(PhaseType.UPKEEP)) { + game.getUpkeep().registerUntilEnd(source.getController(), unanimate); + } else { + game.getUpkeep().addUntilEnd(source.getController(), unanimate); + } + } else if (sa.hasParam("UntilControllerNextUntap")) { + game.getUntap().addUntil(c.getController(), unanimate); + } else if (sa.hasParam("UntilAPlayerCastSpell")) { + game.getStack().addCastCommand(sa.getParam("UntilAPlayerCastSpell"), unanimate); + } else if (sa.hasParam("UntilYourNextTurn")) { + game.getCleanup().addUntil(source.getController(), unanimate); + } else { + game.getEndOfTurn().addUntil(unanimate); + } + } } /** *

* doUnanimate. *

- * + * * @param c * a {@link forge.game.card.Card} object. * a {@link java.util.ArrayList} object. diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java index 8b17d3f00c1..e21fa044393 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java @@ -128,7 +128,6 @@ public final class StaticAbilityContinuous { String[] addTriggers = null; String[] addStatics = null; boolean removeAllAbilities = false; - boolean removeIntrinsicAbilities = false; boolean removeNonMana = false; boolean removeSuperTypes = false; boolean removeCardTypes = false; @@ -299,11 +298,6 @@ public final class StaticAbilityContinuous { removeNonMana = true; } } - // do this in type layer too in case of blood moon - if ((layer == StaticAbilityLayer.TYPE) - && params.containsKey("RemoveIntrinsicAbilities")) { - removeIntrinsicAbilities = true; - } if (layer == StaticAbilityLayer.ABILITIES && params.containsKey("AddAbility")) { final String[] sVars = params.get("AddAbility").split(" & "); @@ -612,7 +606,7 @@ public final class StaticAbilityContinuous { // add keywords // TODO regular keywords currently don't try to use keyword multiplier // (Although nothing uses it at this time) - if ((addKeywords != null) || (removeKeywords != null) || removeAllAbilities || removeIntrinsicAbilities) { + if ((addKeywords != null) || (removeKeywords != null) || removeAllAbilities || removeLandTypes) { List newKeywords = null; if (addKeywords != null) { newKeywords = Lists.newArrayList(addKeywords); @@ -654,7 +648,7 @@ public final class StaticAbilityContinuous { } affectedCard.addChangedCardKeywords(newKeywords, removeKeywords, - removeAllAbilities, removeIntrinsicAbilities, + removeAllAbilities, removeLandTypes, hostCard.getTimestamp()); } @@ -795,8 +789,8 @@ public final class StaticAbilityContinuous { } } - if (layer == StaticAbilityLayer.TYPE && removeIntrinsicAbilities) { - affectedCard.addChangedCardTraits(null, null, null, null, null, false, false, removeIntrinsicAbilities, hostCard.getTimestamp()); + if (layer == StaticAbilityLayer.TYPE && removeLandTypes) { + affectedCard.addChangedCardTraits(null, null, null, null, null, false, false, removeLandTypes, hostCard.getTimestamp()); } // add Types diff --git a/forge-gui/res/cardsfolder/b/blood_moon.txt b/forge-gui/res/cardsfolder/b/blood_moon.txt index 85732091147..39a260f18d1 100644 --- a/forge-gui/res/cardsfolder/b/blood_moon.txt +++ b/forge-gui/res/cardsfolder/b/blood_moon.txt @@ -1,7 +1,7 @@ Name:Blood Moon ManaCost:2 R Types:Enchantment -S:Mode$ Continuous | Affected$ Land.nonBasic | AddType$ Mountain | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | Description$ Nonbasic lands are Mountains. +S:Mode$ Continuous | Affected$ Land.nonBasic | AddType$ Mountain | RemoveLandTypes$ True | Description$ Nonbasic lands are Mountains. SVar:NonStackingEffect:True AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/blood_moon.jpg diff --git a/forge-gui/res/cardsfolder/c/celestial_dawn.txt b/forge-gui/res/cardsfolder/c/celestial_dawn.txt index a2e9f626a8f..0321d16c721 100644 --- a/forge-gui/res/cardsfolder/c/celestial_dawn.txt +++ b/forge-gui/res/cardsfolder/c/celestial_dawn.txt @@ -1,7 +1,7 @@ Name:Celestial Dawn ManaCost:1 W W Types:Enchantment -S:Mode$ Continuous | Affected$ Land.YouCtrl | AddType$ Plains | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | Description$ Lands you control are Plains. +S:Mode$ Continuous | Affected$ Land.YouCtrl | AddType$ Plains | RemoveLandTypes$ True | Description$ Lands you control are Plains. S:Mode$ Continuous | Affected$ Card.YouOwn+nonLand | SetColor$ White | AffectedZone$ Hand,Library,Graveyard,Exile,Command | Description$ Nonland permanents you control are white. The same is true for spells you control and nonland cards you own that aren't on the battlefield. S:Mode$ Continuous | Affected$ Card.YouCtrl+nonLand | SetColor$ White | AffectedZone$ Battlefield,Stack S:Mode$ Continuous | Affected$ You | ManaColorConversion$ Additive | WhiteConversion$ Color | Description$ You may spend white mana as though it were mana of any color. diff --git a/forge-gui/res/cardsfolder/c/contaminated_ground.txt b/forge-gui/res/cardsfolder/c/contaminated_ground.txt index 1d0189ebb8a..648210255ee 100644 --- a/forge-gui/res/cardsfolder/c/contaminated_ground.txt +++ b/forge-gui/res/cardsfolder/c/contaminated_ground.txt @@ -3,7 +3,7 @@ ManaCost:1 B Types:Enchantment Aura K:Enchant land A:SP$ Attach | Cost$ 1 B | ValidTgts$ Land | AILogic$ ChangeType -S:Mode$ Continuous | Affected$ Card.EnchantedBy | AddType$ Swamp | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | Description$ Enchanted land is a Swamp. +S:Mode$ Continuous | Affected$ Card.EnchantedBy | AddType$ Swamp | RemoveLandTypes$ True | Description$ Enchanted land is a Swamp. T:Mode$ Taps | ValidCard$ Card.AttachedBy | TriggerZones$ Battlefield | Execute$ TrigLose | TriggerDescription$ Whenever enchanted land becomes tapped, its controller loses 2 life. SVar:TrigLose:DB$LoseLife | Defined$ TriggeredCardController | LifeAmount$ 2 SVar:Picture:http://www.wizards.com/global/images/magic/general/contaminated_ground.jpg diff --git a/forge-gui/res/cardsfolder/c/conversion.txt b/forge-gui/res/cardsfolder/c/conversion.txt index 8e094752971..aaf000296ea 100644 --- a/forge-gui/res/cardsfolder/c/conversion.txt +++ b/forge-gui/res/cardsfolder/c/conversion.txt @@ -2,7 +2,7 @@ Name:Conversion ManaCost:2 W W Types:Enchantment K:UpkeepCost:W W -S:Mode$ Continuous | Affected$ Mountain | AddType$ Plains | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | Description$ All Mountains are Plains. +S:Mode$ Continuous | Affected$ Mountain | AddType$ Plains | RemoveLandTypes$ True | Description$ All Mountains are Plains. AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/conversion.jpg Oracle:At the beginning of your upkeep, sacrifice Conversion unless you pay {W}{W}.\nAll Mountains are Plains. diff --git a/forge-gui/res/cardsfolder/c/convincing_mirage.txt b/forge-gui/res/cardsfolder/c/convincing_mirage.txt index 419a053d23f..da669081975 100644 --- a/forge-gui/res/cardsfolder/c/convincing_mirage.txt +++ b/forge-gui/res/cardsfolder/c/convincing_mirage.txt @@ -5,7 +5,7 @@ K:Enchant land A:SP$ Attach | Cost$ 1 U | ValidTgts$ Land | AILogic$ ChangeType K:ETBReplacement:Other:DBChooseBasic SVar:DBChooseBasic:DB$ ChooseType | Type$ Basic Land | SpellDescription$ As CARDNAME enters the battlefield, choose a basic land type. -S:Mode$ Continuous | Affected$ Card.EnchantedBy | AddType$ ChosenType | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | Description$ Enchanted land is the chosen type. +S:Mode$ Continuous | Affected$ Card.EnchantedBy | AddType$ ChosenType | RemoveLandTypes$ True | Description$ Enchanted land is the chosen type. AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/convincing_mirage.jpg Oracle:Enchant land\nAs Convincing Mirage enters the battlefield, choose a basic land type.\nEnchanted land is the chosen type. diff --git a/forge-gui/res/cardsfolder/c/cyclopean_giant.txt b/forge-gui/res/cardsfolder/c/cyclopean_giant.txt index 4eed7c69d33..d73e01e46a2 100644 --- a/forge-gui/res/cardsfolder/c/cyclopean_giant.txt +++ b/forge-gui/res/cardsfolder/c/cyclopean_giant.txt @@ -3,7 +3,7 @@ ManaCost:2 B B Types:Creature Zombie Giant PT:4/2 T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigAnimate | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, target land becomes a Swamp. Exile CARDNAME. -SVar:TrigAnimate:DB$ Animate | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ Swamp | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | Permanent$ True | SubAbility$ DBExile | SpellDescription$ Target land becomes a Swamp. +SVar:TrigAnimate:DB$ Animate | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ Swamp | RemoveLandTypes$ True | Permanent$ True | SubAbility$ DBExile | SpellDescription$ Target land becomes a Swamp. SVar:DBExile:DB$ ChangeZone | Defined$ TriggeredCardLKICopy | Origin$ Graveyard | Destination$ Exile SVar:Picture:http://www.wizards.com/global/images/magic/general/cyclopean_giant.jpg Oracle:When Cyclopean Giant dies, target land becomes a Swamp. Exile Cyclopean Giant. diff --git a/forge-gui/res/cardsfolder/c/cyclopean_tomb.txt b/forge-gui/res/cardsfolder/c/cyclopean_tomb.txt index fec96905d05..470095acdb4 100644 --- a/forge-gui/res/cardsfolder/c/cyclopean_tomb.txt +++ b/forge-gui/res/cardsfolder/c/cyclopean_tomb.txt @@ -3,7 +3,7 @@ ManaCost:4 Types:Artifact A:AB$ PutCounter | Cost$ 2 T | ValidTgts$ Land.nonSwamp | TgtPrompt$ Select target non-Swamp land | RememberCards$ True | CounterType$ MIRE | CounterNum$ 1 | ActivationPhases$ Upkeep | SubAbility$ DBEffect | SpellDescription$ Put a mire counter on target non-Swamp land. That land is a Swamp for as long as it has a mire counter on it. Activate this ability only during your upkeep. SVar:DBEffect:DB$ Effect | RememberObjects$ Targeted | StaticAbilities$ TombStatic | ForgetOnMoved$ Battlefield | ForgetCounter$ MIRE | Duration$ Permanent -SVar:TombStatic:Mode$ Continuous | EffectZone$ Command | Affected$ Card.IsRemembered | AddType$ Swamp | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | Description$ That land is a Swamp for as long as it has a mire counter on it +SVar:TombStatic:Mode$ Continuous | EffectZone$ Command | Affected$ Card.IsRemembered | AddType$ Swamp | RemoveLandTypes$ True | Description$ That land is a Swamp for as long as it has a mire counter on it T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigEffect | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, at the beginning of each of your upkeeps for the rest of the game, remove all mire counters from a land that a mire counter was put onto with CARDNAME but that a mire counter has not been removed from with CARDNAME. SVar:TrigEffect:DB$ Effect | RememberObjects$ RememberedCard | Triggers$ UpkeepRemove | ForgetOnMoved$ Battlefield | SVars$ TrigRemove,DBRemoveCounter,DBForget,DBClearChosen,DBExileSelf | Duration$ Permanent | SubAbility$ DBClearRemembered SVar:UpkeepRemove:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigRemove | TriggerZones$ Command | TriggerDescription$ At the beginning of your upkeep, remove all mire counters from a land that a mire counter was put onto with Cyclopean Tomb but that a mire counter has not been removed from with Cyclopean Tomb. diff --git a/forge-gui/res/cardsfolder/d/deepwood_elder.txt b/forge-gui/res/cardsfolder/d/deepwood_elder.txt index b4506f45d88..5dd53de111a 100644 --- a/forge-gui/res/cardsfolder/d/deepwood_elder.txt +++ b/forge-gui/res/cardsfolder/d/deepwood_elder.txt @@ -2,7 +2,7 @@ Name:Deepwood Elder ManaCost:G G Types:Creature Dryad Spellshaper PT:2/2 -A:AB$ Animate | Cost$ X G G T Discard<1/Card> | TargetMin$ 0 | TargetMax$ Maxtgt | ValidTgts$ Land | TgtPrompt$ Select target land to become forest | Types$ Forest | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | References$ MaxTgt | SpellDescription$ X target lands become Forests until end of turn. +A:AB$ Animate | Cost$ X G G T Discard<1/Card> | TargetMin$ 0 | TargetMax$ Maxtgt | ValidTgts$ Land | TgtPrompt$ Select target land to become forest | Types$ Forest | RemoveLandTypes$ True | References$ MaxTgt | SpellDescription$ X target lands become Forests until end of turn. SVar:X:TargetedObjects$Amount AI:RemoveDeck:All SVar:Maxtgt:Count$Valid Land diff --git a/forge-gui/res/cardsfolder/d/dreamwinder.txt b/forge-gui/res/cardsfolder/d/dreamwinder.txt index 820a5b3e9a4..bc31862dd2b 100644 --- a/forge-gui/res/cardsfolder/d/dreamwinder.txt +++ b/forge-gui/res/cardsfolder/d/dreamwinder.txt @@ -3,7 +3,7 @@ ManaCost:3 U Types:Creature Serpent PT:4/3 S:Mode$ CantAttack | ValidCard$ Card.Self | UnlessDefenderControls$ Island | Description$ CARDNAME can't attack unless defending player controls an Island. -A:AB$ Animate | Cost$ U Sac<1/Island> | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ Island | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | SpellDescription$ Target land becomes an Island until end of turn. +A:AB$ Animate | Cost$ U Sac<1/Island> | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ Island | RemoveLandTypes$ True | SpellDescription$ Target land becomes an Island until end of turn. AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dreamwinder.jpg Oracle:Dreamwinder can't attack unless defending player controls an Island.\n{U}, Sacrifice an Island: Target land becomes an Island until end of turn. diff --git a/forge-gui/res/cardsfolder/e/evil_presence.txt b/forge-gui/res/cardsfolder/e/evil_presence.txt index bee19fd7e06..bf31a22a2a3 100644 --- a/forge-gui/res/cardsfolder/e/evil_presence.txt +++ b/forge-gui/res/cardsfolder/e/evil_presence.txt @@ -3,6 +3,6 @@ ManaCost:B Types:Enchantment Aura K:Enchant land A:SP$ Attach | Cost$ B | ValidTgts$ Land | AILogic$ ChangeType -S:Mode$ Continuous | Affected$ Card.EnchantedBy | AddType$ Swamp | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | Description$ Enchanted land is a Swamp. +S:Mode$ Continuous | Affected$ Card.EnchantedBy | AddType$ Swamp | RemoveLandTypes$ True | Description$ Enchanted land is a Swamp. SVar:Picture:http://www.wizards.com/global/images/magic/general/evil_presence.jpg Oracle:Enchant land\nEnchanted land is a Swamp. diff --git a/forge-gui/res/cardsfolder/f/floodchaser.txt b/forge-gui/res/cardsfolder/f/floodchaser.txt index c6f4361c863..bae938c73cf 100644 --- a/forge-gui/res/cardsfolder/f/floodchaser.txt +++ b/forge-gui/res/cardsfolder/f/floodchaser.txt @@ -4,7 +4,7 @@ Types:Creature Elemental PT:0/0 K:etbCounter:P1P1:6 S:Mode$ CantAttack | ValidCard$ Card.Self | UnlessDefenderControls$ Island | Description$ CARDNAME can't attack unless defending player controls an Island. -A:AB$ Animate | Cost$ U SubCounter<1/P1P1> | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ Island | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | SpellDescription$ Target land becomes an Island until end of turn. +A:AB$ Animate | Cost$ U SubCounter<1/P1P1> | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ Island | RemoveLandTypes$ True | SpellDescription$ Target land becomes an Island until end of turn. AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/floodchaser.jpg Oracle:Floodchaser enters the battlefield with six +1/+1 counters on it.\nFloodchaser can't attack unless defending player controls an Island.\n{U}, Remove a +1/+1 counter from Floodchaser: Target land becomes an Island until end of turn. diff --git a/forge-gui/res/cardsfolder/g/gaeas_liege.txt b/forge-gui/res/cardsfolder/g/gaeas_liege.txt index 3a3fc92e5d8..28f7ba39b34 100644 --- a/forge-gui/res/cardsfolder/g/gaeas_liege.txt +++ b/forge-gui/res/cardsfolder/g/gaeas_liege.txt @@ -8,7 +8,7 @@ SVar:X:Count$Valid Forest.YouCtrl S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ Y | SetToughness$ Y | CheckSVar$ B | SVarCompare$ EQ1 SVar:B:Count$Valid Card.Self+attacking SVar:Y:Count$Valid Forest.DefenderCtrl -A:AB$ Animate | Cost$ T | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ Forest | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | UntilHostLeavesPlay$ True | SpellDescription$ Target land becomes a Forest until CARDNAME leaves the battlefield. +A:AB$ Animate | Cost$ T | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ Forest | RemoveLandTypes$ True | UntilHostLeavesPlay$ True | SpellDescription$ Target land becomes a Forest until CARDNAME leaves the battlefield. SVar:BuffedBy:Forest AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/gaeas_liege.jpg diff --git a/forge-gui/res/cardsfolder/g/glaciers.txt b/forge-gui/res/cardsfolder/g/glaciers.txt index c338a7812bb..9bf96255c85 100644 --- a/forge-gui/res/cardsfolder/g/glaciers.txt +++ b/forge-gui/res/cardsfolder/g/glaciers.txt @@ -2,7 +2,7 @@ Name:Glaciers ManaCost:2 W U Types:Enchantment K:UpkeepCost:W U -S:Mode$ Continuous | Affected$ Mountain | AddType$ Plains | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | Description$ All Mountains are Plains. +S:Mode$ Continuous | Affected$ Mountain | AddType$ Plains | RemoveLandTypes$ True | Description$ All Mountains are Plains. AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/glaciers.jpg Oracle:At the beginning of your upkeep, sacrifice Glaciers unless you pay {W}{U}.\nAll Mountains are Plains. diff --git a/forge-gui/res/cardsfolder/j/jinx.txt b/forge-gui/res/cardsfolder/j/jinx.txt index 805457ae5f2..a97b4dfefb4 100644 --- a/forge-gui/res/cardsfolder/j/jinx.txt +++ b/forge-gui/res/cardsfolder/j/jinx.txt @@ -2,7 +2,7 @@ Name:Jinx ManaCost:1 U Types:Instant A:SP$ ChooseType | Cost$ 1 U | Defined$ You | Type$ Basic Land | SubAbility$ DBAnimate | SpellDescription$ Target land becomes the basic land type of your choice until end of turn. Draw a card at the beginning of the next turn's upkeep. -SVar:DBAnimate:DB$ Animate | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ ChosenType | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | SubAbility$ DelTrigSlowtrip +SVar:DBAnimate:DB$ Animate | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ ChosenType | RemoveLandTypes$ True | SubAbility$ DelTrigSlowtrip SVar:DelTrigSlowtrip:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ DrawSlowtrip | TriggerDescription$ Draw a card. SVar:DrawSlowtrip:DB$Draw | NumCards$ 1 | Defined$ You AI:RemoveDeck:All diff --git a/forge-gui/res/cardsfolder/k/kavu_recluse.txt b/forge-gui/res/cardsfolder/k/kavu_recluse.txt index a1852cb6e59..157e945dc9a 100644 --- a/forge-gui/res/cardsfolder/k/kavu_recluse.txt +++ b/forge-gui/res/cardsfolder/k/kavu_recluse.txt @@ -2,7 +2,7 @@ Name:Kavu Recluse ManaCost:2 R Types:Creature Kavu PT:2/2 -A:AB$Animate | Cost$ T | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ Forest | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | SpellDescription$ Target land becomes a Forest until end of turn. +A:AB$Animate | Cost$ T | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ Forest | RemoveLandTypes$ True | SpellDescription$ Target land becomes a Forest until end of turn. AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/kavu_recluse.jpg Oracle:{T}: Target land becomes a Forest until end of turn. diff --git a/forge-gui/res/cardsfolder/l/lingering_mirage.txt b/forge-gui/res/cardsfolder/l/lingering_mirage.txt index a517fb4e6dc..78a2ce8f8a4 100644 --- a/forge-gui/res/cardsfolder/l/lingering_mirage.txt +++ b/forge-gui/res/cardsfolder/l/lingering_mirage.txt @@ -3,7 +3,7 @@ ManaCost:1 U Types:Enchantment Aura K:Enchant land A:SP$ Attach | Cost$ 1 U | ValidTgts$ Land | AILogic$ ChangeType -S:Mode$ Continuous | Affected$ Card.EnchantedBy | AddType$ Island | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | Description$ Enchanted land is an Island. +S:Mode$ Continuous | Affected$ Card.EnchantedBy | AddType$ Island | RemoveLandTypes$ True | Description$ Enchanted land is an Island. K:Cycling:2 SVar:Picture:http://www.wizards.com/global/images/magic/general/lingering_mirage.jpg Oracle:Enchant land\nEnchanted land is an Island.\nCycling {2} ({2}, Discard this card: Draw a card.) diff --git a/forge-gui/res/cardsfolder/l/lithoform_blight.txt b/forge-gui/res/cardsfolder/l/lithoform_blight.txt index 9a56afcc3cc..cc9592be324 100755 --- a/forge-gui/res/cardsfolder/l/lithoform_blight.txt +++ b/forge-gui/res/cardsfolder/l/lithoform_blight.txt @@ -5,7 +5,7 @@ K:Enchant land A:SP$ Attach | Cost$ 1 B | ValidTgts$ Land | AITgts$ Land.nonBasic | AILogic$ Curse T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 -S:Mode$ Continuous | Affected$ Land.EnchantedBy | AddType$ Land | RemoveLandTypes$ True | RemoveAllAbilities$ True | AddAbility$ ABManaC & ABManaAny | Description$ Enchanted land loses all land types and abilities and has "{T}: Add {C}" and "{T}, Pay 1 life: Add one mana of any color." +S:Mode$ Continuous | Affected$ Land.EnchantedBy | RemoveLandTypes$ True | RemoveAllAbilities$ True | AddAbility$ ABManaC & ABManaAny | Description$ Enchanted land loses all land types and abilities and has "{T}: Add {C}" and "{T}, Pay 1 life: Add one mana of any color." SVar:ABManaC:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. SVar:ABManaAny:AB$ Mana | Cost$ T PayLife<1> | Produced$ Any | SpellDescription$ Add one mana of any color. Oracle:Enchant land\nWhen Lithoform Blight enters the battlefield, draw a card.\nEnchanted land loses all land types and abilities and has "{T}: Add {C}" and "{T}, Pay 1 life: Add one mana of any color." diff --git a/forge-gui/res/cardsfolder/l/lush_growth.txt b/forge-gui/res/cardsfolder/l/lush_growth.txt index 9f514786b34..f20661c34ad 100644 --- a/forge-gui/res/cardsfolder/l/lush_growth.txt +++ b/forge-gui/res/cardsfolder/l/lush_growth.txt @@ -3,7 +3,7 @@ ManaCost:G Types:Enchantment Aura K:Enchant land A:SP$ Attach | Cost$ G | ValidTgts$ Land | AILogic$ Pump -S:Mode$ Continuous | Affected$ Card.EnchantedBy | AddType$ Mountain & Forest & Plains | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | Description$ Enchanted land is a Mountain, Forest, and Plains. +S:Mode$ Continuous | Affected$ Card.EnchantedBy | AddType$ Mountain & Forest & Plains | RemoveLandTypes$ True | Description$ Enchanted land is a Mountain, Forest, and Plains. AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/lush_growth.jpg Oracle:Enchant land\nEnchanted land is a Mountain, Forest, and Plains. diff --git a/forge-gui/res/cardsfolder/m/magus_of_the_moon.txt b/forge-gui/res/cardsfolder/m/magus_of_the_moon.txt index 8567ab0b4e1..28c1818c3cd 100644 --- a/forge-gui/res/cardsfolder/m/magus_of_the_moon.txt +++ b/forge-gui/res/cardsfolder/m/magus_of_the_moon.txt @@ -2,7 +2,7 @@ Name:Magus of the Moon ManaCost:2 R Types:Creature Human Wizard PT:2/2 -S:Mode$ Continuous | Affected$ Land.nonBasic | AddType$ Mountain | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | Description$ Nonbasic lands are Mountains. +S:Mode$ Continuous | Affected$ Land.nonBasic | AddType$ Mountain | RemoveLandTypes$ True | Description$ Nonbasic lands are Mountains. AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/magus_of_the_moon.jpg Oracle:Nonbasic lands are Mountains. diff --git a/forge-gui/res/cardsfolder/o/orcish_farmer.txt b/forge-gui/res/cardsfolder/o/orcish_farmer.txt index ab59e439cbc..769fc3e99ca 100644 --- a/forge-gui/res/cardsfolder/o/orcish_farmer.txt +++ b/forge-gui/res/cardsfolder/o/orcish_farmer.txt @@ -2,7 +2,7 @@ Name:Orcish Farmer ManaCost:1 R R Types:Creature Orc PT:2/2 -A:AB$ Animate | Cost$ T | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ Swamp | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | UntilControllerNextUntap$ True | SpellDescription$ Target land becomes a Swamp until its controller's next untap step. +A:AB$ Animate | Cost$ T | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ Swamp | RemoveLandTypes$ True | UntilControllerNextUntap$ True | SpellDescription$ Target land becomes a Swamp until its controller's next untap step. AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/orcish_farmer.jpg Oracle:{T}: Target land becomes a Swamp until its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/p/phantasmal_terrain.txt b/forge-gui/res/cardsfolder/p/phantasmal_terrain.txt index 05fcf07f003..6dd6c57ebce 100644 --- a/forge-gui/res/cardsfolder/p/phantasmal_terrain.txt +++ b/forge-gui/res/cardsfolder/p/phantasmal_terrain.txt @@ -5,7 +5,7 @@ K:Enchant land A:SP$ Attach | Cost$ U U | ValidTgts$ Land | AILogic$ ChangeType K:ETBReplacement:Other:DBChooseBasic SVar:DBChooseBasic:DB$ ChooseType | Type$ Basic Land | SpellDescription$ As CARDNAME enters the battlefield, choose a basic land type. -S:Mode$ Continuous | Affected$ Card.EnchantedBy | AddType$ ChosenType | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | Description$ Enchanted land is the chosen type. +S:Mode$ Continuous | Affected$ Card.EnchantedBy | AddType$ ChosenType | RemoveLandTypes$ True | Description$ Enchanted land is the chosen type. AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/phantasmal_terrain.jpg Oracle:Enchant land\nAs Phantasmal Terrain enters the battlefield, choose a basic land type.\nEnchanted land is the chosen type. diff --git a/forge-gui/res/cardsfolder/q/quicksilver_fountain.txt b/forge-gui/res/cardsfolder/q/quicksilver_fountain.txt index e0ad88525bb..e34c4ba9c9d 100644 --- a/forge-gui/res/cardsfolder/q/quicksilver_fountain.txt +++ b/forge-gui/res/cardsfolder/q/quicksilver_fountain.txt @@ -4,7 +4,7 @@ Types:Artifact T:Mode$ Phase | Phase$ Upkeep | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of each player's upkeep, that player puts a flood counter on target non-Island land they control of their choice. That land is an Island for as long as it has a flood counter on it. SVar:TrigPutCounter:DB$ PutCounter | TargetingPlayer$ TriggeredPlayer | ValidTgts$ Land.ActivePlayerCtrl+nonIsland | TgtPrompt$ Select target non-Island land you control | CounterType$ FLOOD | CounterNum$ 1 | Placer$ TriggeredPlayer | SubAbility$ DBEffect SVar:DBEffect:DB$ Effect | RememberObjects$ Targeted | StaticAbilities$ FountainStatic | ForgetOnMoved$ Battlefield | ForgetCounter$ FLOOD | Duration$ Permanent -SVar:FountainStatic:Mode$ Continuous | EffectZone$ Command | Affected$ Card.IsRemembered | AddType$ Island | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | Description$ That land is an Island for as long as it has a flood counter on it. +SVar:FountainStatic:Mode$ Continuous | EffectZone$ Command | Affected$ Card.IsRemembered | AddType$ Island | RemoveLandTypes$ True | Description$ That land is an Island for as long as it has a flood counter on it. T:Mode$ Phase | Phase$ End of Turn | IsPresent$ Land.nonIsland | PresentCompare$ EQ0 | TriggerZones$ Battlefield | Execute$ TrigRemoveAll | TriggerDescription$ At the beginning of each end step, if all lands on the battlefield are Islands, remove all flood counters from them. SVar:TrigRemoveAll:DB$ RemoveCounterAll | ValidCards$ Land | CounterType$ FLOOD | AllCounters$ True AI:RemoveDeck:Random diff --git a/forge-gui/res/cardsfolder/s/seas_claim.txt b/forge-gui/res/cardsfolder/s/seas_claim.txt index 961ef91e3f6..3e0e373b7b1 100644 --- a/forge-gui/res/cardsfolder/s/seas_claim.txt +++ b/forge-gui/res/cardsfolder/s/seas_claim.txt @@ -3,6 +3,6 @@ ManaCost:U Types:Enchantment Aura K:Enchant land A:SP$ Attach | Cost$ U | ValidTgts$ Land | AILogic$ ChangeType -S:Mode$ Continuous | Affected$ Card.EnchantedBy | AddType$ Island | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | Description$ Enchanted land is an Island. +S:Mode$ Continuous | Affected$ Card.EnchantedBy | AddType$ Island | RemoveLandTypes$ True | Description$ Enchanted land is an Island. SVar:Picture:http://www.wizards.com/global/images/magic/general/seas_claim.jpg Oracle:Enchant land (Target a land as you cast this. This card enters the battlefield attached to that land.)\nEnchanted land is an Island. diff --git a/forge-gui/res/cardsfolder/s/shimmering_mirage.txt b/forge-gui/res/cardsfolder/s/shimmering_mirage.txt index 2444854c258..53145265251 100644 --- a/forge-gui/res/cardsfolder/s/shimmering_mirage.txt +++ b/forge-gui/res/cardsfolder/s/shimmering_mirage.txt @@ -2,7 +2,7 @@ Name:Shimmering Mirage ManaCost:1 U Types:Instant A:SP$ ChooseType | Cost$ 1 U | Defined$ You | Type$ Basic Land | SubAbility$ DBAnimate | SpellDescription$ Target land becomes the basic land type of your choice until end of turn. Draw a card. -SVar:DBAnimate:DB$ Animate | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ ChosenType | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | SubAbility$ DBDraw +SVar:DBAnimate:DB$ Animate | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ ChosenType | RemoveLandTypes$ True | SubAbility$ DBDraw SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/shimmering_mirage.jpg diff --git a/forge-gui/res/cardsfolder/s/slimy_kavu.txt b/forge-gui/res/cardsfolder/s/slimy_kavu.txt index c5c9f7f4eb3..e66b7ba0adf 100644 --- a/forge-gui/res/cardsfolder/s/slimy_kavu.txt +++ b/forge-gui/res/cardsfolder/s/slimy_kavu.txt @@ -2,7 +2,7 @@ Name:Slimy Kavu ManaCost:2 R Types:Creature Kavu PT:2/2 -A:AB$ Animate | Cost$ T | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ Swamp | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | SpellDescription$ Target land becomes a Swamp until end of turn. +A:AB$ Animate | Cost$ T | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ Swamp | RemoveLandTypes$ True | SpellDescription$ Target land becomes a Swamp until end of turn. AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/slimy_kavu.jpg Oracle:{T}: Target land becomes a Swamp until end of turn. diff --git a/forge-gui/res/cardsfolder/s/song_of_the_dryads.txt b/forge-gui/res/cardsfolder/s/song_of_the_dryads.txt index 67715fd7f70..60ffebcea8e 100644 --- a/forge-gui/res/cardsfolder/s/song_of_the_dryads.txt +++ b/forge-gui/res/cardsfolder/s/song_of_the_dryads.txt @@ -3,7 +3,7 @@ ManaCost:2 G Types:Enchantment Aura K:Enchant permanent A:SP$ Attach | Cost$ 2 G | ValidTgts$ Permanent | AILogic$ Curse | AITgts$ Card.cmcGE3 -S:Mode$ Continuous | Affected$ Card.EnchantedBy | SetColor$ Colorless | AddType$ Land & Forest | RemoveCardTypes$ True | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | Description$ Enchanted permanent is a colorless Forest land. +S:Mode$ Continuous | Affected$ Card.EnchantedBy | SetColor$ Colorless | AddType$ Land & Forest | RemoveCardTypes$ True | RemoveLandTypes$ True | Description$ Enchanted permanent is a colorless Forest land. SVar:NonStackingAttachEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/song_of_the_dryads.jpg Oracle:Enchant permanent\nEnchanted permanent is a colorless Forest land. diff --git a/forge-gui/res/cardsfolder/s/spreading_seas.txt b/forge-gui/res/cardsfolder/s/spreading_seas.txt index b7d7d105205..1e56035817d 100644 --- a/forge-gui/res/cardsfolder/s/spreading_seas.txt +++ b/forge-gui/res/cardsfolder/s/spreading_seas.txt @@ -3,7 +3,7 @@ ManaCost:1 U Types:Enchantment Aura K:Enchant land A:SP$ Attach | Cost$ 1 U | ValidTgts$ Land | AILogic$ ChangeType -S:Mode$ Continuous | Affected$ Card.EnchantedBy | AddType$ Island | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | Description$ Enchanted land is an Island. +S:Mode$ Continuous | Affected$ Card.EnchantedBy | AddType$ Island | RemoveLandTypes$ True | Description$ Enchanted land is an Island. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ 1 SVar:Picture:http://www.wizards.com/global/images/magic/general/spreading_seas.jpg diff --git a/forge-gui/res/cardsfolder/s/streambed_aquitects.txt b/forge-gui/res/cardsfolder/s/streambed_aquitects.txt index ad6515c4fa5..82fe45b990d 100644 --- a/forge-gui/res/cardsfolder/s/streambed_aquitects.txt +++ b/forge-gui/res/cardsfolder/s/streambed_aquitects.txt @@ -3,6 +3,6 @@ ManaCost:1 U U Types:Creature Merfolk Scout PT:2/3 A:AB$ Pump | Cost$ T | ValidTgts$ Merfolk | TgtPrompt$ Select target Merfolk creature | NumAtt$ +1 | NumDef$ +1 | KW$ Islandwalk | SpellDescription$ Target Merfolk creature gets +1/+1 and gains islandwalk until end of turn. -A:AB$ Animate | Cost$ T | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ Island | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | SpellDescription$ Target land becomes an Island until end of turn. +A:AB$ Animate | Cost$ T | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ Island | RemoveLandTypes$ True | SpellDescription$ Target land becomes an Island until end of turn. SVar:Picture:http://www.wizards.com/global/images/magic/general/streambed_aquitects.jpg Oracle:{T}: Target Merfolk creature gets +1/+1 and gains islandwalk until end of turn. (It can't be blocked as long as defending player controls an Island.)\n{T}: Target land becomes an Island until end of turn. diff --git a/forge-gui/res/cardsfolder/t/tainted_well.txt b/forge-gui/res/cardsfolder/t/tainted_well.txt index a7d6b83352f..da7365bd7b4 100644 --- a/forge-gui/res/cardsfolder/t/tainted_well.txt +++ b/forge-gui/res/cardsfolder/t/tainted_well.txt @@ -3,7 +3,7 @@ ManaCost:2 B Types:Enchantment Aura K:Enchant land A:SP$ Attach | Cost$ 2 B | ValidTgts$ Land | AILogic$ ChangeType -S:Mode$ Continuous | Affected$ Card.EnchantedBy | AddType$ Swamp | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | Description$ Enchanted land is a Swamp. +S:Mode$ Continuous | Affected$ Card.EnchantedBy | AddType$ Swamp | RemoveLandTypes$ True | Description$ Enchanted land is a Swamp. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ 1 SVar:Picture:http://www.wizards.com/global/images/magic/general/tainted_well.jpg diff --git a/forge-gui/res/cardsfolder/t/thelonite_monk.txt b/forge-gui/res/cardsfolder/t/thelonite_monk.txt index 2b0a9b78c62..22fe87e4c0b 100644 --- a/forge-gui/res/cardsfolder/t/thelonite_monk.txt +++ b/forge-gui/res/cardsfolder/t/thelonite_monk.txt @@ -2,7 +2,7 @@ Name:Thelonite Monk ManaCost:2 G G Types:Creature Insect Monk Cleric PT:1/2 -A:AB$ Animate | Cost$ T Sac<1/Creature.Green/green creature> | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ Forest | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | Permanent$ True | SpellDescription$ Target land becomes a Forest. (This effect lasts indefinitely.) +A:AB$ Animate | Cost$ T Sac<1/Creature.Green/green creature> | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ Forest | RemoveLandTypes$ True | Permanent$ True | SpellDescription$ Target land becomes a Forest. (This effect lasts indefinitely.) SVar:AIPreference:SacCost$Creature.Green+token AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/thelonite_monk.jpg diff --git a/forge-gui/res/cardsfolder/t/tidal_warrior.txt b/forge-gui/res/cardsfolder/t/tidal_warrior.txt index 8fcb15b820c..fb356571a8a 100644 --- a/forge-gui/res/cardsfolder/t/tidal_warrior.txt +++ b/forge-gui/res/cardsfolder/t/tidal_warrior.txt @@ -2,7 +2,7 @@ Name:Tidal Warrior ManaCost:U Types:Creature Merfolk Warrior PT:1/1 -A:AB$ Animate | Cost$ T | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ Island | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | SpellDescription$ Target land becomes an Island until end of turn. +A:AB$ Animate | Cost$ T | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ Island | RemoveLandTypes$ True | SpellDescription$ Target land becomes an Island until end of turn. AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/tidal_warrior.jpg Oracle:{T}: Target land becomes an Island until end of turn. diff --git a/forge-gui/res/cardsfolder/t/tundra_kavu.txt b/forge-gui/res/cardsfolder/t/tundra_kavu.txt index 5459c77f192..de019410a6f 100644 --- a/forge-gui/res/cardsfolder/t/tundra_kavu.txt +++ b/forge-gui/res/cardsfolder/t/tundra_kavu.txt @@ -4,8 +4,8 @@ Types:Creature Kavu PT:2/2 A:AB$ Pump | Cost$ T | ValidTgts$ Land | TgtPrompt$ Select target land | SubAbility$ TypeChoice | StackDescription$ Target land becomes a | SpellDescription$ Target land becomes a Plains or an Island until end of turn. SVar:TypeChoice:DB$ GenericChoice | Choices$ SVar1,SVar2 | StackDescription$ Plains or an Island until end of turn. -SVar:SVar1:DB$ Animate | Defined$ Targeted | Types$ Plains | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | SpellDescription$ Targeted land becomes a Plains until end of turn. -SVar:SVar2:DB$ Animate | Defined$ Targeted | Types$ Island | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | SpellDescription$ Targeted land becomes an Island until end of turn. +SVar:SVar1:DB$ Animate | Defined$ Targeted | Types$ Plains | RemoveLandTypes$ True | SpellDescription$ Targeted land becomes a Plains until end of turn. +SVar:SVar2:DB$ Animate | Defined$ Targeted | Types$ Island | RemoveLandTypes$ True | SpellDescription$ Targeted land becomes an Island until end of turn. AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/tundra_kavu.jpg Oracle:{T}: Target land becomes a Plains or an Island until end of turn. diff --git a/forge-gui/res/cardsfolder/v/vision_charm.txt b/forge-gui/res/cardsfolder/v/vision_charm.txt index d9caf7f58ff..b56796bb997 100644 --- a/forge-gui/res/cardsfolder/v/vision_charm.txt +++ b/forge-gui/res/cardsfolder/v/vision_charm.txt @@ -6,7 +6,7 @@ SVar:MillOpp:DB$ Mill | NumCards$ 4 | ValidTgts$ Player | TgtPrompt$ Choose a pl SVar:ChangeType:DB$ ChooseType | Defined$ You | Type$ Land | SubAbility$ RemFirstLand | SpellDescription$ Choose a land type and a basic land type. Each land of the first chosen type becomes the second chosen type until end of turn. SVar:RemFirstLand:DB$ PumpAll | ValidCards$ Land.ChosenType | RememberAllPumped$ True | SubAbility$ ChooseType2 SVar:ChooseType2:DB$ ChooseType | Defined$ You | Type$ Basic Land | AILogic$ MostNeededType | SubAbility$ AnimateFirst -SVar:AnimateFirst:DB$ AnimateAll | ValidCards$ Land.IsRemembered | Types$ ChosenType | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | SubAbility$ DBCleanup +SVar:AnimateFirst:DB$ AnimateAll | ValidCards$ Land.IsRemembered | Types$ ChosenType | RemoveLandTypes$ True | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:PhaseArtifact:DB$ Phases | ValidTgts$ Artifact | TgtPrompt$ Choose a artifact | SpellDescription$ Target artifact phases out. AI:RemoveDeck:All diff --git a/forge-gui/res/cardsfolder/z/zombie_trailblazer.txt b/forge-gui/res/cardsfolder/z/zombie_trailblazer.txt index 556350188a3..81ee86241e2 100644 --- a/forge-gui/res/cardsfolder/z/zombie_trailblazer.txt +++ b/forge-gui/res/cardsfolder/z/zombie_trailblazer.txt @@ -2,7 +2,7 @@ Name:Zombie Trailblazer ManaCost:B B B Types:Creature Zombie Scout PT:2/2 -A:AB$ Animate | Cost$ tapXType<1/Zombie> | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ Swamp | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | SpellDescription$ Target land becomes a Swamp until end of turn. +A:AB$ Animate | Cost$ tapXType<1/Zombie> | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ Swamp | RemoveLandTypes$ True | SpellDescription$ Target land becomes a Swamp until end of turn. A:AB$ Pump | Cost$ tapXType<1/Zombie> | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Swampwalk | SpellDescription$ Target creature gains swampwalk until end of turn. AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/zombie_trailblazer.jpg