mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-17 03:08:02 +00:00
AnimateEffect: combine into the BaseEffect, remove not needed RemoveIntrinsicAbilities
This commit is contained in:
committed by
Michael Kamensky
parent
a492a52fe1
commit
460960123e
@@ -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<SpellAbility> 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<SpellAbility> 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<Trigger> 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<ReplacementEffect> 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<StaticAbility> 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);
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
@@ -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<Player> getTargetPlayers(final SpellAbility sa) { return getPlayers(false, "Defined", sa); }
|
||||
protected final static FCollection<Player> getTargetPlayers(final SpellAbility sa, final String definedParam) { return getPlayers(false, definedParam, sa); }
|
||||
protected final static FCollection<Player> getDefinedPlayersOrTargeted(final SpellAbility sa ) { return getPlayers(true, "Defined", sa); }
|
||||
protected final static FCollection<Player> 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<Player> 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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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<Player> 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<SpellAbility> 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<ReplacementEffect> 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<Trigger> 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));
|
||||
|
||||
|
||||
@@ -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<SpellAbility> 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<SpellAbility> 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<Trigger> 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<ReplacementEffect> 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<StaticAbility> 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));
|
||||
}
|
||||
|
||||
|
||||
@@ -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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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<String> keywords, final List<String> removeKeywords,
|
||||
final List<String> hiddenKeywords, final long timestamp) {
|
||||
final List<String> keywords, final List<String> removeKeywords, final List<String> hiddenKeywords,
|
||||
List<String> abilities, final List<String> triggers, final List<String> replacements, final List<String> 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<SpellAbility> 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<SpellAbility> addedAbilities = Lists.newArrayList();
|
||||
for (final String s : abilities) {
|
||||
addedAbilities.add(AbilityFactory.getAbility(AbilityUtils.getSVar(sa, s), c));
|
||||
}
|
||||
|
||||
// Grant triggers
|
||||
final List<Trigger> addedTriggers = Lists.newArrayList();
|
||||
for (final String s : triggers) {
|
||||
addedTriggers.add(TriggerHandler.parseTrigger(AbilityUtils.getSVar(sa, s), c, false));
|
||||
}
|
||||
|
||||
// give replacement effects
|
||||
final List<ReplacementEffect> 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<StaticAbility> 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* doUnanimate.
|
||||
* </p>
|
||||
*
|
||||
*
|
||||
* @param c
|
||||
* a {@link forge.game.card.Card} object.
|
||||
* a {@link java.util.ArrayList} object.
|
||||
|
||||
@@ -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<String> 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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.)
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user