Merge branch 'Card-Forge:master' into master

This commit is contained in:
Suthro
2022-06-12 12:59:50 -05:00
committed by GitHub
120 changed files with 1394 additions and 358 deletions

View File

@@ -3,7 +3,7 @@
<parent> <parent>
<artifactId>forge</artifactId> <artifactId>forge</artifactId>
<groupId>forge</groupId> <groupId>forge</groupId>
<version>1.6.51-SNAPSHOT</version> <version>1.6.54-SNAPSHOT</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
@@ -290,7 +290,7 @@
<dependency> <dependency>
<groupId>forge</groupId> <groupId>forge</groupId>
<artifactId>forge-gui-mobile</artifactId> <artifactId>forge-gui-mobile</artifactId>
<version>1.6.51-SNAPSHOT</version> <version>1.6.54-SNAPSHOT</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
</dependencies> </dependencies>

View File

@@ -6,7 +6,7 @@
<parent> <parent>
<artifactId>forge</artifactId> <artifactId>forge</artifactId>
<groupId>forge</groupId> <groupId>forge</groupId>
<version>1.6.51-SNAPSHOT</version> <version>1.6.54-SNAPSHOT</version>
</parent> </parent>
<artifactId>forge-ai</artifactId> <artifactId>forge-ai</artifactId>

View File

@@ -1925,8 +1925,8 @@ public class AiController {
return Math.min(player.getLife() -1,MyRandom.getRandom().nextInt(Math.max(player.getLife() / 3, player.getWeakestOpponent().getLife())) + 1); return Math.min(player.getLife() -1,MyRandom.getRandom().nextInt(Math.max(player.getLife() / 3, player.getWeakestOpponent().getLife())) + 1);
} else if ("HighestGetCounter".equals(logic)) { } else if ("HighestGetCounter".equals(logic)) {
return MyRandom.getRandom().nextInt(3); return MyRandom.getRandom().nextInt(3);
} else if (source.hasSVar("EnergyToPay")) { } else if (sa.hasSVar("EnergyToPay")) {
return AbilityUtils.calculateAmount(source, source.getSVar("EnergyToPay"), sa); return AbilityUtils.calculateAmount(source, sa.getSVar("EnergyToPay"), sa);
} else if ("Vermin".equals(logic)) { } else if ("Vermin".equals(logic)) {
return MyRandom.getRandom().nextInt(Math.max(player.getLife() - 5, 0)); return MyRandom.getRandom().nextInt(Math.max(player.getLife() - 5, 0));
} else if ("SweepCreatures".equals(logic)) { } else if ("SweepCreatures".equals(logic)) {

View File

@@ -185,7 +185,6 @@ public enum SpellApiToAi {
.put(ApiType.WinsGame, GameWinAi.class) .put(ApiType.WinsGame, GameWinAi.class)
.put(ApiType.DamageResolve, AlwaysPlayAi.class) .put(ApiType.DamageResolve, AlwaysPlayAi.class)
.put(ApiType.InternalEtbReplacement, CanPlayAsDrawbackAi.class)
.put(ApiType.InternalLegendaryRule, LegendaryRuleAi.class) .put(ApiType.InternalLegendaryRule, LegendaryRuleAi.class)
.put(ApiType.InternalIgnoreEffect, CannotPlayAi.class) .put(ApiType.InternalIgnoreEffect, CannotPlayAi.class)
.build()); .build());

View File

@@ -500,17 +500,19 @@ public class AnimateAi extends SpellAbilityAi {
} }
// give sVars // give sVars
if (sVars.size() > 0) { if (sa.hasParam("sVars")) {
for (final String s : sVars) { Map<String, String> sVarsMap = Maps.newHashMap();
String actualsVar = source.getSVar(s); for (final String s : sa.getParam("sVars").split(",")) {
String actualsVar = AbilityUtils.getSVar(sa, s);
String name = s; String name = s;
if (actualsVar.startsWith("SVar:")) { if (actualsVar.startsWith("SVar:")) {
actualsVar = actualsVar.split("SVar:")[1]; actualsVar = actualsVar.split("SVar:")[1];
name = actualsVar.split(":")[0]; name = actualsVar.split(":")[0];
actualsVar = actualsVar.split(":")[1]; actualsVar = actualsVar.split(":")[1];
} }
card.setSVar(name, actualsVar); sVarsMap.put(name, actualsVar);
} }
card.addChangedSVars(sVarsMap, timestamp, 0);
} }
ComputerUtilCard.applyStaticContPT(game, card, null); ComputerUtilCard.applyStaticContPT(game, card, null);
} }

View File

@@ -1,35 +0,0 @@
package forge.ai.ability;
import forge.ai.SpellAbilityAi;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
public class CanPlayAsDrawbackAi extends SpellAbilityAi {
/* (non-Javadoc)
* @see forge.card.abilityfactory.SpellAiLogic#canPlayAI(forge.game.player.Player, java.util.Map, forge.card.spellability.SpellAbility)
*/
@Override
protected boolean canPlayAI(Player aiPlayer, SpellAbility sa) {
return false;
}
/**
* <p>
* copySpellTriggerAI.
* </p>
* @param sa
* a {@link forge.game.spellability.SpellAbility} object.
* @param mandatory
* a boolean.
* @param af
* a {@link forge.game.ability.AbilityFactory} object.
*
* @return a boolean.
*/
@Override
protected boolean doTriggerAINoCost(Player aiPlayer, SpellAbility sa, boolean mandatory) {
return false;
}
}

View File

@@ -53,6 +53,7 @@ import forge.util.MyRandom;
public class DamageDealAi extends DamageAiBase { public class DamageDealAi extends DamageAiBase {
@Override @Override
public boolean chkAIDrawback(SpellAbility sa, Player ai) { public boolean chkAIDrawback(SpellAbility sa, Player ai) {
final SpellAbility root = sa.getRootAbility();
final String damage = sa.getParam("NumDmg"); final String damage = sa.getParam("NumDmg");
Card source = sa.getHostCard(); Card source = sa.getHostCard();
int dmg = AbilityUtils.calculateAmount(source, damage, sa); int dmg = AbilityUtils.calculateAmount(source, damage, sa);
@@ -76,7 +77,7 @@ public class DamageDealAi extends DamageAiBase {
if (dmg > energy || dmg < 1) { if (dmg > energy || dmg < 1) {
continue; // in case the calculation gets messed up somewhere continue; // in case the calculation gets messed up somewhere
} }
source.setSVar("EnergyToPay", "Number$" + dmg); root.setSVar("EnergyToPay", "Number$" + dmg);
return true; return true;
} }
} }

View File

@@ -731,7 +731,7 @@ public class PumpAi extends PumpAiBase {
if (minus > energy || minus < 1) { if (minus > energy || minus < 1) {
continue; // in case the calculation gets messed up somewhere continue; // in case the calculation gets messed up somewhere
} }
source.setSVar("EnergyToPay", "Number$" + minus); root.setSVar("EnergyToPay", "Number$" + minus);
return true; return true;
} }
} }

View File

@@ -6,7 +6,7 @@
<parent> <parent>
<artifactId>forge</artifactId> <artifactId>forge</artifactId>
<groupId>forge</groupId> <groupId>forge</groupId>
<version>1.6.51-SNAPSHOT</version> <version>1.6.54-SNAPSHOT</version>
</parent> </parent>
<artifactId>forge-core</artifactId> <artifactId>forge-core</artifactId>

View File

@@ -6,7 +6,7 @@
<parent> <parent>
<artifactId>forge</artifactId> <artifactId>forge</artifactId>
<groupId>forge</groupId> <groupId>forge</groupId>
<version>1.6.51-SNAPSHOT</version> <version>1.6.54-SNAPSHOT</version>
</parent> </parent>
<artifactId>forge-game</artifactId> <artifactId>forge-game</artifactId>

View File

@@ -55,15 +55,13 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView,
/** Keys of descriptive (text) parameters. */ /** Keys of descriptive (text) parameters. */
private static final ImmutableList<String> descriptiveKeys = ImmutableList.<String>builder() private static final ImmutableList<String> descriptiveKeys = ImmutableList.<String>builder()
.add("Description", "SpellDescription", "StackDescription", "TriggerDescription").build(); .add("Description", "SpellDescription", "StackDescription", "TriggerDescription").build();
/** Keys to be followed as SVar names when changing text. */
private static final ImmutableList<String> mutableKeys = ImmutableList.<String>builder()
.add("AddAbility").build();
/** /**
* Keys that should not changed * Keys that should not changed
*/ */
private static final ImmutableList<String> noChangeKeys = ImmutableList.<String>builder() private static final ImmutableList<String> noChangeKeys = ImmutableList.<String>builder()
.add("TokenScript", "LegacyImage", "TokenImage", "NewName", "ChooseFromList").build(); .add("TokenScript", "LegacyImage", "TokenImage", "NewName", "ChooseFromList")
.add("AddAbility").build();
/** /**
* <p> * <p>
@@ -259,6 +257,18 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView,
} }
if (params.containsKey("Revolt")) { if (params.containsKey("Revolt")) {
if ("True".equalsIgnoreCase(params.get("Revolt")) != hostController.hasRevolt()) return false; if ("True".equalsIgnoreCase(params.get("Revolt")) != hostController.hasRevolt()) return false;
else if ("None".equalsIgnoreCase(params.get("Revolt"))) {
boolean none = true;
for (Player p : game.getRegisteredPlayers()) {
if (p.hasRevolt()) {
none = false;
break;
}
}
if (!none) {
return false;
}
}
} }
if (params.containsKey("Desert")) { if (params.containsKey("Desert")) {
if ("True".equalsIgnoreCase(params.get("Desert")) != hostController.hasDesert()) return false; if ("True".equalsIgnoreCase(params.get("Desert")) != hostController.hasDesert()) return false;
@@ -422,6 +432,16 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView,
if (!Expressions.compare(sVar, svarOperator, operandValue)) { if (!Expressions.compare(sVar, svarOperator, operandValue)) {
return false; return false;
} }
if (hasParam("CheckSecondSVar")) {
final int sVar2 = AbilityUtils.calculateAmount(this.hostCard, getParam("CheckSecondSVar"), this);
final String comparator2 = getParamOrDefault("SecondSVarCompare", "GE1");
final String svarOperator2 = comparator2.substring(0, 2);
final String svarOperand2 = comparator2.substring(2);
final int operandValue2 = AbilityUtils.calculateAmount(this.hostCard, svarOperand2, this);
if (!Expressions.compare(sVar2, svarOperator2, operandValue2)) {
return false;
}
}
} }
if (params.containsKey("ManaSpent")) { if (params.containsKey("ManaSpent")) {
@@ -489,11 +509,6 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView,
} else if (descriptiveKeys.contains(key)) { } else if (descriptiveKeys.contains(key)) {
// change descriptions differently // change descriptions differently
newValue = AbilityUtils.applyDescriptionTextChangeEffects(value, this); newValue = AbilityUtils.applyDescriptionTextChangeEffects(value, this);
} else if (mutableKeys.contains(key)) {
// follow SVar and change it
final String originalSVarValue = hostCard.getSVar(value);
hostCard.changeSVar(value, AbilityUtils.applyAbilityTextChangeEffects(originalSVarValue, this));
newValue = null;
} else if (this.getHostCard().hasSVar(value)) { } else if (this.getHostCard().hasSVar(value)) {
// don't change literal SVar names! // don't change literal SVar names!
newValue = null; newValue = null;

View File

@@ -233,13 +233,6 @@ public class GameAction {
} }
} }
// Clean up the temporary Dash/Blitz SVar when the card leaves the battlefield
// Clean up the temporary AtEOT SVar
String endofTurn = c.getSVar("EndOfTurnLeavePlay");
if (fromBattlefield && (endofTurn.equals("Dash") || endofTurn.equals("Blitz") || endofTurn.equals("AtEOT"))) {
c.removeSVar("EndOfTurnLeavePlay");
}
if (fromBattlefield && !toBattlefield) { if (fromBattlefield && !toBattlefield) {
c.getController().setRevolt(true); c.getController().setRevolt(true);
} }
@@ -337,7 +330,7 @@ public class GameAction {
CardCollectionView comCards = c.getOwner().getCardsIn(ZoneType.Command); CardCollectionView comCards = c.getOwner().getCardsIn(ZoneType.Command);
for (final Card effCard : comCards) { for (final Card effCard : comCards) {
for (final ReplacementEffect re : effCard.getReplacementEffects()) { for (final ReplacementEffect re : effCard.getReplacementEffects()) {
if (re.hasSVar("CommanderMoveReplacement") && effCard.getEffectSource().getName().equals(c.getRealCommander().getName())) { if (re.hasParam("CommanderMoveReplacement") && effCard.getEffectSource().getName().equals(c.getRealCommander().getName())) {
commanderEffect = effCard; commanderEffect = effCard;
break; break;
} }
@@ -365,7 +358,7 @@ public class GameAction {
} }
ReplacementResult repres = game.getReplacementHandler().run(ReplacementType.Moved, repParams); ReplacementResult repres = game.getReplacementHandler().run(ReplacementType.Moved, repParams);
if (repres != ReplacementResult.NotReplaced) { if (repres != ReplacementResult.NotReplaced && repres != ReplacementResult.Updated) {
// reset failed manifested Cards back to original // reset failed manifested Cards back to original
if (c.isManifested() && !c.isInPlay()) { if (c.isManifested() && !c.isInPlay()) {
c.forceTurnFaceUp(); c.forceTurnFaceUp();

View File

@@ -677,13 +677,12 @@ public final class GameActionUtil {
if (!StringUtils.isNumeric(amount)) { if (!StringUtils.isNumeric(amount)) {
sa.setSVar(amount, sourceCard.getSVar(amount)); sa.setSVar(amount, sourceCard.getSVar(amount));
} }
CardFactoryUtil.setupETBReplacementAbility(sa);
String desc = "It enters the battlefield with "; String desc = "It enters the battlefield with ";
desc += Lang.nounWithNumeral(amount, CounterType.getType(counter).getName() + " counter"); desc += Lang.nounWithNumeral(amount, CounterType.getType(counter).getName() + " counter");
desc += " on it."; desc += " on it.";
String repeffstr = "Event$ Moved | ValidCard$ Card.IsRemembered | Destination$ Battlefield | Description$ " + desc; String repeffstr = "Event$ Moved | ValidCard$ Card.IsRemembered | Destination$ Battlefield | ReplacementResult$ Updated | Description$ " + desc;
ReplacementEffect re = ReplacementHandler.parseReplacement(repeffstr, eff, true); ReplacementEffect re = ReplacementHandler.parseReplacement(repeffstr, eff, true);
re.setLayer(ReplacementLayer.Other); re.setLayer(ReplacementLayer.Other);

View File

@@ -288,6 +288,8 @@ public class StaticEffect {
affectedCard.removeCanBlockAdditional(getTimestamp()); affectedCard.removeCanBlockAdditional(getTimestamp());
} }
affectedCard.removeChangedSVars(getTimestamp(), ability.getId());
affectedCard.updateAbilityTextForView(); // only update keywords and text for view to avoid flickering affectedCard.updateAbilityTextForView(); // only update keywords and text for view to avoid flickering
} }
return affectedCards; return affectedCards;

View File

@@ -55,6 +55,7 @@ import forge.game.phase.PhaseHandler;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.player.PlayerCollection; import forge.game.player.PlayerCollection;
import forge.game.player.PlayerPredicates; import forge.game.player.PlayerPredicates;
import forge.game.replacement.ReplacementType;
import forge.game.spellability.AbilitySub; import forge.game.spellability.AbilitySub;
import forge.game.spellability.LandAbility; import forge.game.spellability.LandAbility;
import forge.game.spellability.OptionalCost; import forge.game.spellability.OptionalCost;
@@ -217,10 +218,15 @@ public class AbilityUtils {
else if (defined.startsWith("Replaced") && sa instanceof SpellAbility) { else if (defined.startsWith("Replaced") && sa instanceof SpellAbility) {
final SpellAbility root = ((SpellAbility)sa).getRootAbility(); final SpellAbility root = ((SpellAbility)sa).getRootAbility();
AbilityKey type = AbilityKey.fromString(defined.substring(8)); AbilityKey type = AbilityKey.fromString(defined.substring(8));
// for Moved Effects, if it wants to know the affected Card, it might need to return the LKI
// or otherwise the timestamp does match
if (type == AbilityKey.Card && root.isReplacementAbility() && root.getReplacementEffect().getMode() == ReplacementType.Moved) {
type = AbilityKey.CardLKI;
}
final Object crd = root.getReplacingObject(type); final Object crd = root.getReplacingObject(type);
if (crd instanceof Card) { if (crd instanceof Card) {
c = game.getCardState((Card) crd); c = (Card) crd;
} else if (crd instanceof Iterable<?>) { } else if (crd instanceof Iterable<?>) {
cards.addAll(Iterables.filter((Iterable<?>) crd, Card.class)); cards.addAll(Iterables.filter((Iterable<?>) crd, Card.class));
} }
@@ -1415,11 +1421,7 @@ public class AbilityUtils {
// Needed - Equip an untapped creature with Sword of the Paruns then cast Deadshot on it. Should deal 2 more damage. // Needed - Equip an untapped creature with Sword of the Paruns then cast Deadshot on it. Should deal 2 more damage.
game.getAction().checkStaticAbilities(); // this will refresh continuous abilities for players and permanents. game.getAction().checkStaticAbilities(); // this will refresh continuous abilities for players and permanents.
if (sa.isReplacementAbility() && abSub.getApi() == ApiType.InternalEtbReplacement) { game.getTriggerHandler().resetActiveTriggers(!sa.isReplacementAbility());
game.getTriggerHandler().resetActiveTriggers(false);
} else {
game.getTriggerHandler().resetActiveTriggers();
}
AbilityUtils.resolveApiAbility(abSub, game); AbilityUtils.resolveApiAbility(abSub, game);
} }

View File

@@ -189,7 +189,6 @@ public enum ApiType {
DamageResolve (DamageResolveEffect.class), DamageResolve (DamageResolveEffect.class),
ChangeZoneResolve (ChangeZoneResolveEffect.class), ChangeZoneResolve (ChangeZoneResolveEffect.class),
InternalEtbReplacement (ETBReplacementEffect.class),
InternalLegendaryRule (CharmEffect.class), InternalLegendaryRule (CharmEffect.class),
InternalIgnoreEffect (CharmEffect.class), InternalIgnoreEffect (CharmEffect.class),
UpdateRemember (UpdateRememberEffect.class); UpdateRemember (UpdateRememberEffect.class);

View File

@@ -300,13 +300,12 @@ public abstract class SpellAbilityEffect {
delTrig.append("| TriggerDescription$ ").append(desc); delTrig.append("| TriggerDescription$ ").append(desc);
final Trigger trig = TriggerHandler.parseTrigger(delTrig.toString(), CardUtil.getLKICopy(sa.getHostCard()), intrinsic); final Trigger trig = TriggerHandler.parseTrigger(delTrig.toString(), CardUtil.getLKICopy(sa.getHostCard()), intrinsic);
long ts = sa.getHostCard().getGame().getNextTimestamp();
for (final Card c : crds) { for (final Card c : crds) {
trig.addRemembered(c); trig.addRemembered(c);
// Svar for AI // Svar for AI
if (!c.hasSVar("EndOfTurnLeavePlay")) { c.addChangedSVars(Collections.singletonMap("EndOfTurnLeavePlay", "AtEOT"), ts, 0);
c.setSVar("EndOfTurnLeavePlay", "AtEOT");
}
} }
String trigSA = ""; String trigSA = "";
if (location.equals("Hand")) { if (location.equals("Hand")) {
@@ -346,9 +345,7 @@ public abstract class SpellAbilityEffect {
card.addTrigger(trig); card.addTrigger(trig);
// Svar for AI // Svar for AI
if (!card.hasSVar("EndOfTurnLeavePlay")) { card.addChangedSVars(Collections.singletonMap("EndOfTurnLeavePlay", "AtEOT"), card.getGame().getNextTimestamp(), 0);
card.setSVar("EndOfTurnLeavePlay", "AtEOT");
}
} }
protected static SpellAbility getForgetSpellAbility(final Card card) { protected static SpellAbility getForgetSpellAbility(final Card card) {

View File

@@ -1,10 +1,12 @@
package forge.game.ability.effects; package forge.game.ability.effects;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Map;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import forge.GameCommand; import forge.GameCommand;
import forge.card.CardType; import forge.card.CardType;
@@ -64,17 +66,17 @@ public class AnimateAllEffect extends AnimateEffectBase {
types.add(host.getChosenType2()); types.add(host.getChosenType2());
} }
final List<String> keywords = new ArrayList<>(); final List<String> keywords = Lists.newArrayList();
if (sa.hasParam("Keywords")) { if (sa.hasParam("Keywords")) {
keywords.addAll(Arrays.asList(sa.getParam("Keywords").split(" & "))); keywords.addAll(Arrays.asList(sa.getParam("Keywords").split(" & ")));
} }
final List<String> removeKeywords = new ArrayList<>(); final List<String> removeKeywords = Lists.newArrayList();
if (sa.hasParam("RemoveKeywords")) { if (sa.hasParam("RemoveKeywords")) {
removeKeywords.addAll(Arrays.asList(sa.getParam("RemoveKeywords").split(" & "))); removeKeywords.addAll(Arrays.asList(sa.getParam("RemoveKeywords").split(" & ")));
} }
final List<String> hiddenKeywords = new ArrayList<>(); final List<String> hiddenKeywords = Lists.newArrayList();
if (sa.hasParam("HiddenKeywords")) { if (sa.hasParam("HiddenKeywords")) {
hiddenKeywords.addAll(Arrays.asList(sa.getParam("HiddenKeywords").split(" & "))); hiddenKeywords.addAll(Arrays.asList(sa.getParam("HiddenKeywords").split(" & ")));
} }
@@ -99,27 +101,32 @@ public class AnimateAllEffect extends AnimateEffectBase {
} }
// abilities to add to the animated being // abilities to add to the animated being
final List<String> abilities = new ArrayList<>(); final List<String> abilities = Lists.newArrayList();
if (sa.hasParam("Abilities")) { if (sa.hasParam("Abilities")) {
abilities.addAll(Arrays.asList(sa.getParam("Abilities").split(","))); abilities.addAll(Arrays.asList(sa.getParam("Abilities").split(",")));
} }
// replacement effects to add to the animated being // replacement effects to add to the animated being
final List<String> replacements = new ArrayList<>(); final List<String> replacements = Lists.newArrayList();
if (sa.hasParam("Replacements")) { if (sa.hasParam("Replacements")) {
replacements.addAll(Arrays.asList(sa.getParam("Replacements").split(","))); replacements.addAll(Arrays.asList(sa.getParam("Replacements").split(",")));
} }
// triggers to add to the animated being // triggers to add to the animated being
final List<String> triggers = new ArrayList<>(); final List<String> triggers = Lists.newArrayList();
if (sa.hasParam("Triggers")) { if (sa.hasParam("Triggers")) {
triggers.addAll(Arrays.asList(sa.getParam("Triggers").split(","))); triggers.addAll(Arrays.asList(sa.getParam("Triggers").split(",")));
} }
// sVars to add to the animated being // sVars to add to the animated being
final List<String> sVars = new ArrayList<>(); final List<String> sVars = Lists.newArrayList();
if (sa.hasParam("sVars")) { if (sa.hasParam("sVars")) {
sVars.addAll(Arrays.asList(sa.getParam("sVars").split(","))); sVars.addAll(Arrays.asList(sa.getParam("sVars").split(",")));
} }
Map<String, String> sVarsMap = Maps.newHashMap();
for (final String s : sVars) {
sVarsMap.put(s, AbilityUtils.getSVar(sa, s));
}
final String valid = sa.getParamOrDefault("ValidCards", ""); final String valid = sa.getParamOrDefault("ValidCards", "");
CardCollectionView list; CardCollectionView list;
@@ -139,9 +146,10 @@ public class AnimateAllEffect extends AnimateEffectBase {
timestamp); timestamp);
// give sVars // give sVars
for (final String s : sVars) { if (!sVarsMap.isEmpty() ) {
c.setSVar(s, AbilityUtils.getSVar(sa, s)); c.addChangedSVars(sVarsMap, timestamp, 0);
} }
game.fireEvent(new GameEventCardStatsChanged(c)); game.fireEvent(new GameEventCardStatsChanged(c));
final GameCommand unanimate = new GameCommand() { final GameCommand unanimate = new GameCommand() {

View File

@@ -2,7 +2,9 @@ package forge.game.ability.effects;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Map;
import com.google.common.collect.Maps;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import forge.card.CardType; import forge.card.CardType;
@@ -138,11 +140,22 @@ public class AnimateEffect extends AnimateEffectBase {
} }
// sVars to add to the animated being // sVars to add to the animated being
final List<String> sVars = Lists.newArrayList(); Map<String, String> sVarsMap = Maps.newHashMap();
if (sa.hasParam("sVars")) { if (sa.hasParam("sVars")) {
sVars.addAll(Arrays.asList(sa.getParam("sVars").split(","))); for (final String s : sa.getParam("sVars").split(",")) {
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];
}
sVarsMap.put(name, actualsVar);
}
} }
List<Card> tgts = getCardsfromTargets(sa); List<Card> tgts = getCardsfromTargets(sa);
if (sa.hasParam("Optional")) { if (sa.hasParam("Optional")) {
@@ -166,15 +179,8 @@ public class AnimateEffect extends AnimateEffectBase {
} }
// give sVars // give sVars
for (final String s : sVars) { if (!sVarsMap.isEmpty()) {
String actualsVar = AbilityUtils.getSVar(sa, s); c.addChangedSVars(sVarsMap, timestamp, 0);
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 // give Remembered

View File

@@ -137,6 +137,7 @@ public abstract class AnimateEffectBase extends SpellAbilityEffect {
public void run() { public void run() {
doUnanimate(c, timestamp); doUnanimate(c, timestamp);
c.removeChangedSVars(timestamp, 0);
c.removeChangedName(timestamp, 0); c.removeChangedName(timestamp, 0);
c.updateStateForView(); c.updateStateForView();

View File

@@ -21,7 +21,7 @@ import forge.game.spellability.SpellAbilityStackInstance;
import forge.game.spellability.TargetRestrictions; import forge.game.spellability.TargetRestrictions;
import forge.util.CardTranslation; import forge.util.CardTranslation;
import forge.util.Localizer; import forge.util.Localizer;
import forge.util.collect.FCollectionView; import forge.util.collect.FCollection;
public class ChangeCombatantsEffect extends SpellAbilityEffect { public class ChangeCombatantsEffect extends SpellAbilityEffect {
@@ -47,7 +47,8 @@ public class ChangeCombatantsEffect extends SpellAbilityEffect {
if ((tgt == null) || c.canBeTargetedBy(sa)) { if ((tgt == null) || c.canBeTargetedBy(sa)) {
final Combat combat = game.getCombat(); final Combat combat = game.getCombat();
final GameEntity originalDefender = combat.getDefenderByAttacker(c); final GameEntity originalDefender = combat.getDefenderByAttacker(c);
final FCollectionView<GameEntity> defs = combat.getDefenders(); final FCollection<GameEntity> defs = new FCollection<>();
defs.addAll(sa.hasParam("PlayerOnly") ? combat.getDefendingPlayers() : combat.getDefenders());
String title = Localizer.getInstance().getMessage("lblChooseDefenderToAttackWithCard", CardTranslation.getTranslatedName(c.getName())); String title = Localizer.getInstance().getMessage("lblChooseDefenderToAttackWithCard", CardTranslation.getTranslatedName(c.getName()));
Map<String, Object> params = Maps.newHashMap(); Map<String, Object> params = Maps.newHashMap();

View File

@@ -1,5 +1,9 @@
package forge.game.ability.effects; package forge.game.ability.effects;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import forge.GameCommand; import forge.GameCommand;
@@ -16,9 +20,6 @@ import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.util.Localizer; import forge.util.Localizer;
import java.util.Arrays;
import java.util.List;
public class ControlGainEffect extends SpellAbilityEffect { public class ControlGainEffect extends SpellAbilityEffect {
@Override @Override
@@ -210,11 +211,11 @@ public class ControlGainEffect extends SpellAbilityEffect {
} }
if (lose.contains("EOT")) { if (lose.contains("EOT")) {
game.getEndOfTurn().addUntil(loseControl); game.getEndOfTurn().addUntil(loseControl);
tgtC.setSVar("SacMe", "6"); tgtC.addChangedSVars(Collections.singletonMap("SacMe", "6"), tStamp, 0);
} }
if (lose.contains("EndOfCombat")) { if (lose.contains("EndOfCombat")) {
game.getEndOfCombat().addUntil(loseControl); game.getEndOfCombat().addUntil(loseControl);
tgtC.setSVar("SacMe", "6"); tgtC.addChangedSVars(Collections.singletonMap("SacMe", "6"), tStamp, 0);
} }
if (lose.contains("StaticCommandCheck")) { if (lose.contains("StaticCommandCheck")) {
String leftVar = sa.getSVar(sa.getParam("StaticCommandCheckSVar")); String leftVar = sa.getSVar(sa.getParam("StaticCommandCheckSVar"));
@@ -276,7 +277,7 @@ public class ControlGainEffect extends SpellAbilityEffect {
@Override @Override
public void run() { public void run() {
doLoseControl(c, hostCard, bTapOnLose, tStamp); doLoseControl(c, hostCard, bTapOnLose, tStamp);
c.removeSVar("SacMe"); c.removeChangedSVars(tStamp, 0);
} }
}; };

View File

@@ -299,7 +299,7 @@ public class DamageDealEffect extends DamageBaseEffect {
} else { } else {
damageMap.put(sourceLKI, c, dmg); damageMap.put(sourceLKI, c, dmg);
if (sa.hasParam("ExcessSVar")) { if (sa.hasParam("ExcessSVar")) {
hostCard.setSVar(sa.getParam("ExcessSVar"), Integer.toString(excess)); sa.setSVar(sa.getParam("ExcessSVar"), Integer.toString(excess));
} }
} }
} }

View File

@@ -1,32 +0,0 @@
package forge.game.ability.effects;
import java.util.Map;
import forge.game.Game;
import forge.game.ability.AbilityKey;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
/**
* TODO: Write javadoc for this type.
*
*/
public class ETBReplacementEffect extends SpellAbilityEffect {
@Override
public void resolve(SpellAbility sa) {
final Game game = sa.getActivatingPlayer().getGame();
final Card card = (Card) sa.getReplacingObject(AbilityKey.Card);
Map<AbilityKey, Object> params = AbilityKey.newMap();
params.put(AbilityKey.CardLKI, sa.getReplacingObject(AbilityKey.CardLKI));
params.put(AbilityKey.ReplacementEffect, sa.getReplacementEffect());
params.put(AbilityKey.LastStateBattlefield, sa.getReplacingObject(AbilityKey.LastStateBattlefield));
params.put(AbilityKey.LastStateGraveyard, sa.getReplacingObject(AbilityKey.LastStateGraveyard));
final SpellAbility root = sa.getRootAbility();
SpellAbility cause = (SpellAbility) root.getReplacingObject(AbilityKey.Cause);
game.getAction().moveToPlay(card, card.getController(), cause, params);
}
}

View File

@@ -2,7 +2,6 @@ package forge.game.ability.effects;
import forge.game.ability.AbilityUtils; import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType;
import forge.game.ability.SpellAbilityEffect; import forge.game.ability.SpellAbilityEffect;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbility;
@@ -41,14 +40,7 @@ public class LifeLoseEffect extends SpellAbilityEffect {
lifeLost += p.loseLife(lifeAmount, false, false); lifeLost += p.loseLife(lifeAmount, false, false);
} }
} }
sa.getHostCard().setSVar("AFLifeLost", "Number$" + lifeLost); sa.setSVar("AFLifeLost", "Number$" + lifeLost);
// Exceptional case for Extort: must propagate the amount of life lost to subability,
// otherwise the first Extort trigger per game won't work
if (sa.getSubAbility() != null && ApiType.GainLife.equals(sa.getSubAbility().getApi())) {
sa.getSubAbility().setSVar("AFLifeLost", "Number$" + lifeLost);
}
} }
} }

View File

@@ -1,5 +1,6 @@
package forge.game.ability.effects; package forge.game.ability.effects;
import java.util.Collections;
import java.util.Map; import java.util.Map;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
@@ -42,12 +43,12 @@ public class PermanentEffect extends SpellAbilityEffect {
// some extra for Dashing // some extra for Dashing
if (sa.isDash() && c.isInPlay()) { if (sa.isDash() && c.isInPlay()) {
c.setSVar("EndOfTurnLeavePlay", "Dash"); c.addChangedSVars(Collections.singletonMap("EndOfTurnLeavePlay", "Dash"), c.getGame().getNextTimestamp(), 0);
registerDelayedTrigger(sa, "Hand", Lists.newArrayList(c)); registerDelayedTrigger(sa, "Hand", Lists.newArrayList(c));
} }
// similar for Blitz keyword // similar for Blitz keyword
if (sa.isBlitz() && c.isInPlay()) { if (sa.isBlitz() && c.isInPlay()) {
c.setSVar("EndOfTurnLeavePlay", "Blitz"); c.addChangedSVars(Collections.singletonMap("EndOfTurnLeavePlay", "Blitz"), c.getGame().getNextTimestamp(), 0);
registerDelayedTrigger(sa, "Sacrifice", Lists.newArrayList(c)); registerDelayedTrigger(sa, "Sacrifice", Lists.newArrayList(c));
} }

View File

@@ -126,13 +126,13 @@ public class RollDiceEffect extends SpellAbilityEffect {
total += modifier; total += modifier;
if (sa.hasParam("ResultSVar")) { if (sa.hasParam("ResultSVar")) {
host.setSVar(sa.getParam("ResultSVar"), Integer.toString(total)); sa.setSVar(sa.getParam("ResultSVar"), Integer.toString(total));
} }
if (sa.hasParam("ChosenSVar")) { if (sa.hasParam("ChosenSVar")) {
int chosen = player.getController().chooseNumber(sa, Localizer.getInstance().getMessage("lblChooseAResult"), rolls, player); int chosen = player.getController().chooseNumber(sa, Localizer.getInstance().getMessage("lblChooseAResult"), rolls, player);
String message = Localizer.getInstance().getMessage("lblPlayerChooseValue", player, chosen); String message = Localizer.getInstance().getMessage("lblPlayerChooseValue", player, chosen);
player.getGame().getAction().notifyOfValue(sa, player, message, player); player.getGame().getAction().notifyOfValue(sa, player, message, player);
host.setSVar(sa.getParam("ChosenSVar"), Integer.toString(chosen)); sa.setSVar(sa.getParam("ChosenSVar"), Integer.toString(chosen));
if (sa.hasParam("OtherSVar")) { if (sa.hasParam("OtherSVar")) {
int other = rolls.get(0); int other = rolls.get(0);
for (int i = 1; i < rolls.size(); ++i) { for (int i = 1; i < rolls.size(); ++i) {
@@ -141,7 +141,7 @@ public class RollDiceEffect extends SpellAbilityEffect {
break; break;
} }
} }
host.setSVar(sa.getParam("OtherSVar"), Integer.toString(other)); sa.setSVar(sa.getParam("OtherSVar"), Integer.toString(other));
} }
} }

View File

@@ -126,7 +126,7 @@ public class VoteEffect extends SpellAbilityEffect {
} }
if (sa.hasParam("StoreVoteNum")) { if (sa.hasParam("StoreVoteNum")) {
for (final Object type : voteType) { for (final Object type : voteType) {
host.setSVar("VoteNum" + type, "Number$" + votes.get(type).size()); sa.setSVar("VoteNum" + type, "Number$" + votes.get(type).size());
} }
} else { } else {
for (final String subAb : subAbs) { for (final String subAb : subAbs) {

View File

@@ -159,6 +159,8 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
private final NavigableMap<Long, CardCloneStates> clonedStates = Maps.newTreeMap(); // Layer 1 private final NavigableMap<Long, CardCloneStates> clonedStates = Maps.newTreeMap(); // Layer 1
private final Table<Long, Long, Map<String, String>> changedSVars = TreeBasedTable.create();
private final Map<Long, PlayerCollection> mayLook = Maps.newHashMap(); private final Map<Long, PlayerCollection> mayLook = Maps.newHashMap();
private final PlayerCollection mayLookFaceDownExile = new PlayerCollection(); private final PlayerCollection mayLookFaceDownExile = new PlayerCollection();
private final PlayerCollection mayLookTemp = new PlayerCollection(); private final PlayerCollection mayLookTemp = new PlayerCollection();
@@ -175,9 +177,6 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
private final CardChangedWords changedTextColors = new CardChangedWords(); private final CardChangedWords changedTextColors = new CardChangedWords();
private final CardChangedWords changedTextTypes = new CardChangedWords(); private final CardChangedWords changedTextTypes = new CardChangedWords();
/** Original values of SVars changed by text changes. */
private Map<String, String> originalSVars = Maps.newHashMap();
private final Set<Object> rememberedObjects = Sets.newLinkedHashSet(); private final Set<Object> rememberedObjects = Sets.newLinkedHashSet();
private Map<Player, String> flipResult; private Map<Player, String> flipResult;
@@ -1586,10 +1585,20 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
} }
public final String getSVar(final String var) { public final String getSVar(final String var) {
for (Map<String, String> map : changedSVars.values()) {
if (map.containsKey(var)) {
return map.get(var);
}
}
return currentState.getSVar(var); return currentState.getSVar(var);
} }
public final boolean hasSVar(final String var) { public final boolean hasSVar(final String var) {
for (Map<String, String> map : changedSVars.values()) {
if (map.containsKey(var)) {
return true;
}
}
return currentState.hasSVar(var); return currentState.hasSVar(var);
} }
@@ -1615,6 +1624,13 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
currentState.removeSVar(var); currentState.removeSVar(var);
} }
public final void addChangedSVars(Map<String, String> map, long timestamp, long staticId) {
this.changedSVars.put(timestamp, staticId, map);
}
public final void removeChangedSVars(long timestamp, long staticId) {
this.changedSVars.remove(timestamp, staticId);
}
public final int getTurnInZone() { public final int getTurnInZone() {
return turnInZone; return turnInZone;
} }
@@ -4596,7 +4612,6 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
* Update the changed text of the intrinsic spell abilities and keywords. * Update the changed text of the intrinsic spell abilities and keywords.
*/ */
public void updateChangedText() { public void updateChangedText() {
resetChangedSVars();
// update type // update type
List<String> toAdd = Lists.newArrayList(); List<String> toAdd = Lists.newArrayList();
@@ -4664,26 +4679,6 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
changedTextTypes.copyFrom(other.changedTextTypes); changedTextTypes.copyFrom(other.changedTextTypes);
} }
/**
* Change a SVar due to a text change effect. Change is volatile and will be
* reverted upon refreshing text changes (unless it is changed again at that
* time).
*
* @param key the SVar name.
* @param value the new SVar value.
*/
public final void changeSVar(final String key, final String value) {
originalSVars.put(key, getSVar(key));
setSVar(key, value);
}
private void resetChangedSVars() {
for (final Entry<String, String> svar : originalSVars.entrySet()) {
setSVar(svar.getKey(), svar.getValue());
}
originalSVars.clear();
}
public final KeywordInterface addIntrinsicKeyword(final String s) { public final KeywordInterface addIntrinsicKeyword(final String s) {
KeywordInterface inst = currentState.addIntrinsicKeyword(s, true); KeywordInterface inst = currentState.addIntrinsicKeyword(s, true);
if (inst != null) { if (inst != null) {

View File

@@ -52,7 +52,6 @@ import forge.game.GameLogEntryType;
import forge.game.ability.AbilityFactory; import forge.game.ability.AbilityFactory;
import forge.game.ability.AbilityKey; import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils; import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType;
import forge.game.cost.Cost; import forge.game.cost.Cost;
import forge.game.keyword.Keyword; import forge.game.keyword.Keyword;
import forge.game.keyword.KeywordInterface; import forge.game.keyword.KeywordInterface;
@@ -651,14 +650,13 @@ public class CardFactoryUtil {
final boolean intrinsic, final String valid, final String zone) { final boolean intrinsic, final String valid, final String zone) {
Card host = card.getCard(); Card host = card.getCard();
String desc = repAb.getDescription(); String desc = repAb.getDescription();
setupETBReplacementAbility(repAb);
if (!intrinsic) { if (!intrinsic) {
repAb.setIntrinsic(false); repAb.setIntrinsic(false);
} }
StringBuilder repEffsb = new StringBuilder(); StringBuilder repEffsb = new StringBuilder();
repEffsb.append("Event$ Moved | ValidCard$ ").append(valid); repEffsb.append("Event$ Moved | ValidCard$ ").append(valid);
repEffsb.append(" | Destination$ Battlefield | Description$ ").append(desc); repEffsb.append(" | Destination$ Battlefield | ReplacementResult$ Updated | Description$ ").append(desc);
if (optional) { if (optional) {
repEffsb.append(" | Optional$ True"); repEffsb.append(" | Optional$ True");
} }
@@ -751,13 +749,12 @@ public class CardFactoryUtil {
} }
SpellAbility sa = AbilityFactory.getAbility(abStr, card); SpellAbility sa = AbilityFactory.getAbility(abStr, card);
setupETBReplacementAbility(sa);
if (!intrinsic) { if (!intrinsic) {
sa.setIntrinsic(false); sa.setIntrinsic(false);
} }
String repeffstr = "Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield " String repeffstr = "Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield "
+ "| Secondary$ True | Description$ " + desc + (!extraparams.equals("") ? " | " + extraparams : ""); + "| Secondary$ True | ReplacementResult$ Updated | Description$ " + desc + (!extraparams.equals("") ? " | " + extraparams : "");
ReplacementEffect re = ReplacementHandler.parseReplacement(repeffstr, card.getCard(), intrinsic, card); ReplacementEffect re = ReplacementHandler.parseReplacement(repeffstr, card.getCard(), intrinsic, card);
@@ -2055,7 +2052,7 @@ public class CardFactoryUtil {
// Setup ETB replacement effects // Setup ETB replacement effects
final String actualRep = "Event$ Moved | Destination$ Battlefield | ValidCard$ Card.Self |" final String actualRep = "Event$ Moved | Destination$ Battlefield | ValidCard$ Card.Self |"
+ " | Description$ Amplify " + amplifyMagnitude + " (" + " | ReplacementResult$ Updated | Description$ Amplify " + amplifyMagnitude + " ("
+ inst.getReminderText() + ")"; + inst.getReminderText() + ")";
final String abString = "DB$ Reveal | AnyNumber$ True | RevealValid$ " final String abString = "DB$ Reveal | AnyNumber$ True | RevealValid$ "
@@ -2075,7 +2072,6 @@ public class CardFactoryUtil {
AbilitySub saCleanup = (AbilitySub) AbilityFactory.getAbility(dbClean, card); AbilitySub saCleanup = (AbilitySub) AbilityFactory.getAbility(dbClean, card);
saPut.setSubAbility(saCleanup); saPut.setSubAbility(saCleanup);
setupETBReplacementAbility(saCleanup);
saReveal.setSubAbility(saPut); saReveal.setSubAbility(saPut);
@@ -2168,13 +2164,12 @@ public class CardFactoryUtil {
inst.addReplacement(re); inst.addReplacement(re);
} else if (keyword.equals("Daybound")) { } else if (keyword.equals("Daybound")) {
final String actualRep = "Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | DayTime$ Night | Secondary$ True | Layer$ Transform | Description$ If it is night, this permanent enters the battlefield transformed."; final String actualRep = "Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | DayTime$ Night | Secondary$ True | Layer$ Transform | ReplacementResult$ Updated | Description$ If it is night, this permanent enters the battlefield transformed.";
final String abTransform = "DB$ SetState | Defined$ ReplacedCard | Mode$ Transform | ETB$ True | Daybound$ True"; final String abTransform = "DB$ SetState | Defined$ ReplacedCard | Mode$ Transform | ETB$ True | Daybound$ True";
ReplacementEffect re = ReplacementHandler.parseReplacement(actualRep, host, intrinsic, card); ReplacementEffect re = ReplacementHandler.parseReplacement(actualRep, host, intrinsic, card);
SpellAbility saTransform = AbilityFactory.getAbility(abTransform, card); SpellAbility saTransform = AbilityFactory.getAbility(abTransform, card);
setupETBReplacementAbility(saTransform);
re.setOverridingAbility(saTransform); re.setOverridingAbility(saTransform);
inst.addReplacement(re); inst.addReplacement(re);
@@ -2206,11 +2201,10 @@ public class CardFactoryUtil {
AbilitySub cleanupSA = (AbilitySub) AbilityFactory.getAbility(cleanupStr, card); AbilitySub cleanupSA = (AbilitySub) AbilityFactory.getAbility(cleanupStr, card);
counterSA.setSubAbility(cleanupSA); counterSA.setSubAbility(cleanupSA);
String repeffstr = "Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | Secondary$ True | Description$ Devour " + magnitude + " ("+ inst.getReminderText() + ")"; String repeffstr = "Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | Secondary$ True | ReplacementResult$ Updated | Description$ Devour " + magnitude + " ("+ inst.getReminderText() + ")";
ReplacementEffect re = ReplacementHandler.parseReplacement(repeffstr, host, intrinsic, card); ReplacementEffect re = ReplacementHandler.parseReplacement(repeffstr, host, intrinsic, card);
setupETBReplacementAbility(cleanupSA);
re.setOverridingAbility(sacrificeSA); re.setOverridingAbility(sacrificeSA);
inst.addReplacement(re); inst.addReplacement(re);
@@ -3693,14 +3687,6 @@ public class CardFactoryUtil {
return altCostSA; return altCostSA;
} }
private static final Map<String,String> emptyMap = Maps.newTreeMap();
public static SpellAbility setupETBReplacementAbility(SpellAbility sa) {
AbilitySub as = new AbilitySub(ApiType.InternalEtbReplacement, sa.getHostCard(), null, emptyMap);
sa.appendSubAbility(as);
return as;
// ETBReplacementMove(sa.getHostCard(), null));
}
public static void setupAdventureAbility(Card card) { public static void setupAdventureAbility(Card card) {
if (card.getCurrentStateName() != CardStateName.Adventure) { if (card.getCurrentStateName() != CardStateName.Adventure) {
return; return;

View File

@@ -98,6 +98,7 @@ import forge.game.keyword.KeywordsChange;
import forge.game.mana.ManaPool; import forge.game.mana.ManaPool;
import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.replacement.ReplacementEffect;
import forge.game.replacement.ReplacementHandler; import forge.game.replacement.ReplacementHandler;
import forge.game.replacement.ReplacementResult; import forge.game.replacement.ReplacementResult;
import forge.game.replacement.ReplacementType; import forge.game.replacement.ReplacementType;
@@ -3032,7 +3033,9 @@ public class Player extends GameEntity implements Comparable<Player> {
String addToHandAbility = "Mode$ Continuous | EffectZone$ Command | Affected$ Card.YouOwn+EffectSource | AffectedZone$ Command | AddAbility$ MoveToHand"; String addToHandAbility = "Mode$ Continuous | EffectZone$ Command | Affected$ Card.YouOwn+EffectSource | AffectedZone$ Command | AddAbility$ MoveToHand";
String moveToHand = "ST$ ChangeZone | Cost$ 3 | Defined$ Self | Origin$ Command | Destination$ Hand | SorcerySpeed$ True | ActivationZone$ Command | SpellDescription$ Companion - Put CARDNAME in to your hand"; String moveToHand = "ST$ ChangeZone | Cost$ 3 | Defined$ Self | Origin$ Command | Destination$ Hand | SorcerySpeed$ True | ActivationZone$ Command | SpellDescription$ Companion - Put CARDNAME in to your hand";
eff.setSVar("MoveToHand", moveToHand);
StaticAbility stAb = StaticAbility.create(addToHandAbility, eff, eff.getCurrentState(), true);
stAb.setSVar("MoveToHand", moveToHand);
eff.addStaticAbility(addToHandAbility); eff.addStaticAbility(addToHandAbility);
return eff; return eff;
@@ -3044,11 +3047,13 @@ public class Player extends GameEntity implements Comparable<Player> {
if (game.getRules().hasAppliedVariant(GameType.Oathbreaker) && commander.getRules().canBeSignatureSpell()) { if (game.getRules().hasAppliedVariant(GameType.Oathbreaker) && commander.getRules().canBeSignatureSpell()) {
//signature spells can only reside on the stack or in the command zone //signature spells can only reside on the stack or in the command zone
eff.setSVar("SignatureSpellMoveReplacement", "DB$ ChangeZone | Origin$ Stack | Destination$ Command | Defined$ ReplacedCard"); String effStr = "DB$ ChangeZone | Origin$ Stack | Destination$ Command | Defined$ ReplacedCard";
String moved = "Event$ Moved | ValidCard$ Card.EffectSource+YouOwn | Secondary$ True | ReplaceWith$ SignatureSpellMoveReplacement | Destination$ Graveyard,Exile,Hand,Library | " + String moved = "Event$ Moved | ValidCard$ Card.EffectSource+YouOwn | Secondary$ True | Destination$ Graveyard,Exile,Hand,Library | " +
"Description$ If a signature spell would be put into another zone from the stack, put it into the command zone instead."; "Description$ If a signature spell would be put into another zone from the stack, put it into the command zone instead.";
eff.addReplacementEffect(ReplacementHandler.parseReplacement(moved, eff, true)); ReplacementEffect re = ReplacementHandler.parseReplacement(moved, eff, true);
re.setOverridingAbility(AbilityFactory.getAbility(eff, effStr));
eff.addReplacementEffect(re);
//signature spells can only be cast if your oathbreaker is in on the battlefield under your control //signature spells can only be cast if your oathbreaker is in on the battlefield under your control
String castRestriction = "Mode$ CantBeCast | ValidCard$ Card.EffectSource+YouOwn | EffectZone$ Command | IsPresent$ Card.IsCommander+YouOwn+YouCtrl | PresentZone$ Battlefield | PresentCompare$ EQ0 | " + String castRestriction = "Mode$ CantBeCast | ValidCard$ Card.EffectSource+YouOwn | EffectZone$ Command | IsPresent$ Card.IsCommander+YouOwn+YouCtrl | PresentZone$ Battlefield | PresentCompare$ EQ0 | " +
@@ -3056,9 +3061,9 @@ public class Player extends GameEntity implements Comparable<Player> {
eff.addStaticAbility(castRestriction); eff.addStaticAbility(castRestriction);
} }
else { else {
eff.setSVar("CommanderMoveReplacement", "DB$ ChangeZone | Origin$ Battlefield,Graveyard,Exile,Library,Hand | Destination$ Command | Defined$ ReplacedCard"); String effStr = "DB$ ChangeZone | Origin$ Battlefield,Graveyard,Exile,Library,Hand | Destination$ Command | Defined$ ReplacedCard";
String moved = "Event$ Moved | ValidCard$ Card.EffectSource+YouOwn | Secondary$ True | Optional$ True | OptionalDecider$ You | ReplaceWith$ CommanderMoveReplacement "; String moved = "Event$ Moved | ValidCard$ Card.EffectSource+YouOwn | Secondary$ True | Optional$ True | OptionalDecider$ You | CommanderMoveReplacement$ True ";
if (game.getRules().hasAppliedVariant(GameType.TinyLeaders)) { if (game.getRules().hasAppliedVariant(GameType.TinyLeaders)) {
moved += " | Destination$ Graveyard,Exile | Description$ If a commander would be put into its owner's graveyard or exile from anywhere, that player may put it into the command zone instead."; moved += " | Destination$ Graveyard,Exile | Description$ If a commander would be put into its owner's graveyard or exile from anywhere, that player may put it into the command zone instead.";
} }
@@ -3068,7 +3073,9 @@ public class Player extends GameEntity implements Comparable<Player> {
// rule 903.9b // rule 903.9b
moved += " | Destination$ Hand,Library | Description$ If a commander would be put into its owner's hand or library from anywhere, its owner may put it into the command zone instead."; moved += " | Destination$ Hand,Library | Description$ If a commander would be put into its owner's hand or library from anywhere, its owner may put it into the command zone instead.";
} }
eff.addReplacementEffect(ReplacementHandler.parseReplacement(moved, eff, true)); ReplacementEffect re = ReplacementHandler.parseReplacement(moved, eff, true);
re.setOverridingAbility(AbilityFactory.getAbility(eff, effStr));
eff.addReplacementEffect(re);
} }
String mayBePlayedAbility = "Mode$ Continuous | EffectZone$ Command | MayPlay$ True | Affected$ Card.YouOwn+EffectSource | AffectedZone$ Command"; String mayBePlayedAbility = "Mode$ Continuous | EffectZone$ Command | MayPlay$ True | Affected$ Card.YouOwn+EffectSource | AffectedZone$ Command";
@@ -3206,7 +3213,7 @@ public class Player extends GameEntity implements Comparable<Player> {
final String damageTrig = "Mode$ DamageDoneOnceByController | ValidSource$ Player | ValidTarget$ You | " + final String damageTrig = "Mode$ DamageDoneOnceByController | ValidSource$ Player | ValidTarget$ You | " +
"CombatDamage$ True | TriggerZones$ Command | TriggerDescription$ Whenever one or more " + "CombatDamage$ True | TriggerZones$ Command | TriggerDescription$ Whenever one or more " +
"creatures a player controls deal combat damage to you, that player takes the initiative."; "creatures a player controls deal combat damage to you, that player takes the initiative.";
final String damageEff = "DB$ TakeInitiative | Defined$ TriggeredAttackingPlayer"; final String damageEff = "DB$ TakeInitiative | Defined$ TriggeredSource";
final Trigger damageTrigger = TriggerHandler.parseTrigger(damageTrig, initiativeEffect, true); final Trigger damageTrigger = TriggerHandler.parseTrigger(damageTrig, initiativeEffect, true);

View File

@@ -96,7 +96,7 @@ public class ReplaceMoved extends ReplacementEffect {
@Override @Override
public void setReplacingObjects(Map<AbilityKey, Object> runParams, SpellAbility sa) { public void setReplacingObjects(Map<AbilityKey, Object> runParams, SpellAbility sa) {
sa.setReplacingObject(AbilityKey.Card, runParams.get(AbilityKey.Affected)); sa.setReplacingObject(AbilityKey.Card, runParams.get(AbilityKey.Affected));
sa.setReplacingObjectsFrom(runParams, AbilityKey.CardLKI, AbilityKey.Cause, AbilityKey.LastStateBattlefield, AbilityKey.LastStateGraveyard); sa.setReplacingObjectsFrom(runParams, AbilityKey.NewCard, AbilityKey.CardLKI, AbilityKey.Cause, AbilityKey.LastStateBattlefield, AbilityKey.LastStateGraveyard);
} }
} }

View File

@@ -211,6 +211,7 @@ public class ReplacementHandler {
re.setHostCard(affectedCard); re.setHostCard(affectedCard);
} }
runParams.put(AbilityKey.Affected, affectedCard); runParams.put(AbilityKey.Affected, affectedCard);
runParams.put(AbilityKey.NewCard, CardUtil.getLKICopy(affectedLKI));
} }
game.getAction().checkStaticAbilities(false); game.getAction().checkStaticAbilities(false);
} }
@@ -418,8 +419,8 @@ public class ReplacementHandler {
} }
} }
if ("Replaced".equals(replacementEffect.getParam("ReplacementResult"))) { if (replacementEffect.hasParam("ReplacementResult")) {
return ReplacementResult.Replaced; // Event is replaced without SA. return ReplacementResult.valueOf(replacementEffect.getParam("ReplacementResult")); // Event is replaced without SA.
} }
// if the spellability is a replace effect then its some new logic // if the spellability is a replace effect then its some new logic

View File

@@ -109,7 +109,7 @@ public class StaticAbilityCantBeCast {
return false; return false;
} }
if (stAb.hasParam("OnlySorcerySpeed") && (activator != null) && activator.canCastSorcery()) { if (stAb.hasParam("OnlySorcerySpeed") && activator != null && activator.canCastSorcery()) {
return false; return false;
} }
@@ -120,12 +120,12 @@ public class StaticAbilityCantBeCast {
} }
} }
if (stAb.hasParam("NonCasterTurn") && (activator != null) if (stAb.hasParam("NonCasterTurn") && activator != null
&& activator.getGame().getPhaseHandler().isPlayerTurn(activator)) { && activator.getGame().getPhaseHandler().isPlayerTurn(activator)) {
return false; return false;
} }
if (stAb.hasParam("cmcGT") && (activator != null)) { if (stAb.hasParam("cmcGT") && activator != null) {
if (stAb.getParam("cmcGT").equals("Turns")) { if (stAb.getParam("cmcGT").equals("Turns")) {
if (card.getCMC() <= activator.getTurn()) { if (card.getCMC() <= activator.getTurn()) {
return false; return false;
@@ -176,7 +176,7 @@ public class StaticAbilityCantBeCast {
return false; return false;
} }
if (stAb.hasParam("NonActivatorTurn") && (activator != null) if (stAb.hasParam("NonActivatorTurn") && activator != null
&& activator.getGame().getPhaseHandler().isPlayerTurn(activator)) { && activator.getGame().getPhaseHandler().isPlayerTurn(activator)) {
return false; return false;
} }

View File

@@ -30,6 +30,7 @@ import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables; import com.google.common.collect.Iterables;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import forge.GameCommand; import forge.GameCommand;
import forge.card.CardStateName; import forge.card.CardStateName;
@@ -779,6 +780,7 @@ public final class StaticAbilityContinuous {
// add SVars // add SVars
if (addSVars != null) { if (addSVars != null) {
Map<String, String> map = Maps.newHashMap();
for (final String sVar : addSVars) { for (final String sVar : addSVars) {
String actualSVar = AbilityUtils.getSVar(stAb, sVar); String actualSVar = AbilityUtils.getSVar(stAb, sVar);
String name = sVar; String name = sVar;
@@ -787,8 +789,9 @@ public final class StaticAbilityContinuous {
name = actualSVar.split(":")[0]; name = actualSVar.split(":")[0];
actualSVar = actualSVar.split(":")[1]; actualSVar = actualSVar.split(":")[1];
} }
affectedCard.setSVar(name, actualSVar); map.put(name, actualSVar);
} }
affectedCard.addChangedSVars(map, se.getTimestamp(), stAb.getId());
} }
if (layer == StaticAbilityLayer.ABILITIES) { if (layer == StaticAbilityLayer.ABILITIES) {

View File

@@ -36,7 +36,6 @@ public class TriggerDamageDoneOnceByController extends Trigger {
@Override @Override
public void setTriggeringObjects(SpellAbility sa, Map<AbilityKey, Object> runParams) { public void setTriggeringObjects(SpellAbility sa, Map<AbilityKey, Object> runParams) {
Object target = runParams.get(AbilityKey.DamageTarget); Object target = runParams.get(AbilityKey.DamageTarget);
if (target instanceof Card) { if (target instanceof Card) {
target = CardUtil.getLKICopy((Card)runParams.get(AbilityKey.DamageTarget)); target = CardUtil.getLKICopy((Card)runParams.get(AbilityKey.DamageTarget));

View File

@@ -2,7 +2,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="forge.app" package="forge.app"
android:versionCode="1" android:versionCode="1"
android:versionName="1.6.49" > <!-- versionName should be updated and it's used for Sentry releases tag --> android:versionName="1.6.53" > <!-- versionName should be updated and it's used for Sentry releases tag -->
<uses-sdk <uses-sdk
android:minSdkVersion="19" android:minSdkVersion="19"

View File

@@ -6,7 +6,7 @@
<packaging.type>jar</packaging.type> <packaging.type>jar</packaging.type>
<build.min.memory>-Xms1024m</build.min.memory> <build.min.memory>-Xms1024m</build.min.memory>
<build.max.memory>-Xmx1536m</build.max.memory> <build.max.memory>-Xmx1536m</build.max.memory>
<alpha-version>1.6.49.001</alpha-version> <alpha-version>1.6.53.001</alpha-version>
<sign.keystore>keystore</sign.keystore> <sign.keystore>keystore</sign.keystore>
<sign.alias>alias</sign.alias> <sign.alias>alias</sign.alias>
<sign.storepass>storepass</sign.storepass> <sign.storepass>storepass</sign.storepass>
@@ -19,7 +19,7 @@
<parent> <parent>
<artifactId>forge</artifactId> <artifactId>forge</artifactId>
<groupId>forge</groupId> <groupId>forge</groupId>
<version>1.6.51-SNAPSHOT</version> <version>1.6.54-SNAPSHOT</version>
</parent> </parent>
<artifactId>forge-gui-android</artifactId> <artifactId>forge-gui-android</artifactId>

View File

@@ -4,7 +4,7 @@
<parent> <parent>
<artifactId>forge</artifactId> <artifactId>forge</artifactId>
<groupId>forge</groupId> <groupId>forge</groupId>
<version>1.6.51-SNAPSHOT</version> <version>1.6.54-SNAPSHOT</version>
</parent> </parent>
<artifactId>forge-gui-desktop</artifactId> <artifactId>forge-gui-desktop</artifactId>

View File

@@ -52,7 +52,7 @@ import forge.util.MyRandom;
import forge.util.collect.FCollectionView; import forge.util.collect.FCollectionView;
import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Pair;
import org.testng.collections.Lists; import com.google.common.collect.Lists;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;

View File

@@ -6,13 +6,13 @@
<packaging.type>jar</packaging.type> <packaging.type>jar</packaging.type>
<build.min.memory>-Xms128m</build.min.memory> <build.min.memory>-Xms128m</build.min.memory>
<build.max.memory>-Xmx2048m</build.max.memory> <build.max.memory>-Xmx2048m</build.max.memory>
<alpha-version>1.6.49.001</alpha-version> <alpha-version>1.6.53.001</alpha-version>
</properties> </properties>
<parent> <parent>
<artifactId>forge</artifactId> <artifactId>forge</artifactId>
<groupId>forge</groupId> <groupId>forge</groupId>
<version>1.6.51-SNAPSHOT</version> <version>1.6.54-SNAPSHOT</version>
</parent> </parent>
<artifactId>forge-gui-ios</artifactId> <artifactId>forge-gui-ios</artifactId>

View File

@@ -4,7 +4,7 @@
<parent> <parent>
<artifactId>forge</artifactId> <artifactId>forge</artifactId>
<groupId>forge</groupId> <groupId>forge</groupId>
<version>1.6.51-SNAPSHOT</version> <version>1.6.54-SNAPSHOT</version>
</parent> </parent>
<artifactId>forge-gui-mobile-dev</artifactId> <artifactId>forge-gui-mobile-dev</artifactId>

View File

@@ -4,7 +4,7 @@
<parent> <parent>
<artifactId>forge</artifactId> <artifactId>forge</artifactId>
<groupId>forge</groupId> <groupId>forge</groupId>
<version>1.6.51-SNAPSHOT</version> <version>1.6.54-SNAPSHOT</version>
</parent> </parent>
<artifactId>forge-gui-mobile</artifactId> <artifactId>forge-gui-mobile</artifactId>

View File

@@ -59,7 +59,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
public class Forge implements ApplicationListener { public class Forge implements ApplicationListener {
public static final String CURRENT_VERSION = "1.6.49.001"; public static final String CURRENT_VERSION = "1.6.53.001";
private static ApplicationListener app = null; private static ApplicationListener app = null;
static Scene currentScene = null; static Scene currentScene = null;
@@ -403,8 +403,12 @@ public class Forge implements ApplicationListener {
} else if (selector.equals("Adventure")) { } else if (selector.equals("Adventure")) {
openAdventure(); openAdventure();
clearSplashScreen(); clearSplashScreen();
} else } else if (splashScreen != null) {
splashScreen.setShowModeSelector(true); splashScreen.setShowModeSelector(true);
} else {//default mode in case splashscreen is null at some point as seen on resume..
openHomeDefault();
clearSplashScreen();
}
//start background music //start background music
SoundSystem.instance.setBackgroundMusic(MusicPlaylist.MENUS); SoundSystem.instance.setBackgroundMusic(MusicPlaylist.MENUS);
safeToClose = true; safeToClose = true;

View File

@@ -4,7 +4,7 @@
<parent> <parent>
<artifactId>forge</artifactId> <artifactId>forge</artifactId>
<groupId>forge</groupId> <groupId>forge</groupId>
<version>1.6.51-SNAPSHOT</version> <version>1.6.54-SNAPSHOT</version>
</parent> </parent>
<artifactId>forge-gui</artifactId> <artifactId>forge-gui</artifactId>

View File

@@ -2,7 +2,7 @@ Name:Abnormal Endurance
ManaCost:1 B ManaCost:1 B
Types:Instant Types:Instant
A:SP$ Pump | Cost$ 1 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | SpellDescription$ Until end of turn, target creature gets +2/+0 and gains "When this creature dies, return it to the battlefield tapped under its owner's control." | SubAbility$ DBAnimate A:SP$ Pump | Cost$ 1 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | SpellDescription$ Until end of turn, target creature gets +2/+0 and gains "When this creature dies, return it to the battlefield tapped under its owner's control." | SubAbility$ DBAnimate
SVar:DBAnimate:DB$ Animate | Triggers$ AbnormalEnduranceChangeZone | sVars$ AbnormalEnduranceTrigChangeZone | Defined$ ParentTarget SVar:DBAnimate:DB$ Animate | Triggers$ AbnormalEnduranceChangeZone | Defined$ ParentTarget
SVar:AbnormalEnduranceChangeZone:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ AbnormalEnduranceTrigChangeZone | TriggerController$ TriggeredCardController | TriggerDescription$ When this creature dies, return it to the battlefield tapped under its owner's control. SVar:AbnormalEnduranceChangeZone:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ AbnormalEnduranceTrigChangeZone | TriggerController$ TriggeredCardController | TriggerDescription$ When this creature dies, return it to the battlefield tapped under its owner's control.
SVar:AbnormalEnduranceTrigChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Tapped$ True | Defined$ TriggeredNewCardLKICopy SVar:AbnormalEnduranceTrigChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Tapped$ True | Defined$ TriggeredNewCardLKICopy
Oracle:Until end of turn, target creature gets +2/+0 and gains "When this creature dies, return it to the battlefield tapped under its owner's control." Oracle:Until end of turn, target creature gets +2/+0 and gains "When this creature dies, return it to the battlefield tapped under its owner's control."

View File

@@ -2,7 +2,7 @@ Name:Aethermage's Touch
ManaCost:2 W U ManaCost:2 W U
Types:Instant Types:Instant
A:SP$ Dig | Cost$ 2 W U | DigNum$ 4 | Reveal$ True | ChangeNum$ 1 | Optional$ True | ChangeValid$ Creature | DestinationZone$ Battlefield | RememberChanged$ True | SubAbility$ DBAnimate | SpellDescription$ Reveal the top four cards of your library. You may put a creature card from among them onto the battlefield. It gains "At the beginning of your end step, return this creature to its owner's hand." Then put the rest of the cards revealed this way on the bottom of your library in any order. | StackDescription$ SpellDescription A:SP$ Dig | Cost$ 2 W U | DigNum$ 4 | Reveal$ True | ChangeNum$ 1 | Optional$ True | ChangeValid$ Creature | DestinationZone$ Battlefield | RememberChanged$ True | SubAbility$ DBAnimate | SpellDescription$ Reveal the top four cards of your library. You may put a creature card from among them onto the battlefield. It gains "At the beginning of your end step, return this creature to its owner's hand." Then put the rest of the cards revealed this way on the bottom of your library in any order. | StackDescription$ SpellDescription
SVar:DBAnimate:DB$ Animate | Defined$ Remembered | Duration$ Permanent | Triggers$ TrigAethermage | sVars$ BounceAethermage | SubAbility$ DBCleanup | StackDescription$ None SVar:DBAnimate:DB$ Animate | Defined$ Remembered | Duration$ Permanent | Triggers$ TrigAethermage | SubAbility$ DBCleanup | StackDescription$ None
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:TrigAethermage:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | ValidPlayer$ You | Execute$ BounceAethermage | TriggerDescription$ At the beginning of your end step, return CARDNAME to its owner's hand. SVar:TrigAethermage:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | ValidPlayer$ You | Execute$ BounceAethermage | TriggerDescription$ At the beginning of your end step, return CARDNAME to its owner's hand.
SVar:BounceAethermage:DB$ ChangeZone | Defined$ Self | Origin$ Battlefield | Destination$ Hand SVar:BounceAethermage:DB$ ChangeZone | Defined$ Self | Origin$ Battlefield | Destination$ Hand

View File

@@ -1,7 +1,7 @@
Name:Arm with Aether Name:Arm with Aether
ManaCost:2 U ManaCost:2 U
Types:Sorcery Types:Sorcery
A:SP$ AnimateAll | Cost$ 2 U | ValidCards$ Creature.YouCtrl | Triggers$ Trig | sVars$ Eff | SpellDescription$ Until end of turn, creatures you control gain "Whenever this creature deals damage to an opponent, you may return target creature that player controls to its owner's hand." A:SP$ AnimateAll | Cost$ 2 U | ValidCards$ Creature.YouCtrl | Triggers$ Trig | SpellDescription$ Until end of turn, creatures you control gain "Whenever this creature deals damage to an opponent, you may return target creature that player controls to its owner's hand."
SVar:Trig:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | OptionalDecider$ You | Execute$ Eff | TriggerDescription$ Whenever this creature deals damage to an opponent, you may return target creature that player controls to its owner's hand. SVar:Trig:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | OptionalDecider$ You | Execute$ Eff | TriggerDescription$ Whenever this creature deals damage to an opponent, you may return target creature that player controls to its owner's hand.
SVar:Eff:DB$ ChangeZone | ValidTgts$ Creature | TargetsWithDefinedController$ TriggeredTarget | TgtPrompt$ Select target creature that player controls. | Origin$ Battlefield | Destination$ Hand SVar:Eff:DB$ ChangeZone | ValidTgts$ Creature | TargetsWithDefinedController$ TriggeredTarget | TgtPrompt$ Select target creature that player controls. | Origin$ Battlefield | Destination$ Hand
Oracle:Until end of turn, creatures you control gain "Whenever this creature deals damage to an opponent, you may return target creature that player controls to its owner's hand." Oracle:Until end of turn, creatures you control gain "Whenever this creature deals damage to an opponent, you may return target creature that player controls to its owner's hand."

View File

@@ -4,9 +4,8 @@ Types:Snow Creature Elf Warrior
PT:3/2 PT:3/2
T:Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ You | Execute$ TrigEffect | TriggerZones$ Battlefield | SnowSpentForCardsColor$ True | TriggerDescription$ Whenever you cast a creature spell, if {S} of any of that spell's colors was spent to cast it, that creature enters the battlefield with an additional +1/+1 counter on it. ({S} is mana from a snow source.) T:Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ You | Execute$ TrigEffect | TriggerZones$ Battlefield | SnowSpentForCardsColor$ True | TriggerDescription$ Whenever you cast a creature spell, if {S} of any of that spell's colors was spent to cast it, that creature enters the battlefield with an additional +1/+1 counter on it. ({S} is mana from a snow source.)
SVar:TrigEffect:DB$ Effect | RememberObjects$ TriggeredCard | ReplacementEffects$ ETBCreat SVar:TrigEffect:DB$ Effect | RememberObjects$ TriggeredCard | ReplacementEffects$ ETBCreat
SVar:ETBCreat:Event$ Moved | ValidCard$ Card.IsRemembered | Destination$ Battlefield | ReplaceWith$ DBPutP1P1 | Description$ That creature enters the battlefield with an additional +1/+1 counter on it. SVar:ETBCreat:Event$ Moved | ValidCard$ Card.IsRemembered | Destination$ Battlefield | ReplaceWith$ DBPutP1P1 | ReplacementResult$ Updated | Description$ That creature enters the battlefield with an additional +1/+1 counter on it.
SVar:DBPutP1P1:DB$ PutCounter | Defined$ ReplacedCard | CounterType$ P1P1 | ETB$ True | CounterNum$ 1 | SubAbility$ ToBattlefield SVar:DBPutP1P1:DB$ PutCounter | Defined$ ReplacedCard | CounterType$ P1P1 | ETB$ True | CounterNum$ 1 | SubAbility$ DBExile
SVar:ToBattlefield:DB$ InternalEtbReplacement | SubAbility$ DBExile
SVar:DBExile:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:DBExile:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile
DeckHints:Type$Snow DeckHints:Type$Snow
DeckHas:Ability$Counters DeckHas:Ability$Counters

View File

@@ -1,7 +1,7 @@
Name:Brawl Name:Brawl
ManaCost:3 R R ManaCost:3 R R
Types:Instant Types:Instant
A:SP$ AnimateAll | Cost$ 3 R R | ValidCards$ Creature | Abilities$ ThrowPunch | sVars$ BrawlX | SpellDescription$ Until end of turn, all creatures gain "{T}: This creature deals damage equal to its power to target creature." A:SP$ AnimateAll | Cost$ 3 R R | ValidCards$ Creature | Abilities$ ThrowPunch | SpellDescription$ Until end of turn, all creatures gain "{T}: This creature deals damage equal to its power to target creature."
SVar:ThrowPunch:AB$ DealDamage | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ BrawlX | SpellDescription$ This creature deals damage equal to its power to target creature. SVar:ThrowPunch:AB$ DealDamage | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ BrawlX | SpellDescription$ This creature deals damage equal to its power to target creature.
SVar:BrawlX:Count$CardPower SVar:BrawlX:Count$CardPower
AI:RemoveDeck:All AI:RemoveDeck:All

View File

@@ -1,7 +1,7 @@
Name:Breath of the Sleepless Name:Breath of the Sleepless
ManaCost:3 U ManaCost:3 U
Types:Enchantment Types:Enchantment
S:Mode$ Continuous | EffectZone$ Battlefield | Affected$ Spirit.nonToken+YouCtrl | MayPlay$ True | MayPlayPlayer$ CardOwner | MayPlayWithFlash$ True | MayPlayDontGrantZonePermissions$ True | AffectedZone$ Hand,Graveyard,Library,Exile | Description$ You may cast Spirit spells as though they had flash. S:Mode$ CastWithFlash | ValidCard$ Spirit | ValidSA$ Spell | EffectZone$ Battlefield | Caster$ You | Description$ You may cast Spirit spells as though they had flash.
T:Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | OpponentTurn$ True | Execute$ TrigTap | TriggerDescription$ Whenever you cast a creature spell during an opponent's turn, tap up to one target creature. T:Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | OpponentTurn$ True | Execute$ TrigTap | TriggerDescription$ Whenever you cast a creature spell during an opponent's turn, tap up to one target creature.
SVar:TrigTap:DB$ Tap | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Creature | TgtPrompt$ Select up to one target creature SVar:TrigTap:DB$ Tap | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Creature | TgtPrompt$ Select up to one target creature
DeckHints:Type$Spirit DeckHints:Type$Spirit

View File

@@ -3,9 +3,8 @@ ManaCost:2 R
Types:Creature Devil Types:Creature Devil
PT:2/3 PT:2/3
K:Menace K:Menace
R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | DayTime$ Neither | ReplaceWith$ DoDay | Description$ If it's neither day nor night, it becomes day as CARDNAME enters the battlefield. R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | DayTime$ Neither | ReplaceWith$ DoDay | ReplacementResult$ Updated | Description$ If it's neither day nor night, it becomes day as CARDNAME enters the battlefield.
SVar:DoDay:DB$ DayTime | Value$ Day | SubAbility$ ETB SVar:DoDay:DB$ DayTime | Value$ Day
SVar:ETB:DB$ InternalEtbReplacement
T:Mode$ DayTimeChanges | Execute$ TrigDamage | TriggerZones$ Battlefield | TriggerDescription$ Whenever day becomes night or night becomes day, CARDNAME deals 1 damage to each opponent. T:Mode$ DayTimeChanges | Execute$ TrigDamage | TriggerZones$ Battlefield | TriggerDescription$ Whenever day becomes night or night becomes day, CARDNAME deals 1 damage to each opponent.
SVar:TrigDamage:DB$ DealDamage | Defined$ Player.Opponent | NumDmg$ 1 SVar:TrigDamage:DB$ DealDamage | Defined$ Player.Opponent | NumDmg$ 1
Oracle:Menace (This creature can't be blocked except by two or more creatures.)\nIf it's neither day nor night, it becomes day as Brimstone Vandal enters the battlefield.\nWhenever day becomes night or night becomes day, Brimstone Vandal deals 1 damage to each opponent. Oracle:Menace (This creature can't be blocked except by two or more creatures.)\nIf it's neither day nor night, it becomes day as Brimstone Vandal enters the battlefield.\nWhenever day becomes night or night becomes day, Brimstone Vandal deals 1 damage to each opponent.

View File

@@ -4,7 +4,7 @@ Types:Creature Goat Hydra
PT:0/0 PT:0/0
K:etbCounter:P1P1:X K:etbCounter:P1P1:X
SVar:X:Count$xPaid SVar:X:Count$xPaid
A:AB$ PutCounter | Cost$ 2 | Activator$ Player.attackedBySourceThisCombat | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBReselect | ActivationPhases$ Declare Attackers | AILogic$ AlwaysWithNoTgt | SpellDescription$ Put a +1/+1 counter on CARDNAME, then you may reselect which player CARDNAME is attacking. Only the player CARDNAME is attacking may activate this ability and only during the declare attackers step. (It can't attack its controller.) A:AB$ PutCounter | Cost$ 2 | Activator$ Player | IsPresent$ Card.Self+attackingYou | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBReselect | ActivationPhases$ Declare Attackers | AILogic$ AlwaysWithNoTgt | SpellDescription$ Put a +1/+1 counter on CARDNAME, then you may reselect which player CARDNAME is attacking. Only the player CARDNAME is attacking may activate this ability and only during the declare attackers step. (It can't attack its controller.)
SVar:DBReselect:DB$ ChangeCombatants | Defined$ Self | AILogic$ WeakestOppExceptCtrl SVar:DBReselect:DB$ ChangeCombatants | Defined$ Self | AILogic$ WeakestOppExceptCtrl | PlayerOnly$ True
DeckHas:Ability$Counters DeckHas:Ability$Counters
Oracle:Capricopian enters the battlefield with X +1/+1 counters on it.\n{2}: Put a +1/+1 counter on Capricopian, then you may reselect which player Capricopian is attacking. Only the player Capricopian is attacking may activate this ability and only during the declare attackers step. (It can't attack its controller.) Oracle:Capricopian enters the battlefield with X +1/+1 counters on it.\n{2}: Put a +1/+1 counter on Capricopian, then you may reselect which player Capricopian is attacking. Only the player Capricopian is attacking may activate this ability and only during the declare attackers step. (It can't attack its controller.)

View File

@@ -2,9 +2,8 @@ Name:Celestus Sanctifier
ManaCost:2 W ManaCost:2 W
Types:Creature Human Cleric Types:Creature Human Cleric
PT:3/2 PT:3/2
R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | DayTime$ Neither | ReplaceWith$ DoDay | Description$ If it's neither day nor night, it becomes day as CARDNAME enters the battlefield. R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | DayTime$ Neither | ReplaceWith$ DoDay | ReplacementResult$ Updated | Description$ If it's neither day nor night, it becomes day as CARDNAME enters the battlefield.
SVar:DoDay:DB$ DayTime | Value$ Day | SubAbility$ ETB SVar:DoDay:DB$ DayTime | Value$ Day
SVar:ETB:DB$ InternalEtbReplacement
T:Mode$ DayTimeChanges | Execute$ DBDig | TriggerZones$ Battlefield | TriggerDescription$ Whenever day becomes night or night becomes day, look at the top two cards of your library. Put one of them into your graveyard. T:Mode$ DayTimeChanges | Execute$ DBDig | TriggerZones$ Battlefield | TriggerDescription$ Whenever day becomes night or night becomes day, look at the top two cards of your library. Put one of them into your graveyard.
SVar:DBDig:DB$ Dig | DigNum$ 2 | DestinationZone$ Graveyard | LibraryPosition2$ 0 SVar:DBDig:DB$ Dig | DigNum$ 2 | DestinationZone$ Graveyard | LibraryPosition2$ 0
DeckHas:Ability$Graveyard DeckHas:Ability$Graveyard

View File

@@ -4,9 +4,9 @@ Types:Creature Dinosaur
PT:2/1 PT:2/1
T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigEffect | TriggerDescription$ When CARDNAME dies, you may cast Dinosaur spells this turn as though they had flash, and whenever you cast a Dinosaur spell this turn, it gains "When this creature enters the battlefield, you may have it fight another target creature." T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigEffect | TriggerDescription$ When CARDNAME dies, you may cast Dinosaur spells this turn as though they had flash, and whenever you cast a Dinosaur spell this turn, it gains "When this creature enters the battlefield, you may have it fight another target creature."
SVar:TrigEffect:DB$ Effect | Name$ Cherished Hatchling Effect | StaticAbilities$ STFlash | Triggers$ HatchlingCast SVar:TrigEffect:DB$ Effect | Name$ Cherished Hatchling Effect | StaticAbilities$ STFlash | Triggers$ HatchlingCast
SVar:STFlash:Mode$ Continuous | EffectZone$ Command | Affected$ Dinosaur.nonToken+YouCtrl | MayPlay$ True | MayPlayPlayer$ CardOwner | MayPlayWithFlash$ True | MayPlayDontGrantZonePermissions$ True | AffectedZone$ Hand,Graveyard,Library,Exile | Description$ You may cast Dinosaur spells this turn as though they had flash. SVar:STFlash:Mode$ CastWithFlash | ValidCard$ Dinosaur | ValidSA$ Spell | EffectZone$ Command | Caster$ You | Description$ You may cast Dinosaur spells this turn as though they had flash.
SVar:HatchlingCast:Mode$ SpellCast | ValidCard$ Dinosaur | ValidActivatingPlayer$ You | Execute$ TrigHatchlingAnimate | TriggerZones$ Command | TriggerDescription$ Whenever you cast a Dinosaur spell this turn, it gains "When this creature enters the battlefield, you may have it fight another target creature." SVar:HatchlingCast:Mode$ SpellCast | ValidCard$ Dinosaur | ValidActivatingPlayer$ You | Execute$ TrigHatchlingAnimate | TriggerZones$ Command | TriggerDescription$ Whenever you cast a Dinosaur spell this turn, it gains "When this creature enters the battlefield, you may have it fight another target creature."
SVar:TrigHatchlingAnimate:DB$ Animate | Defined$ TriggeredCard | Duration$ Permanent | Triggers$ TrigETBHatchling | sVars$ HatchlingFight SVar:TrigHatchlingAnimate:DB$ Animate | Defined$ TriggeredCard | Duration$ Permanent | Triggers$ TrigETBHatchling
SVar:TrigETBHatchling:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ HatchlingFight | OptionalDecider$ You | TriggerDescription$ When this creature enters the battlefield, you may have it fight another target creature. SVar:TrigETBHatchling:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ HatchlingFight | OptionalDecider$ You | TriggerDescription$ When this creature enters the battlefield, you may have it fight another target creature.
SVar:HatchlingFight:DB$ Fight | Defined$ TriggeredCardLKICopy | ValidTgts$ Creature.Other | TgtPrompt$ Select another target creature SVar:HatchlingFight:DB$ Fight | Defined$ TriggeredCardLKICopy | ValidTgts$ Creature.Other | TgtPrompt$ Select another target creature
DeckHints:Type$Dinosaur DeckHints:Type$Dinosaur

View File

@@ -4,7 +4,6 @@ Types:Creature Illusion
PT:3/3 PT:3/3
K:Flying K:Flying
K:Vanishing:3 K:Vanishing:3
T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigCopyPermanent | TriggerDescription$ When CARDNAME dies, if it had no time counters on it, create two tokens that are copies of it. T:Mode$ ChangesZone | ValidCard$ Card.Self+counters_EQ0_TIME | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigCopyPermanent | TriggerDescription$ When CARDNAME dies, if it had no time counters on it, create two tokens that are copies of it.
SVar:TrigCopyPermanent:DB$ CopyPermanent | Defined$ TriggeredCard | NumCopies$ 2 | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ0 SVar:TrigCopyPermanent:DB$ CopyPermanent | Defined$ TriggeredCard | NumCopies$ 2
SVar:X:TriggeredCard$CardCounters.TIME
Oracle:Flying\nVanishing 3 (This creature enters the battlefield with three time counters on it. At the beginning of your upkeep, remove a time counter from it. When the last is removed, sacrifice it.)\nWhen Chronozoa dies, if it had no time counters on it, create two tokens that are copies of it. Oracle:Flying\nVanishing 3 (This creature enters the battlefield with three time counters on it. At the beginning of your upkeep, remove a time counter from it. When the last is removed, sacrifice it.)\nWhen Chronozoa dies, if it had no time counters on it, create two tokens that are copies of it.

View File

@@ -1,7 +1,7 @@
Name:Commando Raid Name:Commando Raid
ManaCost:2 R ManaCost:2 R
Types:Instant Types:Instant
A:SP$ Animate | Cost$ 2 R | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | Triggers$ TrigDamage | sVars$ Damage,CommandoRaidX | SpellDescription$ Until end of turn, target creature you control gains "When this creature deals combat damage to a player, you may have it deal damage equal to its power to target creature that player controls." A:SP$ Animate | Cost$ 2 R | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | Triggers$ TrigDamage | SpellDescription$ Until end of turn, target creature you control gains "When this creature deals combat damage to a player, you may have it deal damage equal to its power to target creature that player controls."
SVar:TrigDamage:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ Damage | OptionalDecider$ You | TriggerDescription$ When this creature deals combat damage to a player, you may have it deal damage equal to its power to target creature that player controls. SVar:TrigDamage:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ Damage | OptionalDecider$ You | TriggerDescription$ When this creature deals combat damage to a player, you may have it deal damage equal to its power to target creature that player controls.
SVar:Damage:DB$ DealDamage | ValidTgts$ Creature.ControlledBy TriggeredDefendingPlayer | TgtPrompt$ Select target creature defending player controls | NumDmg$ CommandoRaidX SVar:Damage:DB$ DealDamage | ValidTgts$ Creature.ControlledBy TriggeredDefendingPlayer | TgtPrompt$ Select target creature defending player controls | NumDmg$ CommandoRaidX
SVar:CommandoRaidX:Count$CardPower SVar:CommandoRaidX:Count$CardPower

View File

@@ -2,9 +2,8 @@ Name:Component Collector
ManaCost:2 U ManaCost:2 U
Types:Creature Homunculus Types:Creature Homunculus
PT:1/4 PT:1/4
R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | DayTime$ Neither | ReplaceWith$ DoDay | Description$ If it's neither day nor night, it becomes day as CARDNAME enters the battlefield. R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | DayTime$ Neither | ReplaceWith$ DoDay | ReplacementResult$ Updated | Description$ If it's neither day nor night, it becomes day as CARDNAME enters the battlefield.
SVar:DoDay:DB$ DayTime | Value$ Day | SubAbility$ ETB SVar:DoDay:DB$ DayTime | Value$ Day
SVar:ETB:DB$ InternalEtbReplacement
T:Mode$ DayTimeChanges | Execute$ TrigTapOrUntap | TriggerZones$ Battlefield | TriggerDescription$ Whenever day becomes night or night becomes day, you may tap or untap target nonland permanent. T:Mode$ DayTimeChanges | Execute$ TrigTapOrUntap | TriggerZones$ Battlefield | TriggerDescription$ Whenever day becomes night or night becomes day, you may tap or untap target nonland permanent.
SVar:TrigTapOrUntap:DB$ TapOrUntap | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent SVar:TrigTapOrUntap:DB$ TapOrUntap | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent
Oracle:If it's neither day nor night, it becomes day as Component Collector enters the battlefield.\nWhenever day becomes night or night becomes day, you may tap or untap target nonland permanent. Oracle:If it's neither day nor night, it becomes day as Component Collector enters the battlefield.\nWhenever day becomes night or night becomes day, you may tap or untap target nonland permanent.

View File

@@ -4,7 +4,7 @@ Types:Legendary Creature God
PT:2/4 PT:2/4
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigExile | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ At the beginning of your upkeep, you may exile NICKNAME. If you do, it gains "Whenever a land enters the battlefield under your control, if Cosima is exiled, you may put a voyage counter on it. If you don't, return Cosima to the battlefield with X +1/+1 counters on it and draw X cards, where X is the number of voyage counters on it." T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigExile | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ At the beginning of your upkeep, you may exile NICKNAME. If you do, it gains "Whenever a land enters the battlefield under your control, if Cosima is exiled, you may put a voyage counter on it. If you don't, return Cosima to the battlefield with X +1/+1 counters on it and draw X cards, where X is the number of voyage counters on it."
SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | SubAbility$ DBAnimate SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | SubAbility$ DBAnimate
SVar:DBAnimate:DB$ Animate | Defined$ Remembered | Triggers$ LandEnter | Duration$ Permanent | sVars$ TrigReturn,DBDraw,X | SubAbility$ DBCleanup SVar:DBAnimate:DB$ Animate | Defined$ Remembered | Triggers$ LandEnter | Duration$ Permanent | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:LandEnter:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | TriggerZones$ Exile | ValidCard$ Land.YouCtrl | Execute$ TrigAddCounter | TriggerDescription$ Whenever a land enters the battlefield under your control, if NICKNAME is exiled, you may put a voyage counter on it. If you don't, return NICKNAME to the battlefield with X +1/+1 counters on it and draw X cards, where X is the number of voyage counters on it. SVar:LandEnter:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | TriggerZones$ Exile | ValidCard$ Land.YouCtrl | Execute$ TrigAddCounter | TriggerDescription$ Whenever a land enters the battlefield under your control, if NICKNAME is exiled, you may put a voyage counter on it. If you don't, return NICKNAME to the battlefield with X +1/+1 counters on it and draw X cards, where X is the number of voyage counters on it.
SVar:TrigAddCounter:DB$ PutCounter | Optional$ True | Defined$ Self | CounterType$ VOYAGE | CounterNum$ 1 | RememberAmount$ True | SubAbility$ DBReturn SVar:TrigAddCounter:DB$ PutCounter | Optional$ True | Defined$ Self | CounterType$ VOYAGE | CounterNum$ 1 | RememberAmount$ True | SubAbility$ DBReturn

View File

@@ -4,7 +4,7 @@ Types:Creature Spirit
PT:2/1 PT:2/1
A:AB$ PeekAndReveal | Cost$ 1 | NoReveal$ True | SpellDescription$ Look at the top card of your library. A:AB$ PeekAndReveal | Cost$ 1 | NoReveal$ True | SpellDescription$ Look at the top card of your library.
A:AB$ PeekAndReveal | Cost$ 2 | ActivationLimit$ 1 | NoPeek$ True | RememberRevealed$ True | SubAbility$ DBAnimate | SpellDescription$ Reveal the top card of your library. A:AB$ PeekAndReveal | Cost$ 2 | ActivationLimit$ 1 | NoPeek$ True | RememberRevealed$ True | SubAbility$ DBAnimate | SpellDescription$ Reveal the top card of your library.
SVar:DBAnimate:DB$ Animate | Defined$ Self | Triggers$ TrigDamage | sVars$ TrigDestroy | ConditionDefined$ Remembered | ConditionPresent$ Card.Land | SubAbility$ DBCleanup | StackDescription$ SpellDescription | SpellDescription$ If it's a land card, CARDNAME gains "Whenever CARDNAME deals damage to a creature, destroy that creature" until end of turn. SVar:DBAnimate:DB$ Animate | Defined$ Self | Triggers$ TrigDamage | ConditionDefined$ Remembered | ConditionPresent$ Card.Land | SubAbility$ DBCleanup | StackDescription$ SpellDescription | SpellDescription$ If it's a land card, CARDNAME gains "Whenever CARDNAME deals damage to a creature, destroy that creature" until end of turn.
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | StackDescription$ None | SpellDescription$ Activate only once each turn. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | StackDescription$ None | SpellDescription$ Activate only once each turn.
SVar:TrigDamage:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Creature | TriggerZones$ Battlefield | Execute$ TrigDestroy | TriggerDescription$ Whenever CARDNAME deals damage to a creature, destroy that creature. SVar:TrigDamage:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Creature | TriggerZones$ Battlefield | Execute$ TrigDestroy | TriggerDescription$ Whenever CARDNAME deals damage to a creature, destroy that creature.
SVar:TrigDestroy:DB$ Destroy | Defined$ TriggeredTargetLKICopy SVar:TrigDestroy:DB$ Destroy | Defined$ TriggeredTargetLKICopy

View File

@@ -2,7 +2,7 @@ Name:Demonic Gifts
ManaCost:1 B ManaCost:1 B
Types:Instant Types:Instant
A:SP$ Pump | Cost$ 1 B | ValidTgts$ Creature | TgtPrompt$ Choose target creature | NumAtt$ +2 | SubAbility$ DBAnimate | SpellDescription$ Until end of turn, target creature gets +2/+0 and gains "When this creature dies, return it to the battlefield under its owner's control." | StackDescription$ Spelldescription A:SP$ Pump | Cost$ 1 B | ValidTgts$ Creature | TgtPrompt$ Choose target creature | NumAtt$ +2 | SubAbility$ DBAnimate | SpellDescription$ Until end of turn, target creature gets +2/+0 and gains "When this creature dies, return it to the battlefield under its owner's control." | StackDescription$ Spelldescription
SVar:DBAnimate:DB$ Animate | Triggers$ TrigDies | sVars$ TrigReturn | Defined$ ParentTarget | StackDescription$ None SVar:DBAnimate:DB$ Animate | Triggers$ TrigDies | Defined$ ParentTarget | StackDescription$ None
SVar:TrigDies:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigReturn | TriggerDescription$ When CARDNAME dies, return it to the battlefield under its owner's control. SVar:TrigDies:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigReturn | TriggerDescription$ When CARDNAME dies, return it to the battlefield under its owner's control.
SVar:TrigReturn:DB$ ChangeZone | DB$ ChangeZone | Defined$ TriggeredNewCardLKICopy | Origin$ Graveyard | Destination$ Battlefield SVar:TrigReturn:DB$ ChangeZone | DB$ ChangeZone | Defined$ TriggeredNewCardLKICopy | Origin$ Graveyard | Destination$ Battlefield
Oracle:Until end of turn, target creature gets +2/+0 and gains "When this creature dies, return it to the battlefield under its owner's control." Oracle:Until end of turn, target creature gets +2/+0 and gains "When this creature dies, return it to the battlefield under its owner's control."

View File

@@ -1,7 +1,7 @@
Name:Driven Name:Driven
ManaCost:1 G ManaCost:1 G
Types:Sorcery Types:Sorcery
A:SP$ AnimateAll | Cost$ 1 G | ValidCards$ Creature.YouCtrl | Keywords$ Trample | Triggers$ Trig1 | sVars$ Eff1 | StackDescription$ SpellDescription | SpellDescription$ Until end of turn, creatures you control gain trample and "Whenever this creature deals combat damage to a player, draw a card." A:SP$ AnimateAll | Cost$ 1 G | ValidCards$ Creature.YouCtrl | Keywords$ Trample | Triggers$ Trig1 | StackDescription$ SpellDescription | SpellDescription$ Until end of turn, creatures you control gain trample and "Whenever this creature deals combat damage to a player, draw a card."
SVar:Trig1:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ Eff1 | CombatDamage$ True | TriggerDescription$ Whenever this creature deals combat damage to a player, draw a card. SVar:Trig1:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ Eff1 | CombatDamage$ True | TriggerDescription$ Whenever this creature deals combat damage to a player, draw a card.
SVar:Eff1:DB$ Draw | NumCards$ 1 SVar:Eff1:DB$ Draw | NumCards$ 1
AlternateMode:Split AlternateMode:Split
@@ -13,7 +13,7 @@ Name:Despair
ManaCost:1 B ManaCost:1 B
Types:Sorcery Types:Sorcery
K:Aftermath K:Aftermath
A:SP$ AnimateAll | Cost$ 1 B | ValidCards$ Creature.YouCtrl | Keywords$ Menace | Triggers$ Trig2 | sVars$ Eff2 | StackDescription$ SpellDescription | SpellDescription$ Until end of turn, creatures you control gain menace and "Whenever this creature deals combat damage to a player, that player discards a card." A:SP$ AnimateAll | Cost$ 1 B | ValidCards$ Creature.YouCtrl | Keywords$ Menace | Triggers$ Trig2 | StackDescription$ SpellDescription | SpellDescription$ Until end of turn, creatures you control gain menace and "Whenever this creature deals combat damage to a player, that player discards a card."
SVar:Trig2:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ Eff2 | CombatDamage$ True | TriggerDescription$ Whenever this creature deals combat damage to a player, that player discards a card. SVar:Trig2:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ Eff2 | CombatDamage$ True | TriggerDescription$ Whenever this creature deals combat damage to a player, that player discards a card.
SVar:Eff2:DB$ Discard | Defined$ TriggeredTarget | NumCards$ 1 | Mode$ TgtChoose SVar:Eff2:DB$ Discard | Defined$ TriggeredTarget | NumCards$ 1 | Mode$ TgtChoose
Oracle:Aftermath (Cast this spell only from your graveyard. Then exile it.)\nUntil end of turn, creatures you control gain menace and "Whenever this creature deals combat damage to a player, that player discards a card." Oracle:Aftermath (Cast this spell only from your graveyard. Then exile it.)\nUntil end of turn, creatures you control gain menace and "Whenever this creature deals combat damage to a player, that player discards a card."

View File

@@ -2,7 +2,7 @@ Name:Epic Experiment
ManaCost:X U R ManaCost:X U R
Types:Sorcery Types:Sorcery
A:SP$ Dig | Cost$ X U R | Defined$ You | DigNum$ X | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | SubAbility$ DBPlay | SpellDescription$ Exile the top X cards of your library. You may cast instant and sorcery spells with mana value X or less from among them without paying their mana costs. Then put all cards exiled this way that weren't cast into your graveyard. A:SP$ Dig | Cost$ X U R | Defined$ You | DigNum$ X | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | SubAbility$ DBPlay | SpellDescription$ Exile the top X cards of your library. You may cast instant and sorcery spells with mana value X or less from among them without paying their mana costs. Then put all cards exiled this way that weren't cast into your graveyard.
SVar:DBPlay:DB$ Play | Valid$ Instant.cmcLEX+IsRemembered+YouOwn,Sorcery.cmcLEX+IsRemembered+YouOwn | ValidZone$ Exile | ValidSA$ Spell | Controller$ You | WithoutManaCost$ True | Optional$ True | Amount$ All | SubAbility$ DBGrave SVar:DBPlay:DB$ Play | Valid$ Card.IsRemembered+YouOwn | ValidZone$ Exile | ValidSA$ Instant.cmcLEX,Sorcery.cmcLEX | Controller$ You | WithoutManaCost$ True | Optional$ True | Amount$ All | SubAbility$ DBGrave
SVar:DBGrave:DB$ ChangeZoneAll | Origin$ Exile | Destination$ Graveyard | ChangeType$ Card.IsRemembered+YouOwn | SubAbility$ DBCleanup SVar:DBGrave:DB$ ChangeZoneAll | Origin$ Exile | Destination$ Graveyard | ChangeType$ Card.IsRemembered+YouOwn | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:X:Count$xPaid SVar:X:Count$xPaid

View File

@@ -2,9 +2,8 @@ Name:Firmament Sage
ManaCost:3 U ManaCost:3 U
Types:Creature Human Wizard Types:Creature Human Wizard
PT:2/3 PT:2/3
R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | DayTime$ Neither | ReplaceWith$ DoDay | Description$ If it's neither day nor night, it becomes day as CARDNAME enters the battlefield. R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | DayTime$ Neither | ReplaceWith$ DoDay | ReplacementResult$ Updated | Description$ If it's neither day nor night, it becomes day as CARDNAME enters the battlefield.
SVar:DoDay:DB$ DayTime | Value$ Day | SubAbility$ ETB SVar:DoDay:DB$ DayTime | Value$ Day
SVar:ETB:DB$ InternalEtbReplacement
T:Mode$ DayTimeChanges | Execute$ DBDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever day becomes night or night becomes day, draw a card. T:Mode$ DayTimeChanges | Execute$ DBDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever day becomes night or night becomes day, draw a card.
SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1
Oracle:If it's neither day nor night, it becomes day as Firmament Sage enters the battlefield.\nWhenever day becomes night or night becomes day, draw a card. Oracle:If it's neither day nor night, it becomes day as Firmament Sage enters the battlefield.\nWhenever day becomes night or night becomes day, draw a card.

View File

@@ -2,7 +2,7 @@ Name:Flash Conscription
ManaCost:5 R ManaCost:5 R
Types:Instant Types:Instant
A:SP$ GainControl | Cost$ 5 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | AddKWs$ Haste | LoseControl$ EOT | Untap$ True | SubAbility$ DBAnimate | SpellDescription$ Untap target creature and gain control of it until end of turn. That creature gains haste until end of turn. If {W} was spent to cast this spell, the creature gains "Whenever this creature deals combat damage, you gain that much life" until end of turn. A:SP$ GainControl | Cost$ 5 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | AddKWs$ Haste | LoseControl$ EOT | Untap$ True | SubAbility$ DBAnimate | SpellDescription$ Untap target creature and gain control of it until end of turn. That creature gains haste until end of turn. If {W} was spent to cast this spell, the creature gains "Whenever this creature deals combat damage, you gain that much life" until end of turn.
SVar:DBAnimate:DB$ Animate | Defined$ Targeted | Triggers$ TrigDamage | sVars$ GainLife,X | ConditionManaSpent$ W SVar:DBAnimate:DB$ Animate | Defined$ Targeted | Triggers$ TrigDamage | ConditionManaSpent$ W
SVar:TrigDamage:Mode$ DamageDealtOnce | CombatDamage$ True | ValidSource$ Card.Self | Execute$ GainLife | TriggerZones$ Battlefield | TriggerDescription$ Whenever this creature deals combat damage, you gain that much life. SVar:TrigDamage:Mode$ DamageDealtOnce | CombatDamage$ True | ValidSource$ Card.Self | Execute$ GainLife | TriggerZones$ Battlefield | TriggerDescription$ Whenever this creature deals combat damage, you gain that much life.
SVar:GainLife:DB$ GainLife | LifeAmount$ X SVar:GainLife:DB$ GainLife | LifeAmount$ X
SVar:X:TriggerCount$DamageAmount SVar:X:TriggerCount$DamageAmount

View File

@@ -3,9 +3,8 @@ ManaCost:1 W W
Types:Creature Human Soldier Types:Creature Human Soldier
PT:3/3 PT:3/3
K:Ward:1 K:Ward:1
R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | DayTime$ Neither | ReplaceWith$ DoDay | Description$ If it's neither day nor night, it becomes day as CARDNAME enters the battlefield. R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | DayTime$ Neither | ReplaceWith$ DoDay | ReplacementResult$ Updated | Description$ If it's neither day nor night, it becomes day as CARDNAME enters the battlefield.
SVar:DoDay:DB$ DayTime | Value$ Day | SubAbility$ ETB SVar:DoDay:DB$ DayTime | Value$ Day
SVar:ETB:DB$ InternalEtbReplacement
T:Mode$ DayTimeChanges | Execute$ TrigDig | TriggerZones$ Battlefield | TriggerDescription$ Whenever day becomes night or night becomes day, look at the top four cards of your library. You may reveal a creature card with mana value 3 or less from among them and put it into your hand. Put the rest on the bottom of your library in any order. T:Mode$ DayTimeChanges | Execute$ TrigDig | TriggerZones$ Battlefield | TriggerDescription$ Whenever day becomes night or night becomes day, look at the top four cards of your library. You may reveal a creature card with mana value 3 or less from among them and put it into your hand. Put the rest on the bottom of your library in any order.
SVar:TrigDig:DB$ Dig | ForceRevealToController$ True | DigNum$ 4 | ChangeNum$ 1 | Optional$ True | ChangeValid$ Creature.cmcLE3 SVar:TrigDig:DB$ Dig | ForceRevealToController$ True | DigNum$ 4 | ChangeNum$ 1 | Optional$ True | ChangeValid$ Creature.cmcLE3
Oracle:Ward {1}\nIf it's neither day nor night, it becomes day as Gavony Dawnguard enters the battlefield.\nWhenever day becomes night or night becomes day, look at the top four cards of your library. You may reveal a creature card with mana value 3 or less from among them and put it into your hand. Put the rest on the bottom of your library in any order. Oracle:Ward {1}\nIf it's neither day nor night, it becomes day as Gavony Dawnguard enters the battlefield.\nWhenever day becomes night or night becomes day, look at the top four cards of your library. You may reveal a creature card with mana value 3 or less from among them and put it into your hand. Put the rest on the bottom of your library in any order.

View File

@@ -3,7 +3,7 @@ ManaCost:W
Types:Enchantment Aura Types:Enchantment Aura
K:Enchant Plains K:Enchant Plains
A:SP$ Attach | Cost$ W | ValidTgts$ Plains | AILogic$ Pump A:SP$ Attach | Cost$ W | ValidTgts$ Plains | AILogic$ Pump
A:AB$ Animate | Cost$ 2 | Defined$ Enchanted | Power$ 2 | Toughness$ 5 | Types$ Creature,Spirit | Colors$ White | Triggers$ PseudoLifelink | sVars$ GenjuTrigGain,GenjuX | SpellDescription$ Until end of turn, enchanted Plains becomes a 2/5 white Spirit creature with "Whenever this creature deals damage, its controller gains that much life." It's still a land. A:AB$ Animate | Cost$ 2 | Defined$ Enchanted | Power$ 2 | Toughness$ 5 | Types$ Creature,Spirit | Colors$ White | Triggers$ PseudoLifelink | SpellDescription$ Until end of turn, enchanted Plains becomes a 2/5 white Spirit creature with "Whenever this creature deals damage, its controller gains that much life." It's still a land.
T:Mode$ ChangesZone | ValidCard$ Card.AttachedBy | Origin$ Battlefield | Destination$ Graveyard | TriggerZones$ Battlefield | Execute$ TrigReturnOwner | OptionalDecider$ You | TriggerDescription$ When enchanted Plains is put into a graveyard, you may return CARDNAME from your graveyard to your hand. T:Mode$ ChangesZone | ValidCard$ Card.AttachedBy | Origin$ Battlefield | Destination$ Graveyard | TriggerZones$ Battlefield | Execute$ TrigReturnOwner | OptionalDecider$ You | TriggerDescription$ When enchanted Plains is put into a graveyard, you may return CARDNAME from your graveyard to your hand.
SVar:TrigReturnOwner:DB$ ChangeZone | Defined$ Self | Origin$ Graveyard | Destination$ Hand SVar:TrigReturnOwner:DB$ ChangeZone | Defined$ Self | Origin$ Graveyard | Destination$ Hand
SVar:PseudoLifelink:Mode$ DamageDealtOnce | ValidSource$ Card.Self | Execute$ GenjuTrigGain | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals damage, you gain that much life. SVar:PseudoLifelink:Mode$ DamageDealtOnce | ValidSource$ Card.Self | Execute$ GenjuTrigGain | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals damage, you gain that much life.

View File

@@ -4,7 +4,7 @@ Types:Instant
A:SP$ Pump | Cost$ U | ValidTgts$ Wall.blockedThisTurn | TgtPrompt$ Select target Wall that blocked this turn | SubAbility$ DBPutCounter | StackDescription$ SpellDescription | SpellDescription$ Put X glyph counters on target creature that target Wall blocked this turn, where X is the power of that blocked creature. The creature gains "This creature doesn't untap during your untap step if it has a glyph counter on it" and "At the beginning of your upkeep, remove a glyph counter from this creature." A:SP$ Pump | Cost$ U | ValidTgts$ Wall.blockedThisTurn | TgtPrompt$ Select target Wall that blocked this turn | SubAbility$ DBPutCounter | StackDescription$ SpellDescription | SpellDescription$ Put X glyph counters on target creature that target Wall blocked this turn, where X is the power of that blocked creature. The creature gains "This creature doesn't untap during your untap step if it has a glyph counter on it" and "At the beginning of your upkeep, remove a glyph counter from this creature."
SVar:DBPutCounter:DB$ PutCounter | CounterType$ GLYPH | CounterNum$ X | ValidTgts$ Creature.blockedByValidThisTurn ParentTarget | TgtPrompt$ Select target creature blocked by target Wall this turn to put counters on | SubAbility$ Delude | IsCurse$ True SVar:DBPutCounter:DB$ PutCounter | CounterType$ GLYPH | CounterNum$ X | ValidTgts$ Creature.blockedByValidThisTurn ParentTarget | TgtPrompt$ Select target creature blocked by target Wall this turn to put counters on | SubAbility$ Delude | IsCurse$ True
SVar:X:Targeted$CardPower SVar:X:Targeted$CardPower
SVar:Delude:DB$ Animate | Defined$ ParentTarget | staticAbilities$ Delusional | Triggers$ TrigGlyphUpkeep | sVars$ LoseGlyph | Duration$ Permanent | StackDescription$ None SVar:Delude:DB$ Animate | Defined$ ParentTarget | staticAbilities$ Delusional | Triggers$ TrigGlyphUpkeep | Duration$ Permanent | StackDescription$ None
SVar:Delusional:Mode$ Continuous | Affected$ Card.Self+counters_GE1_GLYPH | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. | Description$ CARDNAME doesn't untap during your untap step if it has a glyph counter on it. SVar:Delusional:Mode$ Continuous | Affected$ Card.Self+counters_GE1_GLYPH | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. | Description$ CARDNAME doesn't untap during your untap step if it has a glyph counter on it.
SVar:TrigGlyphUpkeep:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ LoseGlyph | TriggerDescription$ At the beginning of your upkeep, remove a glyph counter from CARDNAME. SVar:TrigGlyphUpkeep:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ LoseGlyph | TriggerDescription$ At the beginning of your upkeep, remove a glyph counter from CARDNAME.
SVar:LoseGlyph:DB$ RemoveCounter | CounterType$ GLYPH | CounterNum$ 1 SVar:LoseGlyph:DB$ RemoveCounter | CounterType$ GLYPH | CounterNum$ 1

View File

@@ -1,7 +1,7 @@
Name:Gruesome Slaughter Name:Gruesome Slaughter
ManaCost:6 ManaCost:6
Types:Sorcery Types:Sorcery
A:SP$ AnimateAll | Cost$ 6 | ValidCards$ Creature.Colorless+YouCtrl | Abilities$ ThrowPunch | sVars$ GruesomeX | SpellDescription$ Until end of turn, colorless creatures you control gain "{T}: This creature deals damage equal to its power to target creature." A:SP$ AnimateAll | Cost$ 6 | ValidCards$ Creature.Colorless+YouCtrl | Abilities$ ThrowPunch | SpellDescription$ Until end of turn, colorless creatures you control gain "{T}: This creature deals damage equal to its power to target creature."
SVar:ThrowPunch:AB$ DealDamage | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ GruesomeX | SpellDescription$ This creature deals damage equal to its power to target creature. SVar:ThrowPunch:AB$ DealDamage | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ GruesomeX | SpellDescription$ This creature deals damage equal to its power to target creature.
SVar:GruesomeX:Count$CardPower SVar:GruesomeX:Count$CardPower
AI:RemoveDeck:Random AI:RemoveDeck:Random

View File

@@ -2,7 +2,7 @@ Name:Hunter's Prowess
ManaCost:4 G ManaCost:4 G
Types:Sorcery Types:Sorcery
A:SP$ Pump | Cost$ 4 G | ValidTgts$ Creature | NumAtt$ 3 | NumDef$ 3 | KW$ Trample | SubAbility$ DBAnimate | SpellDescription$ Until end of turn, target creature gets +3/+3 and gains trample and "Whenever this creature deals combat damage to a player, draw that many cards." | StackDescription$ SpellDescription A:SP$ Pump | Cost$ 4 G | ValidTgts$ Creature | NumAtt$ 3 | NumDef$ 3 | KW$ Trample | SubAbility$ DBAnimate | SpellDescription$ Until end of turn, target creature gets +3/+3 and gains trample and "Whenever this creature deals combat damage to a player, draw that many cards." | StackDescription$ SpellDescription
SVar:DBAnimate:DB$ Animate | Defined$ ParentTarget | Triggers$ HunterProwessTrig | sVars$ HunterProwessX,HunterProwessY | StackDescription$ None SVar:DBAnimate:DB$ Animate | Defined$ ParentTarget | Triggers$ HunterProwessTrig | StackDescription$ None
SVar:HunterProwessTrig:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ HunterProwessX | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, draw that many cards. SVar:HunterProwessTrig:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ HunterProwessX | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, draw that many cards.
SVar:HunterProwessX:DB$ Draw | Defined$ You | NumCards$ HunterProwessY SVar:HunterProwessX:DB$ Draw | Defined$ You | NumCards$ HunterProwessY
SVar:HunterProwessY:TriggerCount$DamageAmount SVar:HunterProwessY:TriggerCount$DamageAmount

View File

@@ -18,9 +18,7 @@ Types:Legendary Snow Artifact
A:AB$ Effect | Cost$ T | TgtZone$ Graveyard | ValidTgts$ Permanent.Snow+YouCtrl | TgtPrompt$ Choose target snow permanent card in your graveyard | StaticAbilities$ STPlay | RememberObjects$ Targeted | ForgetOnMoved$ Graveyard | SubAbility$ DBEffect | SpellDescription$ You may play target snow permanent card from your graveyard this turn. If you do, it enters the battlefield tapped. A:AB$ Effect | Cost$ T | TgtZone$ Graveyard | ValidTgts$ Permanent.Snow+YouCtrl | TgtPrompt$ Choose target snow permanent card in your graveyard | StaticAbilities$ STPlay | RememberObjects$ Targeted | ForgetOnMoved$ Graveyard | SubAbility$ DBEffect | SpellDescription$ You may play target snow permanent card from your graveyard this turn. If you do, it enters the battlefield tapped.
SVar:STPlay:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Graveyard | Description$ You may play target snow permanent card from your graveyard this turn. SVar:STPlay:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Graveyard | Description$ You may play target snow permanent card from your graveyard this turn.
SVar:DBEffect:DB$ Effect | RememberObjects$ ParentTarget | ForgetOnMoved$ Stack | ReplacementEffects$ ETBCreat SVar:DBEffect:DB$ Effect | RememberObjects$ ParentTarget | ForgetOnMoved$ Stack | ReplacementEffects$ ETBCreat
SVar:ETBCreat:Event$ Moved | ValidCard$ Card.IsRemembered | Destination$ Battlefield | ReplaceWith$ DBTap | Description$ If you do, it enters the battlefield tapped. SVar:ETBCreat:Event$ Moved | ValidCard$ Card.IsRemembered | Destination$ Battlefield | ReplaceWith$ DBTap | ReplacementResult$ Updated | Description$ If you do, it enters the battlefield tapped.
SVar:DBTap:DB$ Tap | Defined$ ReplacedCard | ETB$ True | SubAbility$ ToBattlefield SVar:DBTap:DB$ Tap | Defined$ ReplacedCard | ETB$ True | SubAbility$ DBExile
SVar:ToBattlefield:DB$ InternalEtbReplacement | SubAbility$ DBExile
SVar:DBExile:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:DBExile:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile
SVar:STTapped:Mode$ Continuous | Affected$ Card.IsRemembered | AddKeyword$ CARDNAME enters the battlefield tapped.
Oracle:{T}: You may play target snow permanent card from your graveyard this turn. If you do, it enters the battlefield tapped. Oracle:{T}: You may play target snow permanent card from your graveyard this turn. If you do, it enters the battlefield tapped.

View File

@@ -2,7 +2,7 @@ Name:Launch the Fleet
ManaCost:W ManaCost:W
Types:Sorcery Types:Sorcery
K:Strive:1 K:Strive:1
A:SP$ Animate | Cost$ W | TargetMin$ 0 | TargetMax$ MaxTargets | AILogic$ Attacking | ValidTgts$ Creature | Triggers$ AttackTrigger | sVars$ LaunchTokenAttacking | SpellDescription$ Until end of turn, any number of target creatures each gain "Whenever this creature attacks, create a 1/1 white Soldier creature token that's tapped and attacking." A:SP$ Animate | Cost$ W | TargetMin$ 0 | TargetMax$ MaxTargets | AILogic$ Attacking | ValidTgts$ Creature | Triggers$ AttackTrigger | SpellDescription$ Until end of turn, any number of target creatures each gain "Whenever this creature attacks, create a 1/1 white Soldier creature token that's tapped and attacking."
SVar:AttackTrigger:Mode$ Attacks | ValidCard$ Card.Self | Execute$ LaunchTokenAttacking | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME attacks, create a 1/1 white Soldier creature token that's tapped and attacking. SVar:AttackTrigger:Mode$ Attacks | ValidCard$ Card.Self | Execute$ LaunchTokenAttacking | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME attacks, create a 1/1 white Soldier creature token that's tapped and attacking.
SVar:LaunchTokenAttacking:DB$ Token | TokenAmount$ 1 | TokenScript$ w_1_1_soldier | TokenOwner$ You | TokenAttacking$ True | TokenTapped$ True SVar:LaunchTokenAttacking:DB$ Token | TokenAmount$ 1 | TokenScript$ w_1_1_soldier | TokenOwner$ You | TokenAttacking$ True | TokenTapped$ True
SVar:MaxTargets:Count$Valid Creature SVar:MaxTargets:Count$Valid Creature

View File

@@ -2,7 +2,7 @@ Name:Malakir Rebirth
ManaCost:B ManaCost:B
Types:Instant Types:Instant
A:SP$ LoseLife | Cost$ B | Defined$ You | LifeAmount$ 2 | SubAbility$ DBAnimate | SpellDescription$ Choose target creature. You lose 2 life. Until end of turn, that creature gains "When this creature dies, return it to the battlefield tapped under its owner's control." A:SP$ LoseLife | Cost$ B | Defined$ You | LifeAmount$ 2 | SubAbility$ DBAnimate | SpellDescription$ Choose target creature. You lose 2 life. Until end of turn, that creature gains "When this creature dies, return it to the battlefield tapped under its owner's control."
SVar:DBAnimate:DB$ Animate | ValidTgts$ Creature | TgtPrompt$ Choose target creature | Triggers$ TrigDies | sVars$ TrigReturn | StackDescription$ Until end of turn, {c:Targeted} gains "When this creature dies, return it to the battlefield tapped under its owner's control." SVar:DBAnimate:DB$ Animate | ValidTgts$ Creature | TgtPrompt$ Choose target creature | Triggers$ TrigDies | StackDescription$ Until end of turn, {c:Targeted} gains "When this creature dies, return it to the battlefield tapped under its owner's control."
SVar:TrigDies:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigReturn | TriggerDescription$ When CARDNAME dies, return it to the battlefield tapped under its owner's control. SVar:TrigDies:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigReturn | TriggerDescription$ When CARDNAME dies, return it to the battlefield tapped under its owner's control.
SVar:TrigReturn:DB$ ChangeZone | DB$ ChangeZone | Defined$ TriggeredNewCardLKICopy | Origin$ Graveyard | Destination$ Battlefield | Tapped$ True SVar:TrigReturn:DB$ ChangeZone | DB$ ChangeZone | Defined$ TriggeredNewCardLKICopy | Origin$ Graveyard | Destination$ Battlefield | Tapped$ True
AlternateMode:Modal AlternateMode:Modal

View File

@@ -5,5 +5,5 @@ K:Enchant creature
A:SP$ Attach | Cost$ 2 W | ValidTgts$ Creature | AILogic$ Pump A:SP$ Attach | Cost$ 2 W | ValidTgts$ Creature | AILogic$ Pump
S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 1 | AddToughness$ 1 | Goad$ True | Description$ Enchanted creature gets +1/+1 and is goaded. (It attacks each combat if able and attacks a player other than you if able.) S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 1 | AddToughness$ 1 | Goad$ True | Description$ Enchanted creature gets +1/+1 and is goaded. (It attacks each combat if able and attacks a player other than you if able.)
T:Mode$ Attacks | ValidCard$ Card.AttachedBy | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever enchanted creature attacks, each other creature that's attacking one of your opponents gets +1/+1 until end of turn. T:Mode$ Attacks | ValidCard$ Card.AttachedBy | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever enchanted creature attacks, each other creature that's attacking one of your opponents gets +1/+1 until end of turn.
SVar:TrigPump:DB$ PumpAll | ValidCards$ Creature.NotEnchantedBy+attackingOpponent | NumAtt$ +1 | NumDef$ +1 SVar:TrigPump:DB$ PumpAll | ValidCards$ Creature.NotEnchantedBy+attacking Opponent | NumAtt$ +1 | NumDef$ +1
Oracle:Enchant creature\nEnchanted creature gets +1/+1 and is goaded. (It attacks each combat if able and attacks a player other than you if able.)\nWhenever enchanted creature attacks, each other creature that's attacking one of your opponents gets +1/+1 until end of turn. Oracle:Enchant creature\nEnchanted creature gets +1/+1 and is goaded. (It attacks each combat if able and attacks a player other than you if able.)\nWhenever enchanted creature attacks, each other creature that's attacking one of your opponents gets +1/+1 until end of turn.

View File

@@ -1,7 +1,7 @@
Name:Martyrdom Name:Martyrdom
ManaCost:1 W W ManaCost:1 W W
Types:Instant Types:Instant
A:SP$ Animate | Cost$ 1 W W | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | Abilities$ Martyr | sVars$ DamageEvent,DamageEventDmg,IsCreature | StackDescription$ Until end of turn, {c:Targeted} gains "{0}: The next 1 damage that would be dealt to target creature, planeswalker, or player this turn is dealt to this creature instead." | SpellDescription$ Until end of turn, target creature you control gains "{0}: The next 1 damage that would be dealt to target creature, planeswalker, or player this turn is dealt to this creature instead." Only you may activate this ability. A:SP$ Animate | Cost$ 1 W W | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | Abilities$ Martyr | StackDescription$ Until end of turn, {c:Targeted} gains "{0}: The next 1 damage that would be dealt to target creature, planeswalker, or player this turn is dealt to this creature instead." | SpellDescription$ Until end of turn, target creature you control gains "{0}: The next 1 damage that would be dealt to target creature, planeswalker, or player this turn is dealt to this creature instead." Only you may activate this ability.
SVar:Martyr:AB$ Effect | Name$ Martyrdom Effect | Cost$ 0 | Activator$ Player.IsRemembered | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target to redirect damage from | Amount$ 1 | ReplacementEffects$ DamageEvent | Duration$ UntilHostLeavesPlayOrEOT | RememberObjects$ You,Targeted | ImprintCards$ Self | ExileOnMoved$ Battlefield | StackDescription$ The next 1 damage that would be dealt to {c:Targeted}{p:Targeted} this turn is dealt to {c:Self} instead. | SpellDescription$ The next 1 damage that would be dealt to target creature, planeswalker, or player this turn is dealt to CARDNAME instead. SVar:Martyr:AB$ Effect | Name$ Martyrdom Effect | Cost$ 0 | Activator$ Player.IsRemembered | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target to redirect damage from | Amount$ 1 | ReplacementEffects$ DamageEvent | Duration$ UntilHostLeavesPlayOrEOT | RememberObjects$ You,Targeted | ImprintCards$ Self | ExileOnMoved$ Battlefield | StackDescription$ The next 1 damage that would be dealt to {c:Targeted}{p:Targeted} this turn is dealt to {c:Self} instead. | SpellDescription$ The next 1 damage that would be dealt to target creature, planeswalker, or player this turn is dealt to CARDNAME instead.
SVar:DamageEvent:Event$ DamageDone | IsPresent$ Card.IsImprinted+Creature | ValidTarget$ Player.IsRemembered,Card.IsRemembered | ReplaceWith$ DamageEventDmg | DamageTarget$ Imprinted | Description$ The next 1 damage that would be dealt to this target this turn is dealt to EFFECTSOURCE instead. SVar:DamageEvent:Event$ DamageDone | IsPresent$ Card.IsImprinted+Creature | ValidTarget$ Player.IsRemembered,Card.IsRemembered | ReplaceWith$ DamageEventDmg | DamageTarget$ Imprinted | Description$ The next 1 damage that would be dealt to this target this turn is dealt to EFFECTSOURCE instead.
SVar:DamageEventDmg:DB$ ReplaceSplitDamage | DamageTarget$ Imprinted SVar:DamageEventDmg:DB$ ReplaceSplitDamage | DamageTarget$ Imprinted

View File

@@ -6,7 +6,7 @@ K:Defender
K:Flying K:Flying
T:Mode$ AttackerBlocked | ValidCard$ Creature | ValidBlocker$ Card.Self | Execute$ AddSpores | TriggerDescription$ Whenever CARDNAME blocks a creature, put four fungus counters on that creature. The creature gains "This creature doesn't untap during your untap step if it has a fungus counter on it" and "At the beginning of your upkeep, remove a fungus counter from this creature." T:Mode$ AttackerBlocked | ValidCard$ Creature | ValidBlocker$ Card.Self | Execute$ AddSpores | TriggerDescription$ Whenever CARDNAME blocks a creature, put four fungus counters on that creature. The creature gains "This creature doesn't untap during your untap step if it has a fungus counter on it" and "At the beginning of your upkeep, remove a fungus counter from this creature."
SVar:AddSpores:DB$ PutCounter | CounterType$ FUNGUS | CounterNum$ 4 | Defined$ TriggeredAttackerLKICopy | SubAbility$ AddFungalEffects SVar:AddSpores:DB$ PutCounter | CounterType$ FUNGUS | CounterNum$ 4 | Defined$ TriggeredAttackerLKICopy | SubAbility$ AddFungalEffects
SVar:AddFungalEffects:DB$ Animate | Defined$ TriggeredAttacker | staticAbilities$ FungalFunk | Triggers$ TrigSporeUpkeep | sVars$ LoseSpores | Duration$ Permanent SVar:AddFungalEffects:DB$ Animate | Defined$ TriggeredAttacker | staticAbilities$ FungalFunk | Triggers$ TrigSporeUpkeep | Duration$ Permanent
SVar:FungalFunk:Mode$ Continuous | Affected$ Card.Self+counters_GE1_FUNGUS | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. | Description$ CARDNAME doesn't untap during your untap step if it has a fungus counter on it. SVar:FungalFunk:Mode$ Continuous | Affected$ Card.Self+counters_GE1_FUNGUS | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. | Description$ CARDNAME doesn't untap during your untap step if it has a fungus counter on it.
SVar:TrigSporeUpkeep:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ LoseSpores | TriggerDescription$ At the beginning of your upkeep, remove a fungus counter from CARDNAME. SVar:TrigSporeUpkeep:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ LoseSpores | TriggerDescription$ At the beginning of your upkeep, remove a fungus counter from CARDNAME.
SVar:LoseSpores:DB$ RemoveCounter | CounterType$ FUNGUS | CounterNum$ 1 SVar:LoseSpores:DB$ RemoveCounter | CounterType$ FUNGUS | CounterNum$ 1

View File

@@ -6,9 +6,8 @@ K:Changeling
K:ETBReplacement:Copy:DBCopy:Optional K:ETBReplacement:Copy:DBCopy:Optional
SVar:DBCopy:DB$ Clone | Choices$ Permanent.Other+YouCtrl | AddTypes$ Legendary & Snow | SubAbility$ DBConditionEffect | AddKeywords$ Changeling | SpellDescription$ You may have Moritte of the Frost enter the battlefield as a copy of a permanent you control, except it's legendary and snow in addition to its other types and, if it's a creature, it enters with two additional +1/+1 counters on it and has changeling. SVar:DBCopy:DB$ Clone | Choices$ Permanent.Other+YouCtrl | AddTypes$ Legendary & Snow | SubAbility$ DBConditionEffect | AddKeywords$ Changeling | SpellDescription$ You may have Moritte of the Frost enter the battlefield as a copy of a permanent you control, except it's legendary and snow in addition to its other types and, if it's a creature, it enters with two additional +1/+1 counters on it and has changeling.
SVar:DBConditionEffect:DB$ Effect | RememberObjects$ Self | Name$ Moritte of the Frost Effect | ReplacementEffects$ ETBCreat SVar:DBConditionEffect:DB$ Effect | RememberObjects$ Self | Name$ Moritte of the Frost Effect | ReplacementEffects$ ETBCreat
SVar:ETBCreat:Event$ Moved | ValidCard$ Creature.IsRemembered | Destination$ Battlefield | ReplaceWith$ DBPutP1P1 | Description$ If it's a creature, it enters with two additional +1/+1 counters on it. SVar:ETBCreat:Event$ Moved | ValidCard$ Creature.IsRemembered | Destination$ Battlefield | ReplaceWith$ DBPutP1P1 | ReplacementResult$ Updated | Description$ If it's a creature, it enters with two additional +1/+1 counters on it.
SVar:DBPutP1P1:DB$ PutCounter | Defined$ ReplacedCard | CounterType$ P1P1 | ETB$ True | CounterNum$ 2 | SubAbility$ ToBattlefield SVar:DBPutP1P1:DB$ PutCounter | Defined$ ReplacedCard | CounterType$ P1P1 | ETB$ True | CounterNum$ 2 | SubAbility$ DBExile
SVar:ToBattlefield:DB$ InternalEtbReplacement | SubAbility$ DBExile
SVar:DBExile:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:DBExile:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile
DeckHas:Ability$Counters DeckHas:Ability$Counters
Oracle:Changeling (This card is every creature type.)\nYou may have Moritte of the Frost enter the battlefield as a copy of a permanent you control, except it's legendary and snow in addition to its other types and, if it's a creature, it enters with two additional +1/+1 counters on it and has changeling. Oracle:Changeling (This card is every creature type.)\nYou may have Moritte of the Frost enter the battlefield as a copy of a permanent you control, except it's legendary and snow in addition to its other types and, if it's a creature, it enters with two additional +1/+1 counters on it and has changeling.

View File

@@ -4,7 +4,7 @@ Types:Creature Human Wizard
PT:1/3 PT:1/3
K:Cumulative upkeep:1 K:Cumulative upkeep:1
A:AB$ PutCounter | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | IsCurse$ True | CounterType$ MUSIC | CounterNum$ 1 | SubAbility$ PayThePiper | SpellDescription$ Put a music counter on target creature. If it doesn't have "At the beginning of your upkeep, destroy this creature unless you pay {1} for each music counter on it," it gains that ability. A:AB$ PutCounter | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | IsCurse$ True | CounterType$ MUSIC | CounterNum$ 1 | SubAbility$ PayThePiper | SpellDescription$ Put a music counter on target creature. If it doesn't have "At the beginning of your upkeep, destroy this creature unless you pay {1} for each music counter on it," it gains that ability.
SVar:PayThePiper:DB$ Animate | Defined$ Targeted | Duration$ Permanent | Keywords$ At the beginning of your upkeep, destroy this creature unless you pay {1} for each music counter on it | Triggers$ TrigMusicianPay | sVars$ MusiciansSpite,MusicX | ConditionDefined$ Targeted | ConditionPresent$ Card.withoutAt the beginning of your upkeep, destroy this creature unless you pay {1} for each music counter on it | ConditionCompare$ GE1 SVar:PayThePiper:DB$ Animate | Defined$ Targeted | Duration$ Permanent | Keywords$ At the beginning of your upkeep, destroy this creature unless you pay {1} for each music counter on it | Triggers$ TrigMusicianPay | ConditionDefined$ Targeted | ConditionPresent$ Card.withoutAt the beginning of your upkeep, destroy this creature unless you pay {1} for each music counter on it | ConditionCompare$ GE1
#The keyword added does nothing itself other than create a keyword string to check against in the conditional #The keyword added does nothing itself other than create a keyword string to check against in the conditional
SVar:TrigMusicianPay:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ MusiciansSpite | Secondary$ True | TriggerDescription$ At the beginning of your upkeep, destroy this creature unless you pay 1 for each music counter on it. SVar:TrigMusicianPay:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ MusiciansSpite | Secondary$ True | TriggerDescription$ At the beginning of your upkeep, destroy this creature unless you pay 1 for each music counter on it.
SVar:MusiciansSpite:DB$ Destroy | Defined$ Self | UnlessCost$ MusicX | UnlessPayer$ You SVar:MusiciansSpite:DB$ Destroy | Defined$ Self | UnlessCost$ MusicX | UnlessPayer$ You

View File

@@ -2,9 +2,8 @@ Name:Mystic Reflection
ManaCost:1 U ManaCost:1 U
Types:Instant Types:Instant
A:SP$ Effect | ValidTgts$ Creature.nonLegendary | TgtPrompt$ Choose target nonlegendary creature | RememberObjects$ Targeted | ReplacementEffects$ ReplaceETB | Triggers$ TrigRemove | SpellDescription$ Choose target nonlegendary creature. The next time one or more creatures or planeswalkers enter the battlefield this turn, they enter as copies of the chosen creature. A:SP$ Effect | ValidTgts$ Creature.nonLegendary | TgtPrompt$ Choose target nonlegendary creature | RememberObjects$ Targeted | ReplacementEffects$ ReplaceETB | Triggers$ TrigRemove | SpellDescription$ Choose target nonlegendary creature. The next time one or more creatures or planeswalkers enter the battlefield this turn, they enter as copies of the chosen creature.
SVar:ReplaceETB:Event$ Moved | Destination$ Battlefield | ValidCard$ Creature,Planeswalker | ReplaceWith$ EnterAsCopy | Description$ The next time one or more creatures or planeswalkers enter the battlefield this turn, they enter as copies of the chosen creature. SVar:ReplaceETB:Event$ Moved | Destination$ Battlefield | ValidCard$ Creature,Planeswalker | ReplaceWith$ EnterAsCopy | ReplacementResult$ Updated | Description$ The next time one or more creatures or planeswalkers enter the battlefield this turn, they enter as copies of the chosen creature.
SVar:EnterAsCopy:DB$ Clone | Defined$ Remembered | CloneTarget$ ReplacedCard | SubAbility$ MoveToBattlefield SVar:EnterAsCopy:DB$ Clone | Defined$ Remembered | CloneTarget$ ReplacedCard | SubAbility$ DBImprint
SVar:MoveToBattlefield:DB$ InternalEtbReplacement | SubAbility$ DBImprint
SVar:DBImprint:DB$ Pump | ImprintCards$ ReplacedCard SVar:DBImprint:DB$ Pump | ImprintCards$ ReplacedCard
SVar:TrigRemove:Mode$ ChangesZoneAll | CheckSVar$ Z | Execute$ ExileSelf | Static$ True SVar:TrigRemove:Mode$ ChangesZoneAll | CheckSVar$ Z | Execute$ ExileSelf | Static$ True
SVar:ExileSelf:DB$ ChangeZone | Origin$ Command | Destination$ Exile | Defined$ Self SVar:ExileSelf:DB$ ChangeZone | Origin$ Command | Destination$ Exile | Defined$ Self

View File

@@ -8,7 +8,7 @@ K:ETBReplacement:Other:VolverPumped:Mandatory::Card.Self+kicked 2
SVar:VolverStrength:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 2 | ETB$ True | SubAbility$ VolverStomp | SpellDescription$ If CARDNAME was kicked with its {1}{G} kicker, it enters the battlefield with two +1/+1 counters on it and with trample. SVar:VolverStrength:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 2 | ETB$ True | SubAbility$ VolverStomp | SpellDescription$ If CARDNAME was kicked with its {1}{G} kicker, it enters the battlefield with two +1/+1 counters on it and with trample.
SVar:VolverStomp:DB$ Animate | Defined$ Self | Keywords$ Trample | Duration$ Permanent SVar:VolverStomp:DB$ Animate | Defined$ Self | Keywords$ Trample | Duration$ Permanent
SVar:VolverPumped:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | ETB$ True | SubAbility$ VolverLife | SpellDescription$ If CARDNAME was kicked with its {W} kicker, it enters the battlefield with a +1/+1 counter on it and with "Whenever CARDNAME deals damage, you gain that much life." SVar:VolverPumped:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | ETB$ True | SubAbility$ VolverLife | SpellDescription$ If CARDNAME was kicked with its {W} kicker, it enters the battlefield with a +1/+1 counter on it and with "Whenever CARDNAME deals damage, you gain that much life."
SVar:VolverLife:DB$ Animate | Defined$ Self | Triggers$ PseudoLifelink | sVars$ VolverTrigGain,VolverX | Duration$ Permanent SVar:VolverLife:DB$ Animate | Defined$ Self | Triggers$ PseudoLifelink | Duration$ Permanent
SVar:PseudoLifelink:Mode$ DamageDealtOnce | ValidSource$ Card.Self | Execute$ VolverTrigGain | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals damage, you gain that much life. SVar:PseudoLifelink:Mode$ DamageDealtOnce | ValidSource$ Card.Self | Execute$ VolverTrigGain | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals damage, you gain that much life.
SVar:VolverTrigGain:DB$ GainLife | Defined$ You | LifeAmount$ VolverX SVar:VolverTrigGain:DB$ GainLife | Defined$ You | LifeAmount$ VolverX
SVar:VolverX:TriggerCount$DamageAmount SVar:VolverX:TriggerCount$DamageAmount

View File

@@ -5,7 +5,7 @@ PT:2/1
S:Mode$ Continuous | Affected$ Card.Self | AddHiddenKeyword$ Unblockable | CheckSVar$ JoinedParty | SVarCompare$ GE1 | Description$ CARDNAME can't be blocked if you had another Cleric, Rogue, Warrior, or Wizard enter the battlefield under your control this turn. S:Mode$ Continuous | Affected$ Card.Self | AddHiddenKeyword$ Unblockable | CheckSVar$ JoinedParty | SVarCompare$ GE1 | Description$ CARDNAME can't be blocked if you had another Cleric, Rogue, Warrior, or Wizard enter the battlefield under your control this turn.
SVar:JoinedParty:Count$ThisTurnEntered_Battlefield_Cleric.YouCtrl+Other,Rogue.YouCtrl+Other,Warrior.YouCtrl+Other,Wizard.YouCtrl+Other SVar:JoinedParty:Count$ThisTurnEntered_Battlefield_Cleric.YouCtrl+Other,Rogue.YouCtrl+Other,Warrior.YouCtrl+Other,Wizard.YouCtrl+Other
T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Battlefield | CheckSVar$ X | SVarCompare$ EQ4 | Execute$ TrigAnimateAll | TriggerDescription$ At the beginning of combat on your turn, if you have a full party, creatures you control gain "Whenever this creature deals combat damage to a player, draw a card" until end of turn. T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Battlefield | CheckSVar$ X | SVarCompare$ EQ4 | Execute$ TrigAnimateAll | TriggerDescription$ At the beginning of combat on your turn, if you have a full party, creatures you control gain "Whenever this creature deals combat damage to a player, draw a card" until end of turn.
SVar:TrigAnimateAll:DB$ AnimateAll | ValidCards$ Creature.YouCtrl | Triggers$ TrigCDPlayer | sVars$ TrigDraw SVar:TrigAnimateAll:DB$ AnimateAll | ValidCards$ Creature.YouCtrl | Triggers$ TrigCDPlayer
SVar:TrigCDPlayer:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, draw a card. SVar:TrigCDPlayer:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, draw a card.
SVar:TrigDraw:DB$ Draw | NumCards$ 1 SVar:TrigDraw:DB$ Draw | NumCards$ 1
SVar:X:Count$Party SVar:X:Count$Party

View File

@@ -2,9 +2,8 @@ Name:Obsessive Astronomer
ManaCost:1 R ManaCost:1 R
Types:Creature Human Wizard Types:Creature Human Wizard
PT:2/2 PT:2/2
R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | DayTime$ Neither | ReplaceWith$ DoDay | Description$ If it's neither day nor night, it becomes day as CARDNAME enters the battlefield. R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | DayTime$ Neither | ReplaceWith$ DoDay | ReplacementResult$ Updated | Description$ If it's neither day nor night, it becomes day as CARDNAME enters the battlefield.
SVar:DoDay:DB$ DayTime | Value$ Day | SubAbility$ ETB SVar:DoDay:DB$ DayTime | Value$ Day
SVar:ETB:DB$ InternalEtbReplacement
T:Mode$ DayTimeChanges | Execute$ TrigDiscard | TriggerZones$ Battlefield | TriggerDescription$ Whenever day becomes night or night becomes day, discard up to two cards, then draw that many cards. T:Mode$ DayTimeChanges | Execute$ TrigDiscard | TriggerZones$ Battlefield | TriggerDescription$ Whenever day becomes night or night becomes day, discard up to two cards, then draw that many cards.
SVar:TrigDiscard:DB$ Discard | Defined$ You | NumCards$ 2 | Optional$ True | Mode$ TgtChoose | RememberDiscarded$ True | SubAbility$ DBDraw SVar:TrigDiscard:DB$ Discard | Defined$ You | NumCards$ 2 | Optional$ True | Mode$ TgtChoose | RememberDiscarded$ True | SubAbility$ DBDraw
SVar:DBDraw:DB$ Draw | NumCards$ Y | SubAbility$ DBCleanup SVar:DBDraw:DB$ Draw | NumCards$ Y | SubAbility$ DBCleanup

View File

@@ -2,7 +2,7 @@ Name:Open into Wonder
ManaCost:X U U ManaCost:X U U
Types:Sorcery Types:Sorcery
A:SP$ Pump | Cost$ X U U | ValidTgts$ Creature | KW$ HIDDEN Unblockable | AILogic$ Pump | TargetMin$ X | TargetMax$ X | TgtPrompt$ Select X target creatures | SubAbility$ DBAnimate | StackDescription$ X target creatures [{c:Targeted}] can't be blocked this turn. Until end of turn, those creatures gain "Whenever this creature deals combat damage to a player, draw a card." | SpellDescription$ X target creatures can't be blocked this turn. Until end of turn, those creatures gain "Whenever this creature deals combat damage to a player, draw a card." A:SP$ Pump | Cost$ X U U | ValidTgts$ Creature | KW$ HIDDEN Unblockable | AILogic$ Pump | TargetMin$ X | TargetMax$ X | TgtPrompt$ Select X target creatures | SubAbility$ DBAnimate | StackDescription$ X target creatures [{c:Targeted}] can't be blocked this turn. Until end of turn, those creatures gain "Whenever this creature deals combat damage to a player, draw a card." | SpellDescription$ X target creatures can't be blocked this turn. Until end of turn, those creatures gain "Whenever this creature deals combat damage to a player, draw a card."
SVar:DBAnimate:DB$ Animate | Defined$ Targeted | Triggers$ OpenIntoWonderTrigger | sVars$ OpenIntoWonderDraw | StackDescription$ None SVar:DBAnimate:DB$ Animate | Defined$ Targeted | Triggers$ OpenIntoWonderTrigger | StackDescription$ None
SVar:OpenIntoWonderTrigger:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ OpenIntoWonderDraw | CombatDamage$ True | TriggerDescription$ Whenever this creature deals combat damage to a player, draw a card. SVar:OpenIntoWonderTrigger:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ OpenIntoWonderDraw | CombatDamage$ True | TriggerDescription$ Whenever this creature deals combat damage to a player, draw a card.
SVar:OpenIntoWonderDraw:DB$ Draw | NumCards$ 1 SVar:OpenIntoWonderDraw:DB$ Draw | NumCards$ 1
SVar:X:Count$xPaid SVar:X:Count$xPaid

View File

@@ -6,7 +6,7 @@ K:Kicker:1 W:U
K:ETBReplacement:Other:VolverStrength:Mandatory::Card.Self+kicked 1 K:ETBReplacement:Other:VolverStrength:Mandatory::Card.Self+kicked 1
K:ETBReplacement:Other:VolverPumped:Mandatory::Card.Self+kicked 2 K:ETBReplacement:Other:VolverPumped:Mandatory::Card.Self+kicked 2
SVar:VolverStrength:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 2 | ETB$ True | SubAbility$ VolverLife | SpellDescription$ If CARDNAME was kicked with its {1}{W} kicker, it enters the battlefield with two +1/+1 counters on it and with "Whenever CARDNAME deals damage, you gain that much life." SVar:VolverStrength:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 2 | ETB$ True | SubAbility$ VolverLife | SpellDescription$ If CARDNAME was kicked with its {1}{W} kicker, it enters the battlefield with two +1/+1 counters on it and with "Whenever CARDNAME deals damage, you gain that much life."
SVar:VolverLife:DB$ Animate | Defined$ Self | Triggers$ PseudoLifelink | sVars$ VolverTrigGain,VolverX | Duration$ Permanent SVar:VolverLife:DB$ Animate | Defined$ Self | Triggers$ PseudoLifelink | Duration$ Permanent
SVar:PseudoLifelink:Mode$ DamageDealtOnce | ValidSource$ Card.Self | Execute$ VolverTrigGain | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals damage, you gain that much life. SVar:PseudoLifelink:Mode$ DamageDealtOnce | ValidSource$ Card.Self | Execute$ VolverTrigGain | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals damage, you gain that much life.
SVar:VolverTrigGain:DB$ GainLife | Defined$ You | LifeAmount$ VolverX SVar:VolverTrigGain:DB$ GainLife | Defined$ You | LifeAmount$ VolverX
SVar:VolverX:TriggerCount$DamageAmount SVar:VolverX:TriggerCount$DamageAmount

View File

@@ -5,12 +5,10 @@ A:SP$ ChangeZone | Cost$ 3 W | ValidTgts$ Creature.YouCtrl,Planeswalker.YouCtrl
SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigReturn | RememberObjects$ RememberedLKI | TriggerDescription$ Return each of them to the battlefield under its owner's control. Each of them enters the battlefield with an additional +1/+1 counter on it if it's a creature and an additional loyalty counter on it if it's a planeswalker. | SubAbility$ DBCleanup SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigReturn | RememberObjects$ RememberedLKI | TriggerDescription$ Return each of them to the battlefield under its owner's control. Each of them enters the battlefield with an additional +1/+1 counter on it if it's a creature and an additional loyalty counter on it if it's a planeswalker. | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:TrigReturn:DB$ ChangeZone | Origin$ Exile | Destination$ Battlefield | Defined$ DelayTriggerRememberedLKI | AnimateSubAbility$ DBConditionEffect SVar:TrigReturn:DB$ ChangeZone | Origin$ Exile | Destination$ Battlefield | Defined$ DelayTriggerRememberedLKI | AnimateSubAbility$ DBConditionEffect
SVar:DBConditionEffect:DB$ Effect | RememberObjects$ Remembered | Name$ Semester's End Effect | ReplacementEffects$ ETBCreat,ETBPlans SVar:DBConditionEffect:DB$ Effect | RememberObjects$ Remembered | Name$ Semester's End Effect | ReplacementEffects$ ETBCreatPlans
SVar:ETBCreat:Event$ Moved | ValidCard$ Creature.IsRemembered | Destination$ Battlefield | ReplaceWith$ DBPutP1P1 | Description$ It enters with an additional +1/+1 counter on it if it's a creature. SVar:ETBCreatPlans:Event$ Moved | ValidCard$ Creature.IsRemembered,Planeswalker.IsRemembered | Destination$ Battlefield | ReplaceWith$ DBPutP1P1 | ReplacementResult$ Updated | Description$ It enters with an additional +1/+1 counter on it if it's a creature, it enters with an additional loyalty counter on it if it's a planeswalker.
SVar:DBPutP1P1:DB$ PutCounter | Defined$ ReplacedCard | CounterType$ P1P1 | ETB$ True | CounterNum$ 1 | SubAbility$ ToBattlefield SVar:DBPutP1P1:DB$ PutCounter | Defined$ ReplacedNewCard.Creature | CounterType$ P1P1 | ETB$ True | CounterNum$ 1 | SubAbility$ DBPutLOYALTY
SVar:ETBPlans:Event$ Moved | ValidCard$ Planeswalker.IsRemembered | Destination$ Battlefield | ReplaceWith$ DBPutLOYALTY | Description$ It enters with an additional loyalty counter on it if it's a planeswalker. SVar:DBPutLOYALTY:DB$ PutCounter | Defined$ ReplacedNewCard.Planeswalker | CounterType$ LOYALTY | ETB$ True | CounterNum$ 1 | SubAbility$ DBExile
SVar:DBPutLOYALTY:DB$ PutCounter | Defined$ ReplacedCard | CounterType$ LOYALTY | ETB$ True | CounterNum$ 1 | SubAbility$ ToBattlefield
SVar:ToBattlefield:DB$ InternalEtbReplacement | SubAbility$ DBExile
SVar:DBExile:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:DBExile:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile
SVar:X:Count$Valid Permanent.YouCtrl SVar:X:Count$Valid Permanent.YouCtrl
DeckHas:Ability$Counters DeckHas:Ability$Counters

View File

@@ -2,7 +2,7 @@ Name:Shackles of Treachery
ManaCost:2 R ManaCost:2 R
Types:Sorcery Types:Sorcery
A:SP$ GainControl | Cost$ 2 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | LoseControl$ EOT | Untap$ True | AddKWs$ Haste | SubAbility$ DBAnimate | SpellDescription$ Gain control of target creature until end of turn. Untap that creature. Until end of turn, it gains haste and "Whenever this creature deals damage, destroy target Equipment attached to it." A:SP$ GainControl | Cost$ 2 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | LoseControl$ EOT | Untap$ True | AddKWs$ Haste | SubAbility$ DBAnimate | SpellDescription$ Gain control of target creature until end of turn. Untap that creature. Until end of turn, it gains haste and "Whenever this creature deals damage, destroy target Equipment attached to it."
SVar:DBAnimate:DB$ Animate | Defined$ ParentTarget | Triggers$ Shackles | sVars$ TrigDestroy SVar:DBAnimate:DB$ Animate | Defined$ ParentTarget | Triggers$ Shackles
SVar:Shackles:Mode$ DamageDone | ValidSource$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ Whenever this creature deals damage, destroy target Equipment attached to it. SVar:Shackles:Mode$ DamageDone | ValidSource$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ Whenever this creature deals damage, destroy target Equipment attached to it.
SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Equipment.Attached | TgtPrompt$ Select target Equipment attached to the creature SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Equipment.Attached | TgtPrompt$ Select target Equipment attached to the creature
Oracle:Gain control of target creature until end of turn. Untap that creature. Until end of turn, it gains haste and "Whenever this creature deals damage, destroy target Equipment attached to it." Oracle:Gain control of target creature until end of turn. Untap that creature. Until end of turn, it gains haste and "Whenever this creature deals damage, destroy target Equipment attached to it."

View File

@@ -1,7 +1,7 @@
Name:Showstopper Name:Showstopper
ManaCost:1 B R ManaCost:1 B R
Types:Instant Types:Instant
A:SP$ AnimateAll | Cost$ 1 B R | ValidCards$ Creature.YouCtrl | Triggers$ DiesTrigger | sVars$ ShowstopperTrigDamage | SpellDescription$ Until end of turn, creatures you control gain "When this creature dies, it deals 2 damage to target creature an opponent controls." A:SP$ AnimateAll | Cost$ 1 B R | ValidCards$ Creature.YouCtrl | Triggers$ DiesTrigger | SpellDescription$ Until end of turn, creatures you control gain "When this creature dies, it deals 2 damage to target creature an opponent controls."
SVar:DiesTrigger:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ ShowstopperTrigDamage | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, it deals 2 damage to target creature an opponent controls. SVar:DiesTrigger:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ ShowstopperTrigDamage | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, it deals 2 damage to target creature an opponent controls.
SVar:ShowstopperTrigDamage:DB$ DealDamage | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | NumDmg$ 2 SVar:ShowstopperTrigDamage:DB$ DealDamage | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | NumDmg$ 2
AI:RemoveDeck:All AI:RemoveDeck:All

View File

@@ -3,7 +3,7 @@ ManaCost:4 G G
Types:Creature Basilisk Mutant Types:Creature Basilisk Mutant
PT:0/0 PT:0/0
K:Graft:3 K:Graft:3
A:AB$ Animate | Cost$ 1 G | ValidTgts$ Creature.counters_GE1_P1P1 | TgtPrompt$ Select target creature with a +1/+1 counter on it | Triggers$ DestroyTrigger | sVars$ DelTrigSimic,TrigDestroySimic | SpellDescription$ Until end of turn, target creature with a +1/+1 counter on it gains "Whenever this creature deals combat damage to a creature, destroy that creature at end of combat." A:AB$ Animate | Cost$ 1 G | ValidTgts$ Creature.counters_GE1_P1P1 | TgtPrompt$ Select target creature with a +1/+1 counter on it | Triggers$ DestroyTrigger | SpellDescription$ Until end of turn, target creature with a +1/+1 counter on it gains "Whenever this creature deals combat damage to a creature, destroy that creature at end of combat."
SVar:DestroyTrigger:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Creature | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ DelTrig | TriggerDescription$ Whenever CARDNAME deals combat damage to a creature, destroy that creature at end of combat. SVar:DestroyTrigger:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Creature | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ DelTrig | TriggerDescription$ Whenever CARDNAME deals combat damage to a creature, destroy that creature at end of combat.
SVar:DelTrigSimic:DB$ DelayedTrigger | Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Player | Execute$ TrigDestroySimic | RememberObjects$ TriggeredTargetLKICopy | TriggerDescription$ Destroy damaged creature at end of combat. SVar:DelTrigSimic:DB$ DelayedTrigger | Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Player | Execute$ TrigDestroySimic | RememberObjects$ TriggeredTargetLKICopy | TriggerDescription$ Destroy damaged creature at end of combat.
SVar:TrigDestroySimic:DB$ Destroy | Defined$ DelayTriggerRememberedLKI SVar:TrigDestroySimic:DB$ Destroy | Defined$ DelayTriggerRememberedLKI

View File

@@ -4,12 +4,10 @@ Types:Creature Illusion
PT:0/0 PT:0/0
K:ETBReplacement:Copy:DBCopy:Optional K:ETBReplacement:Copy:DBCopy:Optional
SVar:DBCopy:DB$ Clone | Choices$ Creature.Other+YouCtrl,Planeswalker.Other+YouCtrl | NonLegendary$ True | SubAbility$ DBConditionEffect | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of a creature or planeswalker you control, except it enters with an additional +1/+1 counter on it if it's a creature, it enters with an additional loyalty counter on it if it's a planeswalker, and it isn't legendary if that permanent is legendary. SVar:DBCopy:DB$ Clone | Choices$ Creature.Other+YouCtrl,Planeswalker.Other+YouCtrl | NonLegendary$ True | SubAbility$ DBConditionEffect | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of a creature or planeswalker you control, except it enters with an additional +1/+1 counter on it if it's a creature, it enters with an additional loyalty counter on it if it's a planeswalker, and it isn't legendary if that permanent is legendary.
SVar:DBConditionEffect:DB$ Effect | RememberObjects$ Self | Name$ Spark Double Effect | ReplacementEffects$ ETBCreat,ETBPlans SVar:DBConditionEffect:DB$ Effect | RememberObjects$ Self | Name$ Spark Double Effect | ReplacementEffects$ ETBCreatPlans
SVar:ETBCreat:Event$ Moved | ValidCard$ Creature.IsRemembered | Destination$ Battlefield | ReplaceWith$ DBPutP1P1 | Description$ It enters with an additional +1/+1 counter on it if it's a creature. SVar:ETBCreatPlans:Event$ Moved | ValidCard$ Creature.IsRemembered,Planeswalker.IsRemembered | Destination$ Battlefield | ReplaceWith$ DBPutP1P1 | ReplacementResult$ Updated | Description$ It enters with an additional +1/+1 counter on it if it's a creature, it enters with an additional loyalty counter on it if it's a planeswalker.
SVar:DBPutP1P1:DB$ PutCounter | Defined$ ReplacedCard | CounterType$ P1P1 | ETB$ True | CounterNum$ 1 | SubAbility$ ToBattlefield SVar:DBPutP1P1:DB$ PutCounter | Defined$ ReplacedNewCard.Creature | CounterType$ P1P1 | ETB$ True | CounterNum$ 1 | SubAbility$ DBPutLOYALTY
SVar:ETBPlans:Event$ Moved | ValidCard$ Planeswalker.IsRemembered | Destination$ Battlefield | ReplaceWith$ DBPutLOYALTY | Description$ It enters with an additional loyalty counter on it if it's a planeswalker. SVar:DBPutLOYALTY:DB$ PutCounter | Defined$ ReplacedNewCard.Planeswalker | CounterType$ LOYALTY | ETB$ True | CounterNum$ 1 | SubAbility$ DBExile
SVar:DBPutLOYALTY:DB$ PutCounter | Defined$ ReplacedCard | CounterType$ LOYALTY | ETB$ True | CounterNum$ 1 | SubAbility$ ToBattlefield
SVar:ToBattlefield:DB$ InternalEtbReplacement | SubAbility$ DBExile
SVar:DBExile:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:DBExile:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile
DeckHas:Ability$Counters DeckHas:Ability$Counters
SVar:NeedsToPlayVar:Z GE1 SVar:NeedsToPlayVar:Z GE1

View File

@@ -4,7 +4,7 @@ Types:Instant
K:Entwine:1 W K:Entwine:1 W
A:SP$ Charm | Cost$ 4 W | Choices$ DBPumpAll,DBAnimateAll | CharmNum$ 1 A:SP$ Charm | Cost$ 4 W | Choices$ DBPumpAll,DBAnimateAll | CharmNum$ 1
SVar:DBPumpAll:DB$ PumpAll | NumAtt$ 2 | NumDef$ 2 | ValidCards$ Creature.YouCtrl | SpellDescription$ Creatures you control get +2/+2 until end of turn. SVar:DBPumpAll:DB$ PumpAll | NumAtt$ 2 | NumDef$ 2 | ValidCards$ Creature.YouCtrl | SpellDescription$ Creatures you control get +2/+2 until end of turn.
SVar:DBAnimateAll:DB$ AnimateAll | ValidCards$ Creature.YouCtrl | Triggers$ TrigPrideDamage | sVars$ GainLife,GainLifeX | SpellDescription$ Until end of turn, creatures you control gain "Whenever this creature deals damage, you gain that much life." SVar:DBAnimateAll:DB$ AnimateAll | ValidCards$ Creature.YouCtrl | Triggers$ TrigPrideDamage | SpellDescription$ Until end of turn, creatures you control gain "Whenever this creature deals damage, you gain that much life."
SVar:TrigPrideDamage:Mode$ DamageDealtOnce | ValidSource$ Card.Self | Execute$ GainLife | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals damage, you gain that much life. SVar:TrigPrideDamage:Mode$ DamageDealtOnce | ValidSource$ Card.Self | Execute$ GainLife | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals damage, you gain that much life.
SVar:GainLife:DB$ GainLife | LifeAmount$ GainLifeX SVar:GainLife:DB$ GainLife | LifeAmount$ GainLifeX
SVar:GainLifeX:TriggerCount$DamageAmount SVar:GainLifeX:TriggerCount$DamageAmount

View File

@@ -2,7 +2,7 @@ Name:Storm the Citadel
ManaCost:4 G ManaCost:4 G
Types:Sorcery Types:Sorcery
A:SP$ PumpAll | Cost$ 4 G | ValidCards$ Creature.YouCtrl | NumAtt$ 2 | NumDef$ 2 | SubAbility$ DBAnimateAll | SpellDescription$ Until end of turn, creatures you control get +2/+2 and gain "Whenever this creature deals combat damage to a player or planeswalker, destroy target artifact or enchantment defending player controls." A:SP$ PumpAll | Cost$ 4 G | ValidCards$ Creature.YouCtrl | NumAtt$ 2 | NumDef$ 2 | SubAbility$ DBAnimateAll | SpellDescription$ Until end of turn, creatures you control get +2/+2 and gain "Whenever this creature deals combat damage to a player or planeswalker, destroy target artifact or enchantment defending player controls."
SVar:DBAnimateAll:DB$ AnimateAll | ValidCards$ Creature.YouCtrl | Triggers$ Trig | sVars$ Eff SVar:DBAnimateAll:DB$ AnimateAll | ValidCards$ Creature.YouCtrl | Triggers$ Trig
SVar:Trig:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player,Planeswalker | CombatDamage$ True | Execute$ Eff | TriggerDescription$ Whenever this creature deals combat damage to a player or planeswalker, destroy target artifact or enchantment defending player controls. SVar:Trig:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player,Planeswalker | CombatDamage$ True | Execute$ Eff | TriggerDescription$ Whenever this creature deals combat damage to a player or planeswalker, destroy target artifact or enchantment defending player controls.
SVar:Eff:DB$ Destroy | ValidTgts$ Artifact,Enchantment | TargetsWithDefinedController$ TriggeredDefendingPlayer | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select target artifact or enchantment defending player controls. SVar:Eff:DB$ Destroy | ValidTgts$ Artifact,Enchantment | TargetsWithDefinedController$ TriggeredDefendingPlayer | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select target artifact or enchantment defending player controls.
SVar:PlayMain1:TRUE SVar:PlayMain1:TRUE

View File

@@ -6,8 +6,7 @@ SVar:P1P1:DB$ PutCounter | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select targe
SVar:Lore:DB$ PutCounter | ValidTgts$ Saga.YouCtrl | TgtPrompt$ Select target Saga you control | CounterType$ LORE | CounterNum$ 2 | SubAbility$ DBEffect | SpellDescription$ Put two lore counters on target Saga you control. The next time one or more enchantment creatures enter the battlefield under your control this turn, each enters with two additional +1/+1 counters on it. SVar:Lore:DB$ PutCounter | ValidTgts$ Saga.YouCtrl | TgtPrompt$ Select target Saga you control | CounterType$ LORE | CounterNum$ 2 | SubAbility$ DBEffect | SpellDescription$ Put two lore counters on target Saga you control. The next time one or more enchantment creatures enter the battlefield under your control this turn, each enters with two additional +1/+1 counters on it.
SVar:DBEffect:DB$ Effect | ReplacementEffects$ ReplaceETB | Triggers$ TrigRemove SVar:DBEffect:DB$ Effect | ReplacementEffects$ ReplaceETB | Triggers$ TrigRemove
SVar:ReplaceETB:Event$ Moved | Destination$ Battlefield | ValidCard$ Creature.Enchantment | ReplaceWith$ DBPutP1P1 SVar:ReplaceETB:Event$ Moved | Destination$ Battlefield | ValidCard$ Creature.Enchantment | ReplaceWith$ DBPutP1P1
SVar:DBPutP1P1:DB$ PutCounter | Defined$ ReplacedCard | CounterType$ P1P1 | ETB$ True | CounterNum$ 2 | SubAbility$ MoveToBattlefield SVar:DBPutP1P1:DB$ PutCounter | Defined$ ReplacedCard | CounterType$ P1P1 | ETB$ True | CounterNum$ 2 | SubAbility$ DBImprint
SVar:MoveToBattlefield:DB$ InternalEtbReplacement | SubAbility$ DBImprint
SVar:DBImprint:DB$ Pump | ImprintCards$ ReplacedCard SVar:DBImprint:DB$ Pump | ImprintCards$ ReplacedCard
SVar:TrigRemove:Mode$ ChangesZoneAll | CheckSVar$ Z | Execute$ ExileSelf | Static$ True SVar:TrigRemove:Mode$ ChangesZoneAll | CheckSVar$ Z | Execute$ ExileSelf | Static$ True
SVar:ExileSelf:DB$ ChangeZone | Origin$ Command | Destination$ Exile | Defined$ Self SVar:ExileSelf:DB$ ChangeZone | Origin$ Command | Destination$ Exile | Defined$ Self

View File

@@ -4,9 +4,8 @@ Types:Creature Human Knight
PT:3/3 PT:3/3
K:Trample K:Trample
K:Haste K:Haste
R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | DayTime$ Neither | ReplaceWith$ DoDay | Description$ If it's neither day nor night, it becomes day as CARDNAME enters the battlefield. R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | DayTime$ Neither | ReplaceWith$ DoDay | ReplacementResult$ Updated | Description$ If it's neither day nor night, it becomes day as CARDNAME enters the battlefield.
SVar:DoDay:DB$ DayTime | Value$ Day | SubAbility$ ETB SVar:DoDay:DB$ DayTime | Value$ Day
SVar:ETB:DB$ InternalEtbReplacement
T:Mode$ DayTimeChanges | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever day becomes night or night becomes day, put a +1/+1 counter on target creature you control. T:Mode$ DayTimeChanges | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever day becomes night or night becomes day, put a +1/+1 counter on target creature you control.
SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1
DeckHas:Ability$Counters DeckHas:Ability$Counters

View File

@@ -3,9 +3,8 @@ ManaCost:2 R R
Types:Creature Phoenix Types:Creature Phoenix
PT:4/2 PT:4/2
K:Flying K:Flying
R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | DayTime$ Neither | ReplaceWith$ DoDay | Description$ If it's neither day nor night, it becomes day as CARDNAME enters the battlefield. R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | DayTime$ Neither | ReplaceWith$ DoDay | ReplacementResult$ Updated | Description$ If it's neither day nor night, it becomes day as CARDNAME enters the battlefield.
SVar:DoDay:DB$ DayTime | Value$ Day | SubAbility$ ETB SVar:DoDay:DB$ DayTime | Value$ Day
SVar:ETB:DB$ InternalEtbReplacement
T:Mode$ DayTimeChanges | Execute$ TrigReturn | TriggerZones$ Graveyard | TriggerDescription$ Whenever day becomes night or night becomes day, you may pay {1}{R}. If you do, return CARDNAME from your graveyard to the battlefield tapped. T:Mode$ DayTimeChanges | Execute$ TrigReturn | TriggerZones$ Graveyard | TriggerDescription$ Whenever day becomes night or night becomes day, you may pay {1}{R}. If you do, return CARDNAME from your graveyard to the battlefield tapped.
SVar:TrigReturn:AB$ ChangeZone | Cost$ 1 R | Origin$ Graveyard | Destination$ Battlefield | Tapped$ True SVar:TrigReturn:AB$ ChangeZone | Cost$ 1 R | Origin$ Graveyard | Destination$ Battlefield | Tapped$ True
DeckHas:Ability$Graveyard DeckHas:Ability$Graveyard

View File

@@ -2,7 +2,7 @@ Name:Supernatural Stamina
ManaCost:B ManaCost:B
Types:Instant Types:Instant
A:SP$ Pump | Cost$ B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | SpellDescription$ Until end of turn, target creature gets +2/+0 and gains "When this creature dies, return it to the battlefield tapped under its owner's control." | SubAbility$ DBAnimate A:SP$ Pump | Cost$ B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | SpellDescription$ Until end of turn, target creature gets +2/+0 and gains "When this creature dies, return it to the battlefield tapped under its owner's control." | SubAbility$ DBAnimate
SVar:DBAnimate:DB$ Animate | Triggers$ SupernaturalStaminaChangeZone | sVars$ SupernaturalStaminaTrigChangeZone | Defined$ ParentTarget SVar:DBAnimate:DB$ Animate | Triggers$ SupernaturalStaminaChangeZone | Defined$ ParentTarget
SVar:SupernaturalStaminaChangeZone:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ SupernaturalStaminaTrigChangeZone | TriggerController$ TriggeredCardController | TriggerDescription$ When this creature dies, return it to the battlefield tapped under its owner's control. SVar:SupernaturalStaminaChangeZone:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ SupernaturalStaminaTrigChangeZone | TriggerController$ TriggeredCardController | TriggerDescription$ When this creature dies, return it to the battlefield tapped under its owner's control.
SVar:SupernaturalStaminaTrigChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Tapped$ True | Defined$ TriggeredNewCardLKICopy SVar:SupernaturalStaminaTrigChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Tapped$ True | Defined$ TriggeredNewCardLKICopy
Oracle:Until end of turn, target creature gets +2/+0 and gains "When this creature dies, return it to the battlefield tapped under its owner's control." Oracle:Until end of turn, target creature gets +2/+0 and gains "When this creature dies, return it to the battlefield tapped under its owner's control."

View File

@@ -5,9 +5,8 @@ A:SP$ ChangeZone | ValidTgts$ Permanent.YouCtrl | TgtPrompt$ Select target perma
SVar:DBEffect:DB$ Effect | RememberObjects$ Remembered | Triggers$ ReturnEOT | ReplacementEffects$ EntersAsCreature | SubAbility$ DBCleanup | SpellDescription$ Return that card to the battlefield under its owner's control at the beginning of the next end step. If it enters the battlefield as a creature, it enters with an additional +1/+1 counter on it. SVar:DBEffect:DB$ Effect | RememberObjects$ Remembered | Triggers$ ReturnEOT | ReplacementEffects$ EntersAsCreature | SubAbility$ DBCleanup | SpellDescription$ Return that card to the battlefield under its owner's control at the beginning of the next end step. If it enters the battlefield as a creature, it enters with an additional +1/+1 counter on it.
SVar:ReturnEOT:Mode$ Phase | Phase$ End of Turn | Execute$ TrigReturn | TriggerDescription$ Return that card to the battlefield under its owner's control at the beginning of the next end step. If it enters the battlefield as a creature, it enters with an additional +1/+1 counter on it. SVar:ReturnEOT:Mode$ Phase | Phase$ End of Turn | Execute$ TrigReturn | TriggerDescription$ Return that card to the battlefield under its owner's control at the beginning of the next end step. If it enters the battlefield as a creature, it enters with an additional +1/+1 counter on it.
SVar:TrigReturn:DB$ ChangeZone | Origin$ Exile | Destination$ Battlefield | Defined$ RememberedLKI SVar:TrigReturn:DB$ ChangeZone | Origin$ Exile | Destination$ Battlefield | Defined$ RememberedLKI
SVar:EntersAsCreature:Event$ Moved | ValidCard$ Creature.IsRemembered | Destination$ Battlefield | ReplaceWith$ PutP1P1 | Secondary$ True SVar:EntersAsCreature:Event$ Moved | ValidCard$ Creature.IsRemembered | Destination$ Battlefield | ReplaceWith$ PutP1P1 | Secondary$ True | ReplacementResult$ Updated
SVar:PutP1P1:DB$ PutCounter | Defined$ ReplacedCard | CounterType$ P1P1 | ETB$ True | SubAbility$ ToBattlefield SVar:PutP1P1:DB$ PutCounter | Defined$ ReplacedCard | CounterType$ P1P1 | ETB$ True | SubAbility$ DBExile
SVar:ToBattlefield:DB$ InternalEtbReplacement | SubAbility$ DBExile
SVar:DBExile:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:DBExile:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
DeckHas:Ability$Counters DeckHas:Ability$Counters

View File

@@ -5,10 +5,10 @@ PT:1/2
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 1 life. When you cast your next creature spell, that creature enters the battlefield with an additional +1/+1 counter, trample counter, and vigilance counter on it. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 1 life. When you cast your next creature spell, that creature enters the battlefield with an additional +1/+1 counter, trample counter, and vigilance counter on it.
SVar:TrigGainLife:DB$ GainLife | LifeAmount$ 1 | SubAbility$ DBDelayedTrigger SVar:TrigGainLife:DB$ GainLife | LifeAmount$ 1 | SubAbility$ DBDelayedTrigger
SVar:DBDelayedTrigger:DB$ DelayedTrigger | Execute$ TrigAddAPI | Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ You | TriggerDescription$ When you cast your next creature spell, that creature enters the battlefield with an additional +1/+1 counter, trample counter, and vigilance counter on it. SVar:DBDelayedTrigger:DB$ DelayedTrigger | Execute$ TrigAddAPI | Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ You | TriggerDescription$ When you cast your next creature spell, that creature enters the battlefield with an additional +1/+1 counter, trample counter, and vigilance counter on it.
SVar:TrigAddAPI:DB$ Animate | Defined$ TriggeredCard | sVars$ AddExtraCounter,DBTrample,DBVigilance | SubAbility$ DBAddETBRep SVar:TrigAddAPI:DB$ Effect | RememberObjects$ TriggeredCard | ForgetOnMoved$ Stack | ReplacementEffects$ ReplaceEnter
SVar:DBAddETBRep:DB$ Animate | Defined$ TriggeredCard | Keywords$ ETBReplacement:Other:AddExtraCounter:Mandatory:Battlefield:Card.Self SVar:ReplaceEnter:Event$ Moved | ValidCard$ Card.IsRemembered | Destination$ Battlefield | ReplaceWith$ AddExtraCounter | Description$ That creature enters the battlefield with an additional +1/+1 counter, trample counter, and vigilance counter on it.
SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBTrample SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterTypes$ P1P1,Trample,Vigilance | CounterNum$ 1 | SubAbility$ ToBattlefield
SVar:DBTrample:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ Trample | CounterNum$ 1 | SubAbility$ DBVigilance SVar:ToBattlefield:DB$ InternalEtbReplacement | SubAbility$ DBExile
SVar:DBVigilance:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ Vigilance | CounterNum$ 1 SVar:DBExile:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile
DeckHas:Ability$LifeGain|Counters DeckHas:Ability$LifeGain|Counters
Oracle:When Tenacious Pup enters the battlefield, you gain 1 life. When you cast your next creature spell, that creature enters the battlefield with an additional +1/+1 counter, trample counter, and vigilance counter on it. Oracle:When Tenacious Pup enters the battlefield, you gain 1 life. When you cast your next creature spell, that creature enters the battlefield with an additional +1/+1 counter, trample counter, and vigilance counter on it.

View File

@@ -1,9 +1,8 @@
Name:The Celestus Name:The Celestus
ManaCost:3 ManaCost:3
Types:Legendary Artifact Types:Legendary Artifact
R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | DayTime$ Neither | ReplaceWith$ DoDay | Description$ If it's neither day nor night, it becomes day as CARDNAME enters the battlefield. R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | DayTime$ Neither | ReplaceWith$ DoDay | ReplacementResult$ Updated | Description$ If it's neither day nor night, it becomes day as CARDNAME enters the battlefield.
SVar:DoDay:DB$ DayTime | Value$ Day | SubAbility$ ETB SVar:DoDay:DB$ DayTime | Value$ Day
SVar:ETB:DB$ InternalEtbReplacement
A:AB$ Mana | Cost$ T | Produced$ Any | SpellDescription$ Add one mana of any color. A:AB$ Mana | Cost$ T | Produced$ Any | SpellDescription$ Add one mana of any color.
A:AB$ DayTime | Cost$ 3 T | Value$ Switch | SorcerySpeed$ True | SpellDescription$ If it's night, it becomes day. Otherwise, it becomes night. Activate only as a sorcery. A:AB$ DayTime | Cost$ 3 T | Value$ Switch | SorcerySpeed$ True | SpellDescription$ If it's night, it becomes day. Otherwise, it becomes night. Activate only as a sorcery.
T:Mode$ DayTimeChanges | Execute$ DBGainLife | TriggerZones$ Battlefield | TriggerDescription$ Whenever day becomes night or night becomes day, you gain 1 life. You may draw a card. If you do, discard a card. T:Mode$ DayTimeChanges | Execute$ DBGainLife | TriggerZones$ Battlefield | TriggerDescription$ Whenever day becomes night or night becomes day, you gain 1 life. You may draw a card. If you do, discard a card.

View File

@@ -2,7 +2,7 @@ Name:Tower Above
ManaCost:2/G 2/G 2/G ManaCost:2/G 2/G 2/G
Types:Sorcery Types:Sorcery
A:SP$ Pump | Cost$ 2G 2G 2G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ 4 | NumDef$ 4 | KW$ Trample & Wither | SubAbility$ DBAnimate | SpellDescription$ Until end of turn, target creature gets +4/+4 and gains trample, wither, and "When this creature attacks, target creature blocks it this turn if able." (It deals damage to creatures in the form of -1/-1 counters.) A:SP$ Pump | Cost$ 2G 2G 2G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ 4 | NumDef$ 4 | KW$ Trample & Wither | SubAbility$ DBAnimate | SpellDescription$ Until end of turn, target creature gets +4/+4 and gains trample, wither, and "When this creature attacks, target creature blocks it this turn if able." (It deals damage to creatures in the form of -1/-1 counters.)
SVar:DBAnimate:DB$ Animate | Defined$ Targeted | Triggers$ TrigAttack | sVars$ TowerAboveTrigBlock SVar:DBAnimate:DB$ Animate | Defined$ Targeted | Triggers$ TrigAttack
SVar:TrigAttack:Mode$ Attacks | ValidCard$ Creature.Self | Execute$ TowerAboveTrigBlock | TriggerDescription$ Whenever CARDNAME attacks, target creature blocks it this turn if able SVar:TrigAttack:Mode$ Attacks | ValidCard$ Creature.Self | Execute$ TowerAboveTrigBlock | TriggerDescription$ Whenever CARDNAME attacks, target creature blocks it this turn if able
SVar:TowerAboveTrigBlock:DB$ MustBlock | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Target creature blocks CARDNAME this turn if able. SVar:TowerAboveTrigBlock:DB$ MustBlock | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Target creature blocks CARDNAME this turn if able.
Oracle:({2/G} can be paid with any two mana or with {G}. This card's mana value is 6.)\nUntil end of turn, target creature gets +4/+4 and gains trample, wither, and "When this creature attacks, target creature blocks it this turn if able." (It deals damage to creatures in the form of -1/-1 counters.) Oracle:({2/G} can be paid with any two mana or with {G}. This card's mana value is 6.)\nUntil end of turn, target creature gets +4/+4 and gains trample, wither, and "When this creature attacks, target creature blocks it this turn if able." (It deals damage to creatures in the form of -1/-1 counters.)

View File

@@ -0,0 +1,10 @@
Name:Jan Jansen, Chaos Crafter
ManaCost:R W B
Types:Legendary Creature Gnome Artificer
PT:3/3
K:Haste
A:AB$ Token | Cost$ T Sac<1/Creature.Artifact/artifact creature> | TokenAmount$ 2 | TokenScript$ c_a_treasure_sac | SpellDescription$ Create two Treasure tokens.
A:AB$ Token | Cost$ T Sac<1/Artifact.nonCreature/noncreature artifact> | TokenAmount$ 2 | TokenScript$ c_1_1_a_construct | SpellDescription$ Create two 1/1 colorless Construct artifact creature tokens.
SVar:AIPreference:SacCost$Artifact.nonCreature+Token+powerLE1+toughnessEQ1
DeckHas:Ability$Token|Sacrifice & Type$Treasure
Oracle:Haste\n{T}, Sacrifice an artifact creature: Create two Treasure tokens.\n{T}, Sacrifice a noncreature artifact: Create two 1/1 colorless Construct artifact creature tokens.

Some files were not shown because too many files have changed in this diff Show More