Merge branch 'Card-Forge:master' into Stangg

This commit is contained in:
Simisays
2022-08-28 18:26:32 +02:00
committed by GitHub
154 changed files with 2073 additions and 71 deletions

View File

@@ -2,10 +2,12 @@ package forge.ai;
import static forge.ai.ComputerUtilCard.getBestCreatureAI; import static forge.ai.ComputerUtilCard.getBestCreatureAI;
import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import forge.card.MagicColor;
import forge.game.cost.*; import forge.game.cost.*;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
@@ -55,6 +57,14 @@ public class AiCostDecision extends CostDecisionMakerBase {
return PaymentDecision.number(c); return PaymentDecision.number(c);
} }
@Override
public PaymentDecision visit(CostChooseColor cost) {
int c = cost.getAbilityAmount(ability);
List<String> choices = player.getController().chooseColors("Color", ability, c, c,
new ArrayList<>(MagicColor.Constant.ONLY_COLORS));
return PaymentDecision.colors(choices);
}
@Override @Override
public PaymentDecision visit(CostChooseCreatureType cost) { public PaymentDecision visit(CostChooseCreatureType cost) {
String choice = player.getController().chooseSomeType("Creature", ability, CardType.getAllCreatureTypes(), String choice = player.getController().chooseSomeType("Creature", ability, CardType.getAllCreatureTypes(),

View File

@@ -1201,7 +1201,7 @@ public abstract class GameState {
String[] allCounterStrings = counterString.split(","); String[] allCounterStrings = counterString.split(",");
for (final String counterPair : allCounterStrings) { for (final String counterPair : allCounterStrings) {
String[] pair = counterPair.split("=", 2); String[] pair = counterPair.split("=", 2);
entity.addCounterInternal(CounterType.getType(pair[0]), Integer.parseInt(pair[1]), null, false, null); entity.addCounterInternal(CounterType.getType(pair[0]), Integer.parseInt(pair[1]), null, false, null, null);
} }
} }

View File

@@ -218,7 +218,7 @@ public class SpecialCardAi {
Card animated = AnimateAi.becomeAnimated(sa.getHostCard(), sa.getSubAbility()); Card animated = AnimateAi.becomeAnimated(sa.getHostCard(), sa.getSubAbility());
if (sa.getHostCard().canReceiveCounters(CounterEnumType.P1P1)) { if (sa.getHostCard().canReceiveCounters(CounterEnumType.P1P1)) {
animated.addCounterInternal(CounterEnumType.P1P1, 2, ai, false, null); animated.addCounterInternal(CounterEnumType.P1P1, 2, ai, false, null, null);
} }
boolean isOppEOT = ph.is(PhaseType.END_OF_TURN) && ph.getNextTurn() == ai; boolean isOppEOT = ph.is(PhaseType.END_OF_TURN) && ph.getNextTurn() == ai;
boolean isValuableAttacker = ph.is(PhaseType.MAIN1, ai) && ComputerUtilCard.doesSpecifiedCreatureAttackAI(ai, animated); boolean isValuableAttacker = ph.is(PhaseType.MAIN1, ai) && ComputerUtilCard.doesSpecifiedCreatureAttackAI(ai, animated);

View File

@@ -105,13 +105,11 @@ public class ManaEffectAi extends SpellAbilityAi {
} }
PhaseHandler ph = ai.getGame().getPhaseHandler(); PhaseHandler ph = ai.getGame().getPhaseHandler();
boolean moreManaNextTurn = false; boolean moreManaNextTurn = ph.is(PhaseType.END_OF_TURN) && (ph.getNextTurn() == ai || ComputerUtilCard.willUntap(ai, sa.getHostCard()))
if (ph.is(PhaseType.END_OF_TURN) && (ph.getNextTurn() == ai || ComputerUtilCard.willUntap(ai, sa.getHostCard())) && canRampPool(ai, sa.getHostCard())) { && canRampPool(ai, sa.getHostCard());
moreManaNextTurn = true;
}
return sa.getPayCosts().hasNoManaCost() && sa.getPayCosts().isReusuableResource() return sa.getPayCosts().hasNoManaCost() && sa.getPayCosts().isReusuableResource()
&& sa.getSubAbility() == null && (ComputerUtil.playImmediately(ai, sa) || moreManaNextTurn); && sa.getSubAbility() == null && (moreManaNextTurn || ComputerUtil.playImmediately(ai, sa));
} }
/** /**

View File

@@ -43,6 +43,11 @@ public final class CardRules implements ICardCharacteristics {
private CardSplitType splitType; private CardSplitType splitType;
private ICardFace mainPart; private ICardFace mainPart;
private ICardFace otherPart; private ICardFace otherPart;
private ICardFace wSpecialize;
private ICardFace uSpecialize;
private ICardFace bSpecialize;
private ICardFace rSpecialize;
private ICardFace gSpecialize;
private CardAiHints aiHints; private CardAiHints aiHints;
private ColorSet colorIdentity; private ColorSet colorIdentity;
private ColorSet deckbuildingColors; private ColorSet deckbuildingColors;
@@ -54,6 +59,12 @@ public final class CardRules implements ICardCharacteristics {
splitType = altMode; splitType = altMode;
mainPart = faces[0]; mainPart = faces[0];
otherPart = faces[1]; otherPart = faces[1];
wSpecialize = faces[2];
uSpecialize = faces[3];
bSpecialize = faces[4];
rSpecialize = faces[5];
gSpecialize = faces[6];
aiHints = cah; aiHints = cah;
meldWith = ""; meldWith = "";
partnerWith = ""; partnerWith = "";
@@ -74,6 +85,11 @@ public final class CardRules implements ICardCharacteristics {
splitType = newRules.splitType; splitType = newRules.splitType;
mainPart = newRules.mainPart; mainPart = newRules.mainPart;
otherPart = newRules.otherPart; otherPart = newRules.otherPart;
wSpecialize = newRules.wSpecialize;
uSpecialize = newRules.uSpecialize;
bSpecialize = newRules.bSpecialize;
rSpecialize = newRules.rSpecialize;
gSpecialize = newRules.gSpecialize;
aiHints = newRules.aiHints; aiHints = newRules.aiHints;
colorIdentity = newRules.colorIdentity; colorIdentity = newRules.colorIdentity;
meldWith = newRules.meldWith; meldWith = newRules.meldWith;
@@ -132,6 +148,22 @@ public final class CardRules implements ICardCharacteristics {
return otherPart; return otherPart;
} }
public ICardFace getWSpecialize() {
return wSpecialize;
}
public ICardFace getUSpecialize() {
return uSpecialize;
}
public ICardFace getBSpecialize() {
return bSpecialize;
}
public ICardFace getRSpecialize() {
return rSpecialize;
}
public ICardFace getGSpecialize() {
return gSpecialize;
}
public String getName() { public String getName() {
switch (splitType.getAggregationMethod()) { switch (splitType.getAggregationMethod()) {
case COMBINE: case COMBINE:
@@ -335,7 +367,7 @@ public final class CardRules implements ICardCharacteristics {
// Reads cardname.txt // Reads cardname.txt
public static class Reader { public static class Reader {
// fields to build // fields to build
private CardFace[] faces = new CardFace[] { null, null }; private CardFace[] faces = new CardFace[] { null, null, null, null, null, null, null };
private int curFace = 0; private int curFace = 0;
private CardSplitType altMode = CardSplitType.None; private CardSplitType altMode = CardSplitType.None;
private String meldWith = ""; private String meldWith = "";
@@ -382,6 +414,11 @@ public final class CardRules implements ICardCharacteristics {
CardAiHints cah = new CardAiHints(removedFromAIDecks, removedFromRandomDecks, removedFromNonCommanderDecks, hints, needs, has); CardAiHints cah = new CardAiHints(removedFromAIDecks, removedFromRandomDecks, removedFromNonCommanderDecks, hints, needs, has);
faces[0].assignMissingFields(); faces[0].assignMissingFields();
if (null != faces[1]) faces[1].assignMissingFields(); if (null != faces[1]) faces[1].assignMissingFields();
if (null != faces[2]) faces[2].assignMissingFields();
if (null != faces[3]) faces[3].assignMissingFields();
if (null != faces[4]) faces[4].assignMissingFields();
if (null != faces[5]) faces[5].assignMissingFields();
if (null != faces[6]) faces[6].assignMissingFields();
final CardRules result = new CardRules(faces, altMode, cah); final CardRules result = new CardRules(faces, altMode, cah);
result.setNormalizedName(this.normalizedName); result.setNormalizedName(this.normalizedName);
@@ -518,6 +555,18 @@ public final class CardRules implements ICardCharacteristics {
case 'S': case 'S':
if ("S".equals(key)) { if ("S".equals(key)) {
this.faces[this.curFace].addStaticAbility(value); this.faces[this.curFace].addStaticAbility(value);
} else if (key.startsWith("SPECIALIZE")) {
if (value.equals("WHITE")) {
this.curFace = 2;
} else if (value.equals("BLUE")) {
this.curFace = 3;
} else if (value.equals("BLACK")) {
this.curFace = 4;
} else if (value.equals("RED")) {
this.curFace = 5;
} else if (value.equals("GREEN")) {
this.curFace = 6;
}
} else if ("SVar".equals(key)) { } else if ("SVar".equals(key)) {
if (null == value) throw new IllegalArgumentException("SVar has no variable name"); if (null == value) throw new IllegalArgumentException("SVar has no variable name");
@@ -600,7 +649,7 @@ public final class CardRules implements ICardCharacteristics {
public static CardRules getUnsupportedCardNamed(String name) { public static CardRules getUnsupportedCardNamed(String name) {
CardAiHints cah = new CardAiHints(true, true, true, null, null, null); CardAiHints cah = new CardAiHints(true, true, true, null, null, null);
CardFace[] faces = { new CardFace(name), null}; CardFace[] faces = { new CardFace(name), null, null, null, null, null, null};
faces[0].setColor(ColorSet.fromMask(0)); faces[0].setColor(ColorSet.fromMask(0));
faces[0].setType(CardType.parse("", false)); faces[0].setType(CardType.parse("", false));
faces[0].setOracleText("This card is not supported by Forge. Whenever you start a game with this card, it will be bugged."); faces[0].setOracleText("This card is not supported by Forge. Whenever you start a game with this card, it will be bugged.");

View File

@@ -10,7 +10,8 @@ public enum CardSplitType
Split(FaceSelectionMethod.COMBINE, CardStateName.RightSplit), Split(FaceSelectionMethod.COMBINE, CardStateName.RightSplit),
Flip(FaceSelectionMethod.USE_PRIMARY_FACE, CardStateName.Flipped), Flip(FaceSelectionMethod.USE_PRIMARY_FACE, CardStateName.Flipped),
Adventure(FaceSelectionMethod.USE_PRIMARY_FACE, CardStateName.Adventure), Adventure(FaceSelectionMethod.USE_PRIMARY_FACE, CardStateName.Adventure),
Modal(FaceSelectionMethod.USE_ACTIVE_FACE, CardStateName.Modal); Modal(FaceSelectionMethod.USE_ACTIVE_FACE, CardStateName.Modal),
Specialize(FaceSelectionMethod.USE_ACTIVE_FACE, null);
CardSplitType(FaceSelectionMethod calcMode, CardStateName stateName) { CardSplitType(FaceSelectionMethod calcMode, CardStateName stateName) {
method = calcMode; method = calcMode;

View File

@@ -10,7 +10,12 @@ public enum CardStateName {
LeftSplit, LeftSplit,
RightSplit, RightSplit,
Adventure, Adventure,
Modal Modal,
SpecializeW,
SpecializeU,
SpecializeB,
SpecializeR,
SpecializeG
; ;

View File

@@ -80,6 +80,22 @@ public class ForgeScript {
return source.hasChosenColor() return source.hasChosenColor()
&& colors.hasAnyColor(ColorSet.fromNames(source.getChosenColors()).getColor()); && colors.hasAnyColor(ColorSet.fromNames(source.getChosenColors()).getColor());
} else if (property.equals("AssociatedWithChosenColor")) {
final String color = source.getChosenColor();
switch (color) {
case "white":
return cardState.getTypeWithChanges().getLandTypes().contains("Plains");
case "blue":
return cardState.getTypeWithChanges().getLandTypes().contains("Island");
case "black":
return cardState.getTypeWithChanges().getLandTypes().contains("Swamp");
case "red":
return cardState.getTypeWithChanges().getLandTypes().contains("Mountain");
case "green":
return cardState.getTypeWithChanges().getLandTypes().contains("Forest");
default:
return false;
}
} else if (property.startsWith("non")) { } else if (property.startsWith("non")) {
// ... Other Card types // ... Other Card types
return !cardState.getTypeWithChanges().hasStringType(property.substring(3)); return !cardState.getTypeWithChanges().hasStringType(property.substring(3));
@@ -207,6 +223,8 @@ public class ForgeScript {
return sa.hasParam("Nightbound"); return sa.hasParam("Nightbound");
} else if (property.equals("paidPhyrexianMana")) { } else if (property.equals("paidPhyrexianMana")) {
return sa.getSpendPhyrexianMana(); return sa.getSpendPhyrexianMana();
} else if (property.equals("LastChapter")) {
return sa.isLastChapter();
} else if (property.startsWith("ManaSpent")) { } else if (property.startsWith("ManaSpent")) {
String[] k = property.split(" ", 2); String[] k = property.split(" ", 2);
String comparator = k[1].substring(0, 2); String comparator = k[1].substring(0, 2);

View File

@@ -608,6 +608,10 @@ public class GameAction {
if (c.hasIntensity()) { if (c.hasIntensity()) {
copied.setIntensity(c.getIntensity(false)); copied.setIntensity(c.getIntensity(false));
} }
// specialize is perpetual
if (c.isSpecialized()) {
copied.setState(c.getCurrentStateName(), false);
}
// update state for view // update state for view
copied.updateStateForView(); copied.updateStateForView();
@@ -688,7 +692,7 @@ public class GameAction {
} }
if (fromBattlefield) { if (fromBattlefield) {
if (!c.isRealToken()) { if (!c.isRealToken() && !c.isSpecialized()) {
copied.setState(CardStateName.Original, true); copied.setState(CardStateName.Original, true);
} }
// Soulbond unpairing // Soulbond unpairing
@@ -2415,7 +2419,7 @@ public class GameAction {
} }
// for Zangief do this before runWaitingTriggers DamageDone // for Zangief do this before runWaitingTriggers DamageDone
damageMap.triggerExcessDamage(isCombat, lethalDamage, game); damageMap.triggerExcessDamage(isCombat, lethalDamage, game, lkiCache);
// lose life simultaneously // lose life simultaneously
if (isCombat) { if (isCombat) {

View File

@@ -26,6 +26,7 @@ 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 com.google.common.collect.Maps;
import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils; import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType; import forge.game.ability.ApiType;
import forge.game.card.Card; import forge.game.card.Card;
@@ -330,9 +331,9 @@ public abstract class GameEntity extends GameObject implements IIdentifiable {
subtractCounter(CounterType.get(counterName), n); subtractCounter(CounterType.get(counterName), n);
} }
abstract public void addCounterInternal(final CounterType counterType, final int n, final Player source, final boolean fireEvents, GameEntityCounterTable table); abstract public void addCounterInternal(final CounterType counterType, final int n, final Player source, final boolean fireEvents, GameEntityCounterTable table, Map<AbilityKey, Object> params);
public void addCounterInternal(final CounterEnumType counterType, final int n, final Player source, final boolean fireEvents, GameEntityCounterTable table) { public void addCounterInternal(final CounterEnumType counterType, final int n, final Player source, final boolean fireEvents, GameEntityCounterTable table, Map<AbilityKey, Object> params) {
addCounterInternal(CounterType.get(counterType), n, source, fireEvents, table); addCounterInternal(CounterType.get(counterType), n, source, fireEvents, table, params);
} }
public void receiveDamage(Pair<Integer, Boolean> dmg) { public void receiveDamage(Pair<Integer, Boolean> dmg) {

View File

@@ -155,11 +155,18 @@ public class GameEntityCounterTable extends ForwardingTable<Optional<Player>, Ga
continue; continue;
} }
// Add ETB flag
final Map<AbilityKey, Object> runParams = AbilityKey.newMap();
runParams.put(AbilityKey.ETB, etb);
if (params != null) {
runParams.putAll(params);
}
// Apply counter after replacement effect // Apply counter after replacement effect
for (Map.Entry<Optional<Player>, Map<CounterType, Integer>> e : values.entrySet()) { for (Map.Entry<Optional<Player>, Map<CounterType, Integer>> e : values.entrySet()) {
boolean remember = cause != null && cause.hasParam("RememberPut"); boolean remember = cause != null && cause.hasParam("RememberPut");
for (Map.Entry<CounterType, Integer> ec : e.getValue().entrySet()) { for (Map.Entry<CounterType, Integer> ec : e.getValue().entrySet()) {
gm.getKey().addCounterInternal(ec.getKey(), ec.getValue(), e.getKey().orNull(), true, result); gm.getKey().addCounterInternal(ec.getKey(), ec.getValue(), e.getKey().orNull(), true, result, runParams);
if (remember && ec.getValue() >= 1) { if (remember && ec.getValue() >= 1) {
cause.getHostCard().addRemembered(gm.getKey()); cause.getHostCard().addRemembered(gm.getKey());
} }

View File

@@ -2737,10 +2737,10 @@ public class AbilityUtils {
SpellAbility sa = (SpellAbility) ctb; SpellAbility sa = (SpellAbility) ctb;
if (sa.isReplacementAbility()) { if (sa.isReplacementAbility()) {
if (zones.get(0).equals(ZoneType.Battlefield)) { if (zones.get(0).equals(ZoneType.Battlefield)) {
cardsInZones = sa.getLastStateBattlefield(); cardsInZones = sa.getRootAbility().getLastStateBattlefield();
usedLastState = true; usedLastState = true;
} else if (zones.get(0).equals(ZoneType.Graveyard)) { } else if (zones.get(0).equals(ZoneType.Graveyard)) {
cardsInZones = sa.getLastStateGraveyard(); cardsInZones = sa.getRootAbility().getLastStateGraveyard();
usedLastState = true; usedLastState = true;
} }
} }

View File

@@ -450,11 +450,12 @@ public class CountersPutEffect extends SpellAbilityEffect {
0); 0);
} }
if (sa.hasParam("UpTo")) { if (sa.hasParam("UpTo")) {
int min = AbilityUtils.calculateAmount(card, sa.getParamOrDefault("UpToMin", "0"), sa);
Map<String, Object> params = Maps.newHashMap(); Map<String, Object> params = Maps.newHashMap();
params.put("Target", obj); params.put("Target", obj);
params.put("CounterType", counterType); params.put("CounterType", counterType);
counterAmount = pc.chooseNumber(sa, counterAmount = pc.chooseNumber(sa,
Localizer.getInstance().getMessage("lblHowManyCounters"), 0, counterAmount, params); Localizer.getInstance().getMessage("lblHowManyCounters"), min, counterAmount, params);
} }
if (sa.isDividedAsYouChoose() && !sa.usesTargeting()) { if (sa.isDividedAsYouChoose() && !sa.usesTargeting()) {
Map<String, Object> params = Maps.newHashMap(); Map<String, Object> params = Maps.newHashMap();
@@ -479,6 +480,10 @@ public class CountersPutEffect extends SpellAbilityEffect {
} }
} }
if (sa.hasParam("ReadAhead")) {
gameCard.setReadAhead(counterAmount);
}
if (sa.hasParam("Tribute")) { if (sa.hasParam("Tribute")) {
// make a copy to check if it would be on the battlefield // make a copy to check if it would be on the battlefield
Card noTributeLKI = CardUtil.getLKICopy(gameCard); Card noTributeLKI = CardUtil.getLKICopy(gameCard);

View File

@@ -226,6 +226,8 @@ public class EffectEffect extends SpellAbilityEffect {
if (!"Stack".equals(sa.getParam("ForgetOnMoved"))) { if (!"Stack".equals(sa.getParam("ForgetOnMoved"))) {
addForgetOnCastTrigger(eff); addForgetOnCastTrigger(eff);
} }
} else if (sa.hasParam("ForgetOnCast")) {
addForgetOnCastTrigger(eff);
} else if (sa.hasParam("ExileOnMoved")) { } else if (sa.hasParam("ExileOnMoved")) {
addExileOnMovedTrigger(eff, sa.getParam("ExileOnMoved")); addExileOnMovedTrigger(eff, sa.getParam("ExileOnMoved"));
} }

View File

@@ -4,12 +4,15 @@ import forge.card.CardStateName;
import forge.game.Game; import forge.game.Game;
import forge.game.GameEntityCounterTable; import forge.game.GameEntityCounterTable;
import forge.game.GameLogEntryType; import forge.game.GameLogEntryType;
import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils; import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect; import forge.game.ability.SpellAbilityEffect;
import forge.game.card.*; import forge.game.card.*;
import forge.game.event.GameEventCardStatsChanged; import forge.game.event.GameEventCardStatsChanged;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.player.PlayerActionConfirmMode; import forge.game.player.PlayerActionConfirmMode;
import forge.game.trigger.TriggerHandler;
import forge.game.trigger.TriggerType;
import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.util.Lang; import forge.util.Lang;
@@ -17,19 +20,28 @@ import forge.util.Localizer;
import forge.util.TextUtil; import forge.util.TextUtil;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import java.util.Map;
public class SetStateEffect extends SpellAbilityEffect { public class SetStateEffect extends SpellAbilityEffect {
@Override @Override
protected String getStackDescription(final SpellAbility sa) { protected String getStackDescription(final SpellAbility sa) {
final Card host = sa.getHostCard();
final StringBuilder sb = new StringBuilder(); final StringBuilder sb = new StringBuilder();
boolean specialize = sa.getParam("Mode").equals("Specialize");
if (sa.hasParam("Flip")) { if (sa.hasParam("Flip")) {
sb.append("Flip "); sb.append("Flip ");
} else if (specialize) { // verb will come later
} else { } else {
sb.append("Transform "); sb.append("Transform ");
} }
sb.append(Lang.joinHomogenous(getTargetCards(sa))); sb.append(Lang.joinHomogenous(getTargetCards(sa)));
if (specialize) {
sb.append(" perpetually specializes into ");
sb.append(host.hasChosenColor() ? host.getChosenColor() : "the chosen color");
}
sb.append("."); sb.append(".");
return sb.toString(); return sb.toString();
} }
@@ -87,7 +99,9 @@ public class SetStateEffect extends SpellAbilityEffect {
// Cards which are not on the battlefield should not be able to transform. // Cards which are not on the battlefield should not be able to transform.
// TurnFace should be allowed in other zones like Exile too // TurnFace should be allowed in other zones like Exile too
if (!"TurnFace".equals(mode) && !gameCard.isInPlay() && !sa.hasParam("ETB")) { // Specialize and Unspecialize are allowed in other zones
if (!"TurnFace".equals(mode) && !"Unspecialize".equals(mode) && !"Specialize".equals(mode)
&& !gameCard.isInPlay() && !sa.hasParam("ETB")) {
continue; continue;
} }
@@ -160,6 +174,9 @@ public class SetStateEffect extends SpellAbilityEffect {
hasTransformed = gameCard.turnFaceUp(sa); hasTransformed = gameCard.turnFaceUp(sa);
} else if (sa.isManifestUp()) { } else if (sa.isManifestUp()) {
hasTransformed = gameCard.turnFaceUp(true, true, sa); hasTransformed = gameCard.turnFaceUp(true, true, sa);
} else if ("Specialize".equals(mode)) {
hasTransformed = gameCard.changeCardState(mode, host.getChosenColor(), sa);
host.setChosenColors(null);
} else { } else {
hasTransformed = gameCard.changeCardState(mode, sa.getParam("NewState"), sa); hasTransformed = gameCard.changeCardState(mode, sa.getParam("NewState"), sa);
if (gameCard.isFaceDown() && (sa.hasParam("FaceDownPower") || sa.hasParam("FaceDownToughness") if (gameCard.isFaceDown() && (sa.hasParam("FaceDownPower") || sa.hasParam("FaceDownToughness")
@@ -193,6 +210,17 @@ public class SetStateEffect extends SpellAbilityEffect {
} }
if (!gameCard.isDoubleFaced()) if (!gameCard.isDoubleFaced())
transformedCards.add(gameCard); transformedCards.add(gameCard);
if ("Specialize".equals(mode)) {
gameCard.setSpecialized(true);
//run Specializes trigger
final TriggerHandler th = game.getTriggerHandler();
th.clearActiveTriggers(gameCard, null);
th.registerActiveTrigger(gameCard, false);
final Map<AbilityKey, Object> runParams = AbilityKey.mapFromCard(gameCard);
th.runTrigger(TriggerType.Specializes, runParams, false);
} else if ("Unspecialize".equals(mode)) {
gameCard.setSpecialized(false);
}
} }
} }
table.replaceCounterEffect(game, sa, true); table.replaceCounterEffect(game, sa, true);

View File

@@ -212,6 +212,8 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
private boolean foretoldThisTurn; private boolean foretoldThisTurn;
private boolean foretoldByEffect; private boolean foretoldByEffect;
private boolean specialized;
private int timesCrewedThisTurn = 0; private int timesCrewedThisTurn = 0;
private int classLevel = 1; private int classLevel = 1;
@@ -336,6 +338,8 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
private ReplacementEffect shieldCounterReplaceDestroy = null; private ReplacementEffect shieldCounterReplaceDestroy = null;
private ReplacementEffect stunCounterReplaceUntap = null; private ReplacementEffect stunCounterReplaceUntap = null;
private Integer readAhead = null;
// Enumeration for CMC request types // Enumeration for CMC request types
public enum SplitCMCMode { public enum SplitCMCMode {
CurrentSideCMC, CurrentSideCMC,
@@ -661,6 +665,20 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
} }
} else if (mode.equals("Meld") && isMeldable()) { } else if (mode.equals("Meld") && isMeldable()) {
return changeToState(CardStateName.Meld); return changeToState(CardStateName.Meld);
} else if (mode.equals("Specialize") && canSpecialize()) {
if (customState.equalsIgnoreCase("white")) {
return changeToState(CardStateName.SpecializeW);
} else if (customState.equalsIgnoreCase("blue")) {
return changeToState(CardStateName.SpecializeU);
} else if (customState.equalsIgnoreCase("black")) {
return changeToState(CardStateName.SpecializeB);
} else if (customState.equalsIgnoreCase("red")) {
return changeToState(CardStateName.SpecializeR);
} else if (customState.equalsIgnoreCase("green")) {
return changeToState(CardStateName.SpecializeG);
}
} else if (mode.equals("Unspecialize") && isSpecialized()) {
return changeToState(CardStateName.Original);
} }
return false; return false;
} }
@@ -1389,7 +1407,7 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
} }
@Override @Override
public void addCounterInternal(final CounterType counterType, final int n, final Player source, final boolean fireEvents, GameEntityCounterTable table) { public void addCounterInternal(final CounterType counterType, final int n, final Player source, final boolean fireEvents, GameEntityCounterTable table, Map<AbilityKey, Object> params) {
int addAmount = n; int addAmount = n;
if (addAmount <= 0 || !canReceiveCounters(counterType)) { if (addAmount <= 0 || !canReceiveCounters(counterType)) {
// As per rule 107.1b // As per rule 107.1b
@@ -1423,6 +1441,9 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
final Map<AbilityKey, Object> runParams = AbilityKey.mapFromCard(this); final Map<AbilityKey, Object> runParams = AbilityKey.mapFromCard(this);
runParams.put(AbilityKey.Source, source); runParams.put(AbilityKey.Source, source);
runParams.put(AbilityKey.CounterType, counterType); runParams.put(AbilityKey.CounterType, counterType);
if (params != null) {
runParams.putAll(params);
}
for (int i = 0; i < addAmount; i++) { for (int i = 0; i < addAmount; i++) {
runParams.put(AbilityKey.CounterAmount, oldValue + i + 1); runParams.put(AbilityKey.CounterAmount, oldValue + i + 1);
getGame().getTriggerHandler().runTrigger( getGame().getTriggerHandler().runTrigger(
@@ -2217,11 +2238,12 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
|| keyword.startsWith("Embalm") || keyword.startsWith("Level up") || keyword.equals("Prowess") || keyword.startsWith("Embalm") || keyword.startsWith("Level up") || keyword.equals("Prowess")
|| keyword.startsWith("Eternalize") || keyword.startsWith("Reinforce") || keyword.startsWith("Eternalize") || keyword.startsWith("Reinforce")
|| keyword.startsWith("Champion") || keyword.startsWith("Prowl") || keyword.startsWith("Adapt") || keyword.startsWith("Champion") || keyword.startsWith("Prowl") || keyword.startsWith("Adapt")
|| keyword.startsWith("Amplify") || keyword.startsWith("Ninjutsu") || keyword.startsWith("Saga") || keyword.startsWith("Amplify") || keyword.startsWith("Ninjutsu") || keyword.startsWith("Saga") || keyword.startsWith("Read ahead")
|| keyword.startsWith("Transfigure") || keyword.startsWith("Aura swap") || keyword.startsWith("Transfigure") || keyword.startsWith("Aura swap")
|| keyword.startsWith("Cycling") || keyword.startsWith("TypeCycling") || keyword.startsWith("Cycling") || keyword.startsWith("TypeCycling")
|| keyword.startsWith("Encore") || keyword.startsWith("Mutate") || keyword.startsWith("Dungeon") || keyword.startsWith("Encore") || keyword.startsWith("Mutate") || keyword.startsWith("Dungeon")
|| keyword.startsWith("Class") || keyword.startsWith("Blitz")) { || keyword.startsWith("Class") || keyword.startsWith("Blitz")
|| keyword.startsWith("Specialize")) {
// keyword parsing takes care of adding a proper description // keyword parsing takes care of adding a proper description
} else if (keyword.equals("Unblockable")) { } else if (keyword.equals("Unblockable")) {
sbLong.append(getName()).append(" can't be blocked.\r\n"); sbLong.append(getName()).append(" can't be blocked.\r\n");
@@ -3980,6 +4002,8 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
public final CardStateName getFaceupCardStateName() { public final CardStateName getFaceupCardStateName() {
if (isFlipped() && hasState(CardStateName.Flipped)) { if (isFlipped() && hasState(CardStateName.Flipped)) {
return CardStateName.Flipped; return CardStateName.Flipped;
} else if (isSpecialized()) {
return getCurrentStateName();
} else if (backside && hasBackSide()) { } else if (backside && hasBackSide()) {
CardStateName stateName = getRules().getSplitType().getChangedStateName(); CardStateName stateName = getRules().getSplitType().getChangedStateName();
if (hasState(stateName)) { if (hasState(stateName)) {
@@ -4501,7 +4525,7 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
} }
return result; return result;
} }
public final void addKeywordForStaticAbility(KeywordInterface kw) { public final void addKeywordForStaticAbility(KeywordInterface kw) {
if (kw.getStaticId() > 0) { if (kw.getStaticId() > 0) {
storedKeywords.put(kw.getStaticId(), kw.getOriginal(), kw); storedKeywords.put(kw.getStaticId(), kw.getOriginal(), kw);
@@ -5730,6 +5754,16 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
foretoldThisTurn = false; foretoldThisTurn = false;
} }
public boolean isSpecialized() {
return specialized;
}
public final void setSpecialized(final boolean bool) {
specialized = bool;
}
public final boolean canSpecialize() {
return getRules() != null && getRules().getSplitType() == CardSplitType.Specialize;
}
public int getTimesCrewedThisTurn() { public int getTimesCrewedThisTurn() {
return timesCrewedThisTurn; return timesCrewedThisTurn;
} }
@@ -7103,4 +7137,11 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
} }
return StaticAbilityIgnoreLegendRule.ignoreLegendRule(this); return StaticAbilityIgnoreLegendRule.ignoreLegendRule(this);
} }
public Integer getReadAhead() {
return readAhead;
}
public void setReadAhead(int value) {
readAhead = value;
}
} }

View File

@@ -104,7 +104,7 @@ public class CardDamageMap extends ForwardingTable<Card, GameEntity, Integer> {
game.getTriggerHandler().runTrigger(TriggerType.DamageAll, runParams, false); game.getTriggerHandler().runTrigger(TriggerType.DamageAll, runParams, false);
} }
public void triggerExcessDamage(boolean isCombat, Map<Card, Integer> lethalDamage, final Game game) { public void triggerExcessDamage(boolean isCombat, Map<Card, Integer> lethalDamage, final Game game, final Map<Integer, Card> lkiCache) {
for (Entry<Card, Integer> damaged : lethalDamage.entrySet()) { for (Entry<Card, Integer> damaged : lethalDamage.entrySet()) {
int sum = 0; int sum = 0;
for (Integer i : this.column(damaged.getKey()).values()) { for (Integer i : this.column(damaged.getKey()).values()) {
@@ -112,6 +112,10 @@ public class CardDamageMap extends ForwardingTable<Card, GameEntity, Integer> {
} }
int excess = sum - (damaged.getKey().hasBeenDealtDeathtouchDamage() ? 1 : damaged.getValue()); int excess = sum - (damaged.getKey().hasBeenDealtDeathtouchDamage() ? 1 : damaged.getValue());
// also update the DamageHistory, but overwrite previous excess outcomes
// because Rith, Liberated Primeval cares about who controlled it at this moment
lkiCache.get(damaged.getKey().getId()).setHasBeenDealtExcessDamageThisTurn(excess > 0);
if (excess > 0) { if (excess > 0) {
damaged.getKey().setHasBeenDealtExcessDamageThisTurn(true); damaged.getKey().setHasBeenDealtExcessDamageThisTurn(true);
// Run triggers // Run triggers

View File

@@ -97,6 +97,7 @@ public class CardFactory {
out.setAttachedCards(in.getAttachedCards()); out.setAttachedCards(in.getAttachedCards());
out.setEntityAttachedTo(in.getEntityAttachedTo()); out.setEntityAttachedTo(in.getEntityAttachedTo());
out.setSpecialized(in.isSpecialized());
out.addRemembered(in.getRemembered()); out.addRemembered(in.getRemembered());
out.addImprintedCards(in.getImprintedCards()); out.addImprintedCards(in.getImprintedCards());
out.setCommander(in.isRealCommander()); out.setCommander(in.isRealCommander());
@@ -364,7 +365,33 @@ public class CardFactory {
readCardFace(card, rules.getMainPart()); readCardFace(card, rules.getMainPart());
if (st != CardSplitType.None) { if (st == CardSplitType.Specialize) {
card.addAlternateState(CardStateName.SpecializeW, false);
card.setState(CardStateName.SpecializeW, false);
if (rules.getWSpecialize() != null) {
readCardFace(card, rules.getWSpecialize());
}
card.addAlternateState(CardStateName.SpecializeU, false);
card.setState(CardStateName.SpecializeU, false);
if (rules.getUSpecialize() != null) {
readCardFace(card, rules.getUSpecialize());
}
card.addAlternateState(CardStateName.SpecializeB, false);
card.setState(CardStateName.SpecializeB, false);
if (rules.getBSpecialize() != null) {
readCardFace(card, rules.getBSpecialize());
}
card.addAlternateState(CardStateName.SpecializeR, false);
card.setState(CardStateName.SpecializeR, false);
if (rules.getRSpecialize() != null) {
readCardFace(card, rules.getRSpecialize());
}
card.addAlternateState(CardStateName.SpecializeG, false);
card.setState(CardStateName.SpecializeG, false);
if (rules.getGSpecialize() != null) {
readCardFace(card, rules.getGSpecialize());
}
} else if (st != CardSplitType.None) {
card.addAlternateState(st.getChangedStateName(), false); card.addAlternateState(st.getChangedStateName(), false);
card.setState(st.getChangedStateName(), false); card.setState(st.getChangedStateName(), false);
if (rules.getOtherPart() != null) { if (rules.getOtherPart() != null) {

View File

@@ -1697,7 +1697,7 @@ public class CardFactoryUtil {
parsedTrigger.setOverridingAbility(sa); parsedTrigger.setOverridingAbility(sa);
inst.addTrigger(parsedTrigger); inst.addTrigger(parsedTrigger);
} else if (keyword.startsWith("Saga")) { } else if (keyword.startsWith("Saga") || keyword.startsWith("Read ahead")) {
final String[] k = keyword.split(":"); final String[] k = keyword.split(":");
final List<String> abs = Arrays.asList(k[2].split(",")); final List<String> abs = Arrays.asList(k[2].split(","));
if (abs.size() != Integer.valueOf(k[1])) { if (abs.size() != Integer.valueOf(k[1])) {
@@ -1724,9 +1724,10 @@ public class CardFactoryUtil {
for (int i = idx; i <= skipId; i++) { for (int i = idx; i <= skipId; i++) {
SpellAbility sa = AbilityFactory.getAbility(card, ab); SpellAbility sa = AbilityFactory.getAbility(card, ab);
sa.setChapter(i); sa.setChapter(i);
sa.setLastChapter(idx == abs.size());
StringBuilder trigStr = new StringBuilder("Mode$ CounterAdded | ValidCard$ Card.Self | TriggerZones$ Battlefield"); StringBuilder trigStr = new StringBuilder("Mode$ CounterAdded | ValidCard$ Card.Self | TriggerZones$ Battlefield");
trigStr.append("| CounterType$ LORE | CounterAmount$ EQ").append(i); trigStr.append("| Chapter$ True | CounterType$ LORE | CounterAmount$ EQ").append(i);
if (i != idx) { if (i != idx) {
trigStr.append(" | Secondary$ True"); trigStr.append(" | Secondary$ True");
} }
@@ -2311,6 +2312,23 @@ public class CardFactoryUtil {
re.getOverridingAbility().setSVar("Sunburst", "Count$Converge"); re.getOverridingAbility().setSVar("Sunburst", "Count$Converge");
} }
inst.addReplacement(re); inst.addReplacement(re);
} else if (keyword.startsWith("Read ahead")) {
final String[] k = keyword.split(":");
String repeffstr = "Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | Secondary$ True | ReplacementResult$ Updated | Description$ Choose a chapter and start with that many lore counters.";
String effStr = "DB$ PutCounter | Defined$ Self | CounterType$ LORE | ETB$ True | UpTo$ True | UpToMin$ 1 | ReadAhead$ True | CounterNum$ " + k[1];
SpellAbility saCounter = AbilityFactory.getAbility(effStr, card);
if (!intrinsic) {
saCounter.setIntrinsic(false);
}
ReplacementEffect re = ReplacementHandler.parseReplacement(repeffstr, host, intrinsic, card);
re.setOverridingAbility(saCounter);
inst.addReplacement(re);
} else if (keyword.equals("Rebound")) { } else if (keyword.equals("Rebound")) {
String repeffstr = "Event$ Moved | ValidLKI$ Card.Self+wasCastFromHand+YouOwn+YouCtrl " String repeffstr = "Event$ Moved | ValidLKI$ Card.Self+wasCastFromHand+YouOwn+YouCtrl "
+ " | Origin$ Stack | Destination$ Graveyard | Fizzle$ False " + " | Origin$ Stack | Destination$ Graveyard | Fizzle$ False "
@@ -3215,6 +3233,22 @@ public class CardFactoryUtil {
final AbilitySub cleanSub = (AbilitySub) AbilityFactory.getAbility(cleanStr, card); final AbilitySub cleanSub = (AbilitySub) AbilityFactory.getAbility(cleanStr, card);
effectSub.setSubAbility(cleanSub); effectSub.setSubAbility(cleanSub);
sa.setIntrinsic(intrinsic);
inst.addSpellAbility(sa);
} else if (keyword.startsWith("Specialize")) {
final String[] k = keyword.split(":");
final String cost = k[1];
String flavor = k.length > 2 && !k[2].isEmpty() ? k[2] + " " : "";
String condition = k.length > 3 && !k[3].isEmpty() ? ". " + k[3] : "";
String extra = k.length > 4 && !k[4].isEmpty() ? k[4] + " | " : "";
final String effect = "AB$ SetState | Cost$ " + cost + " ChooseColor<1> Discard<1/Card.ChosenColor;" +
"Card.AssociatedWithChosenColor/card of the chosen color or its associated basic land type> | " +
"Mode$ Specialize | SorcerySpeed$ True | " + extra + "PrecostDesc$ " + flavor + "Specialize | " +
"CostDesc$ " + ManaCostParser.parse(cost) + condition + " | SpellDescription$ (" +
inst.getReminderText() + ")";
final SpellAbility sa = AbilityFactory.getAbility(effect, card);
sa.setIntrinsic(intrinsic); sa.setIntrinsic(intrinsic);
inst.addSpellAbility(sa); inst.addSpellAbility(sa);
} else if (keyword.startsWith("Spectacle")) { } else if (keyword.startsWith("Spectacle")) {

View File

@@ -267,6 +267,8 @@ public enum CounterEnumType {
PHYLACTERY("PHYLA", 117, 219, 153), PHYLACTERY("PHYLA", 117, 219, 153),
PHYRESIS("PHYRE", 125, 97, 128),
POINT("POINT", 153, 255, 130), POINT("POINT", 153, 255, 130),
POLYP("POLYP", 236, 185, 198), POLYP("POLYP", 236, 185, 198),

View File

@@ -341,6 +341,13 @@ public class Cost implements Serializable {
return new CostUnattach(splitStr[0], description); return new CostUnattach(splitStr[0], description);
} }
if (parse.startsWith("ChooseColor<")) {
// ChooseColor<NumToChoose>
//TODO expand this to set off different UI for Specialize
final String[] splitStr = abCostParse(parse, 1);
return new CostChooseColor(splitStr[0]);
}
if (parse.startsWith("ChooseCreatureType<")) { if (parse.startsWith("ChooseCreatureType<")) {
final String[] splitStr = abCostParse(parse, 1); final String[] splitStr = abCostParse(parse, 1);
return new CostChooseCreatureType(splitStr[0]); return new CostChooseCreatureType(splitStr[0]);

View File

@@ -0,0 +1,97 @@
/*
* Forge: Play Magic: the Gathering.
* Copyright (C) 2011 Forge Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge.game.cost;
import forge.game.card.Card;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
/**
* the class CostChooseColor
*/
public class CostChooseColor extends CostPart {
/**
* Serializables need a version ID.
*/
private static final long serialVersionUID = 1L;
/**
* Instantiates a new cost choose color.
*
* @param amount
* the amount
*/
public CostChooseColor(final String amount) {
this.setAmount(amount);
}
/*
* (non-Javadoc)
*
* @see
* forge.card.cost.CostPart#canPay(forge.card.spellability.SpellAbility,
* forge.Card, forge.Player, forge.card.cost.Cost)
*/
@Override
public final boolean canPay(final SpellAbility ability, final Player payer, final boolean effect) {
return true;
}
@Override
public boolean payAsDecided(Player payer, PaymentDecision pd, SpellAbility sa, final boolean effect) {
sa.getHostCard().setChosenColors(pd.colors);
return true;
}
@Override
public int paymentOrder() { return 8; }
/*
* (non-Javadoc)
*
* @see forge.card.cost.CostPart#toString()
*/
@Override
public final String toString() {
final StringBuilder sb = new StringBuilder();
final Integer i = this.convertAmount();
sb.append("Choose ");
sb.append(Cost.convertAmountTypeToWords(i, this.getAmount(), "color"));
return sb.toString();
}
@Override
public boolean isUndoable() { return true; }
/*
* (non-Javadoc)
*
* @see forge.card.cost.CostPart#refund(forge.Card)
*/
@Override
public final void refund(final Card source) {
source.setChosenColors(null);
}
@Override
public <T> T accept(ICostVisitor<T> visitor) {
return visitor.visit(this);
}
}

View File

@@ -166,7 +166,9 @@ public class CostDiscard extends CostPartWithList {
sameName = true; sameName = true;
type = TextUtil.fastReplace(type, "+WithSameName", ""); type = TextUtil.fastReplace(type, "+WithSameName", "");
} }
if (!type.equals("Random") && !type.contains("X")) { if (type.contains("ChosenColor") && !source.hasChosenColor()) {
//color hasn't been chosen yet, so skip getValidCards
} else if (!type.equals("Random") && !type.contains("X")) {
// Knollspine Invocation fails to activate without the above conditional // Knollspine Invocation fails to activate without the above conditional
handList = CardLists.getValidCards(handList, type.split(";"), payer, source, ability); handList = CardLists.getValidCards(handList, type.split(";"), payer, source, ability);
} }

View File

@@ -3,6 +3,7 @@ package forge.game.cost;
public interface ICostVisitor<T> { public interface ICostVisitor<T> {
T visit(CostGainControl cost); T visit(CostGainControl cost);
T visit(CostChooseColor cost);
T visit(CostChooseCreatureType cost); T visit(CostChooseCreatureType cost);
T visit(CostDiscard cost); T visit(CostDiscard cost);
T visit(CostDamage cost); T visit(CostDamage cost);
@@ -40,6 +41,11 @@ public interface ICostVisitor<T> {
return null; return null;
} }
@Override
public T visit(CostChooseColor cost) {
return null;
}
@Override @Override
public T visit(CostChooseCreatureType cost) { public T visit(CostChooseCreatureType cost) {
return null; return null;

View File

@@ -13,6 +13,7 @@ import forge.util.TextUtil;
public class PaymentDecision { public class PaymentDecision {
public int c = 0; public int c = 0;
public String type; public String type;
public List<String> colors;
public final CardCollection cards = new CardCollection(); public final CardCollection cards = new CardCollection();
public final List<Mana> mana; public final List<Mana> mana;
@@ -48,6 +49,11 @@ public class PaymentDecision {
type = choice; type = choice;
} }
public PaymentDecision(List<String> choices) {
this(null, null, null, null, null);
colors = choices;
}
public static PaymentDecision card(Card chosen) { public static PaymentDecision card(Card chosen) {
return new PaymentDecision(chosen); return new PaymentDecision(chosen);
} }
@@ -88,6 +94,10 @@ public class PaymentDecision {
return new PaymentDecision(choice); return new PaymentDecision(choice);
} }
public static PaymentDecision colors(List<String> choices) {
return new PaymentDecision(choices);
}
public static PaymentDecision players(List<Player> players) { public static PaymentDecision players(List<Player> players) {
return new PaymentDecision(null, null, players, null, null); return new PaymentDecision(null, null, players, null, null);
} }

View File

@@ -153,6 +153,7 @@ public enum Keyword {
SCAVENGE("Scavenge", KeywordWithCost.class, false, "%s, Exile this card from your graveyard: Put a number of +1/+1 counters equal to this card's power on target creature. Scavenge only as a sorcery."), SCAVENGE("Scavenge", KeywordWithCost.class, false, "%s, Exile this card from your graveyard: Put a number of +1/+1 counters equal to this card's power on target creature. Scavenge only as a sorcery."),
SOULBOND("Soulbond", SimpleKeyword.class, true, "You may pair this creature with another unpaired creature when either enters the battlefield. They remain paired for as long as you control both of them."), SOULBOND("Soulbond", SimpleKeyword.class, true, "You may pair this creature with another unpaired creature when either enters the battlefield. They remain paired for as long as you control both of them."),
SOULSHIFT("Soulshift", KeywordWithAmount.class, false, "When this creature dies, you may return target Spirit card with mana value %d or less from your graveyard to your hand."), SOULSHIFT("Soulshift", KeywordWithAmount.class, false, "When this creature dies, you may return target Spirit card with mana value %d or less from your graveyard to your hand."),
SPECIALIZE("Specialize", KeywordWithCost.class, false, "%s, Choose a color, discard a card of that color or associated basic land type: This card perpetually specializes into that color. Activate only as a sorcery."),
SPECTACLE("Spectacle", KeywordWithCost.class, false, "You may cast this spell for its spectacle cost rather than its mana cost if an opponent lost life this turn."), SPECTACLE("Spectacle", KeywordWithCost.class, false, "You may cast this spell for its spectacle cost rather than its mana cost if an opponent lost life this turn."),
SPLICE("Splice", KeywordWithCostAndType.class, false, "As you cast an %2$s spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell."), SPLICE("Splice", KeywordWithCostAndType.class, false, "As you cast an %2$s spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell."),
SPLIT_SECOND("Split second", SimpleKeyword.class, true, "As long as this spell is on the stack, players can't cast other spells or activate abilities that aren't mana abilities."), SPLIT_SECOND("Split second", SimpleKeyword.class, true, "As long as this spell is on the stack, players can't cast other spells or activate abilities that aren't mana abilities."),

View File

@@ -7,7 +7,8 @@ public class KeywordWithCost extends KeywordInstance<KeywordWithCost> {
@Override @Override
protected void parse(String details) { protected void parse(String details) {
cost = new Cost(details.split("\\|", 2)[0].trim(), false); String[] allDetails = details.split(":");
cost = new Cost(allDetails[0].split("\\|", 2)[0].trim(), false);
} }
@Override @Override

View File

@@ -835,7 +835,8 @@ public class Player extends GameEntity implements Comparable<Player> {
return true; return true;
} }
public void addCounterInternal(final CounterType counterType, final int n, final Player source, final boolean fireEvents, GameEntityCounterTable table) { @Override
public void addCounterInternal(final CounterType counterType, final int n, final Player source, final boolean fireEvents, GameEntityCounterTable table, Map<AbilityKey, Object> params) {
int addAmount = n; int addAmount = n;
if (addAmount <= 0 || !canReceiveCounters(counterType)) { if (addAmount <= 0 || !canReceiveCounters(counterType)) {
// As per rule 107.1b // As per rule 107.1b
@@ -849,6 +850,9 @@ public class Player extends GameEntity implements Comparable<Player> {
final Map<AbilityKey, Object> runParams = AbilityKey.mapFromPlayer(this); final Map<AbilityKey, Object> runParams = AbilityKey.mapFromPlayer(this);
runParams.put(AbilityKey.Source, source); runParams.put(AbilityKey.Source, source);
runParams.put(AbilityKey.CounterType, counterType); runParams.put(AbilityKey.CounterType, counterType);
if (params != null) {
runParams.putAll(params);
}
for (int i = 0; i < addAmount; i++) { for (int i = 0; i < addAmount; i++) {
runParams.put(AbilityKey.CounterAmount, oldValue + i + 1); runParams.put(AbilityKey.CounterAmount, oldValue + i + 1);
getGame().getTriggerHandler().runTrigger(TriggerType.CounterAdded, AbilityKey.newMap(runParams), false); getGame().getTriggerHandler().runTrigger(TriggerType.CounterAdded, AbilityKey.newMap(runParams), false);

View File

@@ -135,6 +135,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
private boolean cumulativeupkeep = false; private boolean cumulativeupkeep = false;
private boolean blessing = false; private boolean blessing = false;
private Integer chapter = null; private Integer chapter = null;
private boolean lastChapter = false;
/** The pay costs. */ /** The pay costs. */
private Cost payCosts; private Cost payCosts;
@@ -1066,6 +1067,13 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
chapter = val; chapter = val;
} }
public boolean isLastChapter() {
return lastChapter;
}
public boolean setLastChapter(boolean value) {
return lastChapter = value;
}
public StaticAbility getMayPlay() { public StaticAbility getMayPlay() {
return mayPlay; return mayPlay;
} }
@@ -1129,6 +1137,9 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
clone.paidAbilities = Lists.newArrayList(); clone.paidAbilities = Lists.newArrayList();
clone.setPaidHash(Maps.newHashMap(getPaidHash())); clone.setPaidHash(Maps.newHashMap(getPaidHash()));
// copy last chapter flag for Trigger
clone.lastChapter = this.lastChapter;
if (usesTargeting()) { if (usesTargeting()) {
// the targets need to be cloned, otherwise they might be cleared // the targets need to be cloned, otherwise they might be cleared
clone.targetChosen = getTargets().clone(); clone.targetChosen = getTargets().clone();

View File

@@ -19,7 +19,6 @@ package forge.game.trigger;
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 forge.game.Game;
import forge.game.ability.AbilityKey; import forge.game.ability.AbilityKey;
import forge.game.card.Card; import forge.game.card.Card;
import forge.game.card.CardZoneTable; import forge.game.card.CardZoneTable;
@@ -54,8 +53,8 @@ public class TriggerAbilityTriggered extends Trigger {
return false; return false;
} }
final Card source = spellAbility.getHostCard(); final Card source = spellAbility.getHostCard();
@SuppressWarnings("unchecked")
final Iterable<Card> causes = (Iterable<Card>) runParams.get(AbilityKey.Cause); final Iterable<Card> causes = (Iterable<Card>) runParams.get(AbilityKey.Cause);
final Game game = source.getGame();
if (hasParam("ValidMode")) { if (hasParam("ValidMode")) {
List<String> validModes = Arrays.asList(getParam("ValidMode").split(",")); List<String> validModes = Arrays.asList(getParam("ValidMode").split(","));
@@ -73,6 +72,10 @@ public class TriggerAbilityTriggered extends Trigger {
} }
} }
if (!matchesValidParam("ValidSpellAbility", spellAbility)) {
return false;
}
if (!matchesValidParam("ValidSource", source)) { if (!matchesValidParam("ValidSource", source)) {
return false; return false;
} }

View File

@@ -89,6 +89,19 @@ public class TriggerCounterAdded extends Trigger {
} }
} }
// TODO check CR for Read Ahead when they are out
// for now assume it only is about etb counter
if (hasParam("Chapter") && runParams.containsKey(AbilityKey.ETB) && true == (boolean)runParams.get(AbilityKey.ETB)) {
Card card = (Card)runParams.get(AbilityKey.Card);
Integer readAhead = card.getReadAhead();
if (readAhead != null) {
final int actualAmount = (Integer) runParams.get(AbilityKey.CounterAmount);
if (actualAmount < readAhead) {
return false;
}
}
}
return true; return true;
} }

View File

@@ -0,0 +1,73 @@
/*
* Forge: Play Magic: the Gathering.
* Copyright (C) 2011 Forge Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge.game.trigger;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
import forge.util.Localizer;
import java.util.Map;
/**
* <p>
* TriggerSpecializes class.
* </p>
*/
public class TriggerSpecializes extends Trigger {
/**
* <p>
* Constructor for TriggerSpecializes
* </p>
*
* @param params
* a {@link java.util.HashMap} object.
* @param host
* a {@link forge.game.card.Card} object.
* @param intrinsic
* the intrinsic
*/
public TriggerSpecializes (Map<String, String> params, final Card host, final boolean intrinsic) {
super(params, host, intrinsic);
}
/** {@inheritDoc}
* @param runParams*/
@Override
public final boolean performTest(Map<AbilityKey, Object> runParams) {
if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Card))) {
return false;
}
return true;
}
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa, Map<AbilityKey, Object> runParams) {
sa.setTriggeringObjectsFrom(runParams, AbilityKey.Card);
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append(Localizer.getInstance().getMessage("lblSpecialized")).append(": ");
sb.append(sa.getTriggeringObject(AbilityKey.Card));
return sb.toString();
}
}

View File

@@ -102,6 +102,7 @@ public enum TriggerType {
SearchedLibrary(TriggerSearchedLibrary.class), SearchedLibrary(TriggerSearchedLibrary.class),
SetInMotion(TriggerSetInMotion.class), SetInMotion(TriggerSetInMotion.class),
Shuffled(TriggerShuffled.class), Shuffled(TriggerShuffled.class),
Specializes(TriggerSpecializes.class),
SpellAbilityCast(TriggerSpellAbilityCastOrCopy.class), SpellAbilityCast(TriggerSpellAbilityCastOrCopy.class),
SpellAbilityCopy(TriggerSpellAbilityCastOrCopy.class), SpellAbilityCopy(TriggerSpellAbilityCastOrCopy.class),
SpellCast(TriggerSpellAbilityCastOrCopy.class), SpellCast(TriggerSpellAbilityCastOrCopy.class),

View File

@@ -286,19 +286,30 @@ public class WrappedAbility extends Ability {
return sa.isCycling(); return sa.isCycling();
} }
@Override
public boolean isChapter() { public boolean isChapter() {
return sa.isChapter(); return sa.isChapter();
} }
@Override
public Integer getChapter() { public Integer getChapter() {
return sa.getChapter(); return sa.getChapter();
} }
@Override
public void setChapter(int val) { public void setChapter(int val) {
sa.setChapter(val); sa.setChapter(val);
} }
@Override
public boolean isLastChapter() {
return sa.isLastChapter();
}
@Override
public boolean setLastChapter(boolean value) {
return sa.setLastChapter(value);
}
@Override @Override
public boolean isFlashBackAbility() { public boolean isFlashBackAbility() {
return sa.isFlashBackAbility(); return sa.isFlashBackAbility();
@@ -566,4 +577,5 @@ public class WrappedAbility extends Ability {
public void setChosenList(List<AbilitySub> choices) { public void setChosenList(List<AbilitySub> choices) {
sa.setChosenList(choices); sa.setChosenList(choices);
} }
} }

View File

@@ -230,7 +230,7 @@ public class GameSimulationTest extends SimulationTest {
Game game = initAndCreateGame(); Game game = initAndCreateGame();
Player p = game.getPlayers().get(1); Player p = game.getPlayers().get(1);
Card sorin = addCard("Sorin, Solemn Visitor", p); Card sorin = addCard("Sorin, Solemn Visitor", p);
sorin.addCounterInternal(CounterEnumType.LOYALTY, 5, p, false, null); sorin.addCounterInternal(CounterEnumType.LOYALTY, 5, p, false, null, null);
game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p);
game.getAction().checkStateEffects(true); game.getAction().checkStateEffects(true);
@@ -275,7 +275,7 @@ public class GameSimulationTest extends SimulationTest {
String bearCardName = "Runeclaw Bear"; String bearCardName = "Runeclaw Bear";
addCard(bearCardName, p); addCard(bearCardName, p);
Card gideon = addCard("Gideon, Ally of Zendikar", p); Card gideon = addCard("Gideon, Ally of Zendikar", p);
gideon.addCounterInternal(CounterEnumType.LOYALTY, 4, p, false, null); gideon.addCounterInternal(CounterEnumType.LOYALTY, 4, p, false, null, null);
game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p);
game.getAction().checkStateEffects(true); game.getAction().checkStateEffects(true);
@@ -404,7 +404,7 @@ public class GameSimulationTest extends SimulationTest {
Game game = initAndCreateGame(); Game game = initAndCreateGame();
Player p = game.getPlayers().get(1); Player p = game.getPlayers().get(1);
Card sarkhan = addCard(sarkhanCardName, p); Card sarkhan = addCard(sarkhanCardName, p);
sarkhan.addCounterInternal(CounterEnumType.LOYALTY, 4, p, false, null); sarkhan.addCounterInternal(CounterEnumType.LOYALTY, 4, p, false, null, null);
game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p);
game.getAction().checkStateEffects(true); game.getAction().checkStateEffects(true);
@@ -439,7 +439,7 @@ public class GameSimulationTest extends SimulationTest {
addCard(ornithoperCardName, p); addCard(ornithoperCardName, p);
addCard(bearCardName, p); addCard(bearCardName, p);
Card ajani = addCard(ajaniCardName, p); Card ajani = addCard(ajaniCardName, p);
ajani.addCounterInternal(CounterEnumType.LOYALTY, 4, p, false, null); ajani.addCounterInternal(CounterEnumType.LOYALTY, 4, p, false, null, null);
game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p);
game.getAction().checkStateEffects(true); game.getAction().checkStateEffects(true);
@@ -472,7 +472,7 @@ public class GameSimulationTest extends SimulationTest {
SpellAbility boltSA = boltCard.getFirstSpellAbility(); SpellAbility boltSA = boltCard.getFirstSpellAbility();
Card ajani = addCard(ajaniCardName, p); Card ajani = addCard(ajaniCardName, p);
ajani.addCounterInternal(CounterEnumType.LOYALTY, 8, p, false, null); ajani.addCounterInternal(CounterEnumType.LOYALTY, 8, p, false, null, null);
game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p);
game.getAction().checkStateEffects(true); game.getAction().checkStateEffects(true);
@@ -523,7 +523,7 @@ public class GameSimulationTest extends SimulationTest {
addCard("Swamp", p); addCard("Swamp", p);
addCard("Swamp", p); addCard("Swamp", p);
Card depths = addCard("Dark Depths", p); Card depths = addCard("Dark Depths", p);
depths.addCounterInternal(CounterEnumType.ICE, 10, p, false, null); depths.addCounterInternal(CounterEnumType.ICE, 10, p, false, null, null);
Card thespian = addCard("Thespian's Stage", p); Card thespian = addCard("Thespian's Stage", p);
game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p);
game.getAction().checkStateEffects(true); game.getAction().checkStateEffects(true);
@@ -2256,7 +2256,7 @@ public class GameSimulationTest extends SimulationTest {
Player p = game.getPlayers().get(0); Player p = game.getPlayers().get(0);
Card polukranos = addCard(polukranosCardName, p); Card polukranos = addCard(polukranosCardName, p);
polukranos.addCounterInternal(CounterEnumType.P1P1, 6, p, false, null); polukranos.addCounterInternal(CounterEnumType.P1P1, 6, p, false, null, null);
addCard(hydraCardName, p); addCard(hydraCardName, p);
addCard(leylineCardName, p); addCard(leylineCardName, p);
for (int i = 0; i < 2; ++i) { for (int i = 0; i < 2; ++i) {
@@ -2301,7 +2301,7 @@ public class GameSimulationTest extends SimulationTest {
} }
Card nishoba = addCard(nishobaName, p1); Card nishoba = addCard(nishobaName, p1);
nishoba.addCounterInternal(CounterEnumType.P1P1, 7, p1, false, null); nishoba.addCounterInternal(CounterEnumType.P1P1, 7, p1, false, null, null);
addCard(capridorName, p1); addCard(capridorName, p1);
Card pridemate = addCard(pridemateName, p1); Card pridemate = addCard(pridemateName, p1);
Card indestructibility = addCard(indestructibilityName, p1); Card indestructibility = addCard(indestructibilityName, p1);

View File

@@ -4,7 +4,7 @@ Types:Legendary Creature Halfling Rogue
PT:3/2 PT:3/2
T:Mode$ AttackersDeclared | AttackingPlayer$ You | Execute$ TrigPump | TriggerZones$ Battlefield | TriggerDescription$ Whenever you attack, up to one target attacking creature can't be blocked this turn. Return that creature to its owner's hand at the beginning of the next end step. T:Mode$ AttackersDeclared | AttackingPlayer$ You | Execute$ TrigPump | TriggerZones$ Battlefield | TriggerDescription$ Whenever you attack, up to one target attacking creature can't be blocked this turn. Return that creature to its owner's hand at the beginning of the next end step.
SVar:TrigPump:DB$ Pump | KW$ HIDDEN Unblockable | TgtPrompt$ Select target attacking creature | ValidTgts$ Creature.attacking | TargetMin$ 0 | TargetMax$ 1 | SubAbility$ DBDelTrig SVar:TrigPump:DB$ Pump | KW$ HIDDEN Unblockable | TgtPrompt$ Select target attacking creature | ValidTgts$ Creature.attacking | TargetMin$ 0 | TargetMax$ 1 | SubAbility$ DBDelTrig
SVar:DBDelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | RememberObjects$ Targeted | Execute$ TrigReturn | SpellDescription$ Return that creature to its owner's hand at the beginning of the next end step. SVar:DBDelTrig:DB$ DelayedTrigger | ConditionDefined$ Targeted | ConditionPresent$ Card | Mode$ Phase | Phase$ End of Turn | RememberObjects$ Targeted | Execute$ TrigReturn | SpellDescription$ Return that creature to its owner's hand at the beginning of the next end step.
SVar:TrigReturn:DB$ ChangeZone | Defined$ DelayTriggerRememberedLKI | Origin$ Battlefield | Destination$ Hand SVar:TrigReturn:DB$ ChangeZone | Defined$ DelayTriggerRememberedLKI | Origin$ Battlefield | Destination$ Hand
K:Choose a Background K:Choose a Background
Oracle:Whenever you attack, up to one target attacking creature can't be blocked this turn. Return that creature to its owner's hand at the beginning of the next end step.\nChoose a Background (You can have a Background as a second commander.) Oracle:Whenever you attack, up to one target attacking creature can't be blocked this turn. Return that creature to its owner's hand at the beginning of the next end step.\nChoose a Background (You can have a Background as a second commander.)

View File

@@ -2,8 +2,8 @@ Name:Alpha Brawl
ManaCost:6 R R ManaCost:6 R R
Types:Sorcery Types:Sorcery
A:SP$ Pump | Cost$ 6 R R | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | RememberTargets$ True | StackDescription$ None | SubAbility$ AlphaAttack | SpellDescription$ Target creature an opponent controls deals damage equal to its power to each other creature that player controls, then each of those creatures deals damage equal to its power to that creature. A:SP$ Pump | Cost$ 6 R R | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | RememberTargets$ True | StackDescription$ None | SubAbility$ AlphaAttack | SpellDescription$ Target creature an opponent controls deals damage equal to its power to each other creature that player controls, then each of those creatures deals damage equal to its power to that creature.
SVar:AlphaAttack:DB$ DamageAll | ValidCards$ Creature.OppCtrl+IsNotRemembered | DamageSource$ Targeted | NumDmg$ Y | SubAbility$ SucksToBeAlpha | StackDescription$ Targeted creature deals damage equal to its power to each other creature that player controls, SVar:AlphaAttack:DB$ DamageAll | ValidCards$ Creature.IsNotRemembered+ControlledBy TargetedController | DamageSource$ Targeted | NumDmg$ Y | SubAbility$ SucksToBeAlpha | StackDescription$ Targeted creature deals damage equal to its power to each other creature that player controls,
SVar:SucksToBeAlpha:DB$ EachDamage | ValidCards$ Creature.OppCtrl+IsNotRemembered | ValidDescription$ of those creatures | NumDmg$ X | DamageDesc$ damage equal to its power | DefinedCards$ Remembered | SubAbility$ DBCleanup | StackDescription$ then each of those creatures deals damage equal to its power to that creature SVar:SucksToBeAlpha:DB$ EachDamage | ValidCards$ Creature.IsNotRemembered+ControlledBy TargetedController | ValidDescription$ of those creatures | NumDmg$ X | DamageDesc$ damage equal to its power | DefinedCards$ Remembered | SubAbility$ DBCleanup | StackDescription$ then each of those creatures deals damage equal to its power to that creature
#NumDmg isn't really used here. It is left for clarity. The AF pulls Damage straight from "X" hardcoded. #NumDmg isn't really used here. It is left for clarity. The AF pulls Damage straight from "X" hardcoded.
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:X:Count$CardPower SVar:X:Count$CardPower

View File

@@ -4,6 +4,6 @@ Types:Creature Human Knight
PT:2/1 PT:2/1
K:ETBReplacement:Other:ChooseC K:ETBReplacement:Other:ChooseC
SVar:ChooseC:DB$ ChooseCard | Defined$ You | Choices$ Creature.YouCtrl+Other | AILogic$ AtLeast1 | Mandatory$ True | SpellDescription$ As CARDNAME enters the battlefield, choose another creature you control. SVar:ChooseC:DB$ ChooseCard | Defined$ You | Choices$ Creature.YouCtrl+Other | AILogic$ AtLeast1 | Mandatory$ True | SpellDescription$ As CARDNAME enters the battlefield, choose another creature you control.
A:AB$ Pump | Cost$ Sac<1/CARDNAME> | Defined$ ChosenCard | KW$ Indestructible | SubAbility$ DBCleanup | SpellDescription$ The chosen creature gains indestructible until end of turn. A:AB$ Pump | Cost$ Sac<1/CARDNAME> | Defined$ Valid Card.ChosenCardStrict | KW$ Indestructible | SubAbility$ DBCleanup | SpellDescription$ The chosen creature gains indestructible until end of turn.
SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True
Oracle:As Dauntless Bodyguard enters the battlefield, choose another creature you control.\nSacrifice Dauntless Bodyguard: The chosen creature gains indestructible until end of turn. Oracle:As Dauntless Bodyguard enters the battlefield, choose another creature you control.\nSacrifice Dauntless Bodyguard: The chosen creature gains indestructible until end of turn.

View File

@@ -6,7 +6,7 @@ SVar:TrigExileSpell:DB$ ChangeZone | Defined$ TriggeredCardLKICopy | Origin$ Sta
SVar:DBPlaySpell:DB$ RepeatEach | UseImprinted$ True | RepeatCards$ Card.IsRemembered | ChooseOrder$ True | Zone$ Exile | RepeatSubAbility$ DBPlay SVar:DBPlaySpell:DB$ RepeatEach | UseImprinted$ True | RepeatCards$ Card.IsRemembered | ChooseOrder$ True | Zone$ Exile | RepeatSubAbility$ DBPlay
SVar:DBPlay:DB$ Play | Defined$ Imprinted | Controller$ TriggeredCardController | WithoutManaCost$ True | ValidSA$ Spell | CopyCard$ True | Optional$ True SVar:DBPlay:DB$ Play | Defined$ Imprinted | Controller$ TriggeredCardController | WithoutManaCost$ True | ValidSA$ Spell | CopyCard$ True | Optional$ True
T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered | Execute$ DBForget T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered | Execute$ DBForget
SVar:DBForget:DB$ Pump | Defined$ TriggeredCard | ForgetObjects$ TriggeredCard SVar:DBForget:DB$ Pump | ForgetObjects$ TriggeredCard
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
AI:RemoveDeck:All AI:RemoveDeck:All

View File

@@ -7,7 +7,7 @@ T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage
SVar:TrigExile:DB$ ChangeZone | Origin$ Hand | Destination$ Exile | ChangeType$ Card | DefinedPlayer$ TriggeredTarget | Chooser$ TriggeredTarget | Mandatory$ True | ChangeNum$ 1 | RememberChanged$ True SVar:TrigExile:DB$ ChangeZone | Origin$ Hand | Destination$ Exile | ChangeType$ Card | DefinedPlayer$ TriggeredTarget | Chooser$ TriggeredTarget | Mandatory$ True | ChangeNum$ 1 | RememberChanged$ True
S:Mode$ Continuous | MayPlay$ True | Affected$ Card.IsRemembered | AffectedZone$ Exile S:Mode$ Continuous | MayPlay$ True | Affected$ Card.IsRemembered | AffectedZone$ Exile
T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered | Execute$ DBForget T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered | Execute$ DBForget
SVar:DBForget:DB$ Pump | Defined$ TriggeredCard | ForgetObjects$ TriggeredCard SVar:DBForget:DB$ Pump | ForgetObjects$ TriggeredCard
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
A:AB$ Regenerate | Cost$ Sac<1/Human> | SpellDescription$ Regenerate CARDNAME. A:AB$ Regenerate | Cost$ Sac<1/Human> | SpellDescription$ Regenerate CARDNAME.

View File

@@ -3,7 +3,7 @@ ManaCost:no cost
Types:Land Gate Types:Land Gate
A:AB$ Mana | Cost$ T | Produced$ C | Amount$ 1 | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ T | Produced$ C | Amount$ 1 | SpellDescription$ Add {C}.
A:AB$ Mana | Cost$ 1 T | Produced$ Any | SpellDescription$ Add one mana of any color. A:AB$ Mana | Cost$ 1 T | Produced$ Any | SpellDescription$ Add one mana of any color.
A:AB$ Token | Cost$ 1 T tapXType<1/Gate> | TokenScript$ c_a_treasure_sac | TokenAmount$ 1 A:AB$ Token | Cost$ 1 T tapXType<1/Gate> | TokenScript$ c_a_treasure_sac | TokenAmount$ 1 | SpellDescription$ Create a Treasure token.
DeckHas:Ability$Sacrifice|Token & Type$Treasure|Artifact DeckHas:Ability$Sacrifice|Token & Type$Treasure|Artifact
DeckHints:Type$Gate DeckHints:Type$Gate
Oracle:{T}: Add {C}.\n{1}, {T}: Add one mana of any color.\n{1}, {T}, Tap an untapped Gate you control: Create a Treasure token. (It's an artifact with "{T}, Sacrifice this artifact: Add one mana of any color.") Oracle:{T}: Add {C}.\n{1}, {T}: Add one mana of any color.\n{1}, {T}, Tap an untapped Gate you control: Create a Treasure token. (It's an artifact with "{T}, Sacrifice this artifact: Add one mana of any color.")

View File

@@ -6,7 +6,7 @@ SVar:TrigExile:DB$ ChangeZoneAll | ValidTgts$ Opponent | TgtPrompt$ Select targe
S:Mode$ Continuous | MayPlay$ True | Affected$ Land.IsRemembered+ExiledWithSource | AffectedZone$ Exile | Description$ You may play lands from among cards exiled with CARDNAME. S:Mode$ Continuous | MayPlay$ True | Affected$ Land.IsRemembered+ExiledWithSource | AffectedZone$ Exile | Description$ You may play lands from among cards exiled with CARDNAME.
S:Mode$ Continuous | MayPlay$ True | MayPlayLimit$ 1 | Affected$ Card.nonLand+IsRemembered+ExiledWithSource | AffectedZone$ Exile | Description$ You may play cards exiled with CARDNAME. S:Mode$ Continuous | MayPlay$ True | MayPlayLimit$ 1 | Affected$ Card.nonLand+IsRemembered+ExiledWithSource | AffectedZone$ Exile | Description$ You may play cards exiled with CARDNAME.
T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered+ExiledWithSource | Execute$ DBForget T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered+ExiledWithSource | Execute$ DBForget
SVar:DBForget:DB$ Pump | Defined$ TriggeredCard | ForgetObjects$ TriggeredCard SVar:DBForget:DB$ Pump | ForgetObjects$ TriggeredCard
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
Oracle:When Hedonist's Trove enters the battlefield, exile all cards from target opponent's graveyard.\nYou may play lands from among cards exiled with Hedonist's Trove.\nYou may cast spells from among cards exiled with Hedonist's Trove. You can't cast more than one spell this way each turn. Oracle:When Hedonist's Trove enters the battlefield, exile all cards from target opponent's graveyard.\nYou may play lands from among cards exiled with Hedonist's Trove.\nYou may cast spells from among cards exiled with Hedonist's Trove. You can't cast more than one spell this way each turn.

View File

@@ -6,7 +6,7 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S
SVar:TrigExile:DB$ ChangeZone | Origin$ Hand | Destination$ Exile | ChangeType$ Card | DefinedPlayer$ Opponent | Mandatory$ True | ChangeType$ Card | Hidden$ True | Duration$ UntilHostLeavesPlay | IsCurse$ True | RememberChanged$ True SVar:TrigExile:DB$ ChangeZone | Origin$ Hand | Destination$ Exile | ChangeType$ Card | DefinedPlayer$ Opponent | Mandatory$ True | ChangeType$ Card | Hidden$ True | Duration$ UntilHostLeavesPlay | IsCurse$ True | RememberChanged$ True
S:Mode$ Continuous | MayPlay$ True | MayPlayIgnoreColor$ True | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ Body Thief — You may play lands and cast spells from among cards exiled with CARDNAME. If you cast a spell this way, you may spend mana as though it were mana of any color to cast it. S:Mode$ Continuous | MayPlay$ True | MayPlayIgnoreColor$ True | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ Body Thief — You may play lands and cast spells from among cards exiled with CARDNAME. If you cast a spell this way, you may spend mana as though it were mana of any color to cast it.
T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered | Execute$ DBForget T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered | Execute$ DBForget
SVar:DBForget:DB$ Pump | Defined$ TriggeredCard | ForgetObjects$ TriggeredCard SVar:DBForget:DB$ Pump | ForgetObjects$ TriggeredCard
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
Oracle:Devour Intellect — When Intellect Devourer enters the battlefield, each opponent exiles a card from their hand until Intellect Devourer leaves the battlefield.\nBody Thief — You may play lands and cast spells from among cards exiled with Intellect Devourer. If you cast a spell this way, you may spend mana as though it were mana of any color to cast it. Oracle:Devour Intellect — When Intellect Devourer enters the battlefield, each opponent exiles a card from their hand until Intellect Devourer leaves the battlefield.\nBody Thief — You may play lands and cast spells from among cards exiled with Intellect Devourer. If you cast a spell this way, you may spend mana as though it were mana of any color to cast it.

View File

@@ -9,7 +9,7 @@ SVar:X:Count$CastTotalManaSpent
T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPlay | OptionalDecider$ You | TriggerDescription$ Whenever NICKNAME attacks, you may cast an instant or sorcery card from among cards exiled with NICKNAME without paying its mana cost. T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPlay | OptionalDecider$ You | TriggerDescription$ Whenever NICKNAME attacks, you may cast an instant or sorcery card from among cards exiled with NICKNAME without paying its mana cost.
SVar:TrigPlay:DB$ Play | ValidZone$ Exile | Valid$ Instant.IsRemembered+ExiledWithSource,Sorcery.IsRemembered+ExiledWithSource | ValidSA$ Spell | Controller$ You | WithoutManaCost$ True | Amount$ 1 SVar:TrigPlay:DB$ Play | ValidZone$ Exile | Valid$ Instant.IsRemembered+ExiledWithSource,Sorcery.IsRemembered+ExiledWithSource | ValidSA$ Spell | Controller$ You | WithoutManaCost$ True | Amount$ 1
T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered+ExiledWithSource | Execute$ DBForget T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered+ExiledWithSource | Execute$ DBForget
SVar:DBForget:DB$ Pump | Defined$ TriggeredCard | ForgetObjects$ TriggeredCard SVar:DBForget:DB$ Pump | ForgetObjects$ TriggeredCard
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
Oracle:Flying\nWhen Jeleva, Nephalia's Scourge enters the battlefield, each player exiles the top X cards of their library, where X is the amount of mana spent to cast Jeleva.\nWhenever Jeleva attacks, you may cast an instant or sorcery spell from among cards exiled with Jeleva without paying its mana cost. Oracle:Flying\nWhen Jeleva, Nephalia's Scourge enters the battlefield, each player exiles the top X cards of their library, where X is the amount of mana spent to cast Jeleva.\nWhenever Jeleva attacks, you may cast an instant or sorcery spell from among cards exiled with Jeleva without paying its mana cost.

View File

@@ -7,7 +7,7 @@ T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage
SVar:TrigExile:DB$ ChangeZone | Origin$ Hand | Destination$ Exile | ChangeType$ Card | DefinedPlayer$ TriggeredTarget | Chooser$ TriggeredTarget | ExileFaceDown$ True | Mandatory$ True | ChangeNum$ 1 | RememberChanged$ True SVar:TrigExile:DB$ ChangeZone | Origin$ Hand | Destination$ Exile | ChangeType$ Card | DefinedPlayer$ TriggeredTarget | Chooser$ TriggeredTarget | ExileFaceDown$ True | Mandatory$ True | ChangeNum$ 1 | RememberChanged$ True
S:Mode$ Continuous | MayPlay$ True | MayLookAt$ You | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ You may look at cards exiled with CARDNAME, and you may play lands and cast spells from among those cards. S:Mode$ Continuous | MayPlay$ True | MayLookAt$ You | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ You may look at cards exiled with CARDNAME, and you may play lands and cast spells from among those cards.
T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered | Execute$ DBForget T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered | Execute$ DBForget
SVar:DBForget:DB$ Pump | Defined$ TriggeredCard | ForgetObjects$ TriggeredCard SVar:DBForget:DB$ Pump | ForgetObjects$ TriggeredCard
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
Oracle:Menace\nWhenever Kheru Mind-Eater deals combat damage to a player, that player exiles a card from their hand face down.\nYou may look at cards exiled with Kheru Mind-Eater, and you may play lands and cast spells from among those cards. Oracle:Menace\nWhenever Kheru Mind-Eater deals combat damage to a player, that player exiles a card from their hand face down.\nYou may look at cards exiled with Kheru Mind-Eater, and you may play lands and cast spells from among those cards.

View File

@@ -3,7 +3,7 @@ ManaCost:6 R R
Types:Creature Elemental Types:Creature Elemental
PT:8/5 PT:8/5
A:AB$ DealDamage | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature to distribute damage to | NumDmg$ FirePower | TargetMin$ Min | TargetMax$ FirePower | DividedAsYouChoose$ FirePower | SubAbility$ Retribution | RememberTargets$ True | SpellDescription$ CARDNAME deals damage equal to its power divided as you choose among any number of target creatures. Each of those creatures deals damage equal to its power to CARDNAME. A:AB$ DealDamage | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature to distribute damage to | NumDmg$ FirePower | TargetMin$ Min | TargetMax$ FirePower | DividedAsYouChoose$ FirePower | SubAbility$ Retribution | RememberTargets$ True | SpellDescription$ CARDNAME deals damage equal to its power divided as you choose among any number of target creatures. Each of those creatures deals damage equal to its power to CARDNAME.
SVar:Retribution:DB$ EachDamage | ValidCards$ Creature.IsRemembered | ValidDescription$ of those creatures | NumDmg$ X | DamageDesc$ damage equal to its power | DefinedCards$ Remembered | SubAbility$ DBCleanup | StackDescription$ then each of those creatures deals damage equal to its power to CARDNAME SVar:Retribution:DB$ EachDamage | ValidCards$ Creature.IsRemembered | ValidDescription$ of those creatures | NumDmg$ X | DamageDesc$ damage equal to its power | DefinedPlayers$ Self | SubAbility$ DBCleanup | StackDescription$ then each of those creatures deals damage equal to its power to CARDNAME
#NumDmg isn't really used here. It is left for clarity. The AF pulls Damage straight from "X" hardcoded. #NumDmg isn't really used here. It is left for clarity. The AF pulls Damage straight from "X" hardcoded.
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:X:Count$CardPower SVar:X:Count$CardPower

View File

@@ -8,7 +8,7 @@ SVar:STPlay:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ C
SVar:TrigCleanup:Mode$ ChangesZone | ValidCard$ Card.ChosenCard | Origin$ Exile | Destination$ Any | TriggerZones$ Command | Execute$ DBExileSelf | Static$ True SVar:TrigCleanup:Mode$ ChangesZone | ValidCard$ Card.ChosenCard | Origin$ Exile | Destination$ Any | TriggerZones$ Command | Execute$ DBExileSelf | Static$ True
SVar:DBExileSelf:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:DBExileSelf:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile
T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered+ExiledWithSource | Execute$ DBForget T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered+ExiledWithSource | Execute$ DBForget
SVar:DBForget:DB$ Pump | Defined$ TriggeredCard | ForgetObjects$ TriggeredCard SVar:DBForget:DB$ Pump | ForgetObjects$ TriggeredCard
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
Oracle:{3}, {T}: Target player exiles a card from their hand. Activate only as a sorcery.\n{1}: Choose a card exiled with Muse Vessel. You may play that card this turn. Oracle:{3}, {T}: Target player exiles a card from their hand. Activate only as a sorcery.\n{1}: Choose a card exiled with Muse Vessel. You may play that card this turn.

View File

@@ -8,7 +8,7 @@ SVar:TrigExileGrave:DB$ ChangeZoneAll | Origin$ Graveyard | Destination$ Exile |
T:Mode$ DamageDone | ValidSource$ Card.Self | Execute$ TrigPut | CombatDamage$ True | ValidTarget$ Player | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may put a creature card exiled with CARDNAME onto the battlefield under your control. T:Mode$ DamageDone | ValidSource$ Card.Self | Execute$ TrigPut | CombatDamage$ True | ValidTarget$ Player | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may put a creature card exiled with CARDNAME onto the battlefield under your control.
SVar:TrigPut:DB$ ChangeZone | Origin$ Exile | Destination$ Battlefield | Hidden$ True | ChooseType$ Creature.IsRemembered | SelectPrompt$ Select a creature card exiled with this | GainControl$ True SVar:TrigPut:DB$ ChangeZone | Origin$ Exile | Destination$ Battlefield | Hidden$ True | ChooseType$ Creature.IsRemembered | SelectPrompt$ Select a creature card exiled with this | GainControl$ True
T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered | Execute$ DBForget T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered | Execute$ DBForget
SVar:DBForget:DB$ Pump | Defined$ TriggeredCard | ForgetObjects$ TriggeredCard SVar:DBForget:DB$ Pump | ForgetObjects$ TriggeredCard
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
K:Crew:3 K:Crew:3

View File

@@ -7,7 +7,7 @@ T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage
SVar:TrigExile:DB$ Dig | Defined$ TriggeredTarget | DigNum$ 1 | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True SVar:TrigExile:DB$ Dig | Defined$ TriggeredTarget | DigNum$ 1 | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True
S:Mode$ Continuous | MayPlay$ True | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ You may play lands and cast spells from among cards exiled with CARDNAME. S:Mode$ Continuous | MayPlay$ True | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ You may play lands and cast spells from among cards exiled with CARDNAME.
T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered | Execute$ DBForget T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered | Execute$ DBForget
SVar:DBForget:DB$ Pump | Defined$ TriggeredCard | ForgetObjects$ TriggeredCard SVar:DBForget:DB$ Pump | ForgetObjects$ TriggeredCard
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
Oracle:Flying\nWhenever Nightveil Specter deals combat damage to a player, that player exiles the top card of their library.\nYou may play lands and cast spells from among cards exiled with Nightveil Specter. Oracle:Flying\nWhenever Nightveil Specter deals combat damage to a player, that player exiles the top card of their library.\nYou may play lands and cast spells from among cards exiled with Nightveil Specter.

View File

@@ -0,0 +1,14 @@
Name:Racketeer Boss
ManaCost:R G
Types:Creature Cat Warrior
PT:3/2
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChoose | TriggerDescription$ When CARDNAME enters the battlefield, you may choose 2 creature and/or planeswalker cards in your hand. They perpetually gain "When you cast this spell, create a Treasure token and this spell perpetually loses this ability."
SVar:TrigChoose:DB$ ChooseCard | ChoiceZone$ Hand | Choices$ Creature.YouOwn,Planeswalker.YouOwn | ChoiceTitle$ Choose up to two creature and/or planeswalker cards in your hand. | MinAmount$ 0 | Amount$ 2 | SubAbility$ DBEffect
SVar:DBEffect:DB$ Effect | RememberObjects$ ChosenCard | ForgetOnCast$ True | ConditionDefined$ ChosenCard | ConditionPresent$ Card | ConditionCompare$ GE1 | StaticAbilities$ PerpetualEffect | Name$ Racketeer Boss's Perpetual Effect | Duration$ Permanent | SubAbility$ DBCleanup
SVar:PerpetualEffect:Mode$ Continuous | Affected$ Card.IsRemembered | AddTrigger$ SpellCastTrig | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ When you cast this spell, create a Treasure token and this spell perpetually loses this ability.
SVar:SpellCastTrig:Mode$ SpellCast | ValidCard$ Card.Self | Execute$ TrigTreasure | TriggerDescription$ When you cast this spell, create a Treasure token and this spell perpetually loses this ability.
SVar:TrigTreasure:DB$ Token | TokenScript$ c_a_treasure_sac
SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True
DeckHints:Type$Planeswalker
DeckHas:Ability$Token|Sacrifice & Type$Treasure|Artifact
Oracle:When Racketeer Boss enters the battlefield, choose up to two creature and/or planeswalker cards in your hand. They perpetually gain "When you cast this spell, create a Treasure token and this spell perpetually loses this ability."

View File

@@ -4,7 +4,7 @@ Types:Creature Beast
PT:3/3 PT:3/3
K:Devour:3 K:Devour:3
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDmg | TriggerDescription$ When CARDNAME enters the battlefield, it deals X damage divided as you choose among up to X target creatures, where X is its power. Each of those creatures deals damage equal to its power to CARDNAME. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDmg | TriggerDescription$ When CARDNAME enters the battlefield, it deals X damage divided as you choose among up to X target creatures, where X is its power. Each of those creatures deals damage equal to its power to CARDNAME.
SVar:TrigDmg:DB$ DealDamage | ValidTgts$ Creature | TgtPrompt$ Select target creature to distribute damage to | NumDmg$ FirePower | TargetMin$ 0 | TargetMax$ FirePower | DividedAsYouChoose$ FirePower | SubAbility$ DBDmg | RememberTargets$ True | StackDescription$ None SVar:TrigDmg:DB$ DealDamage | ValidTgts$ Creature | TgtPrompt$ Select target creature to distribute damage to | NumDmg$ FirePower | TargetMin$ 0 | TargetMax$ FirePower | DividedAsYouChoose$ FirePower | SubAbility$ DBDmg | StackDescription$ None
SVar:DBDmg:DB$ RepeatEach | RepeatSubAbility$ GigantotheriumFight | UseImprinted$ True | DefinedCards$ Targeted | StackDescription$ None | DamageMap$ True SVar:DBDmg:DB$ RepeatEach | RepeatSubAbility$ GigantotheriumFight | UseImprinted$ True | DefinedCards$ Targeted | StackDescription$ None | DamageMap$ True
SVar:GigantotheriumFight:DB$ DealDamage | DamageSource$ Imprinted | NumDmg$ Y | Defined$ Self | StackDescription$ None SVar:GigantotheriumFight:DB$ DealDamage | DamageSource$ Imprinted | NumDmg$ Y | Defined$ Self | StackDescription$ None
SVar:FirePower:Count$CardPower SVar:FirePower:Count$CardPower

View File

@@ -6,7 +6,7 @@ T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefi
SVar:HistoricExile:DB$ ChangeZone | ValidTgts$ Card.Historic+YouOwn | TgtPrompt$ Select target historic card from your graveyard | Origin$ Graveyard | Destination$ Exile | RememberChanged$ True SVar:HistoricExile:DB$ ChangeZone | ValidTgts$ Card.Historic+YouOwn | TgtPrompt$ Select target historic card from your graveyard | Origin$ Graveyard | Destination$ Exile | RememberChanged$ True
S:Mode$ Continuous | MayPlay$ True | Affected$ Card.nonLand+IsRemembered+ExiledWithSource | AffectedZone$ Exile | Description$ You may play cards exiled with CARDNAME. S:Mode$ Continuous | MayPlay$ True | Affected$ Card.nonLand+IsRemembered+ExiledWithSource | AffectedZone$ Exile | Description$ You may play cards exiled with CARDNAME.
T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered+ExiledWithSource | Execute$ DBForget T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered+ExiledWithSource | Execute$ DBForget
SVar:DBForget:DB$ Pump | Defined$ TriggeredCard | ForgetObjects$ TriggeredCard SVar:DBForget:DB$ Pump | ForgetObjects$ TriggeredCard
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
A:AB$ Dig | Cost$ 4 T | Defined$ You | DigNum$ 1 | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | SpellDescription$ Exile the top card of your library. A:AB$ Dig | Cost$ 4 T | Defined$ You | DigNum$ 1 | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | SpellDescription$ Exile the top card of your library.

View File

@@ -8,7 +8,7 @@ SVar:DelTrigReturn:DB$ DelayedTrigger | Mode$ Phase | Phase$ End Of Turn | Execu
SVar:DBReturn:DB$ ChangeZone | Defined$ DelayTriggerRememberedLKI | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | RememberChanged$ True SVar:DBReturn:DB$ ChangeZone | Defined$ DelayTriggerRememberedLKI | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | RememberChanged$ True
#TODO make the sacrifice part as another delayed Trigger #TODO make the sacrifice part as another delayed Trigger
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered | Execute$ DBForget T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered | Execute$ DBForget
SVar:DBForget:DB$ Pump | Defined$ Card.Self | ForgetObjects$ TriggeredCard SVar:DBForget:DB$ Pump | ForgetObjects$ TriggeredCard
T:Mode$ ChangesController | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ Sacrifice | TriggerDescription$ Sacrifice the creature when you lose control of CARDNAME. T:Mode$ ChangesController | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ Sacrifice | TriggerDescription$ Sacrifice the creature when you lose control of CARDNAME.
SVar:Sacrifice:DB$ SacrificeAll | ValidCards$ Card.IsRemembered | Controller$ You | SubAbility$ DBCleanup SVar:Sacrifice:DB$ SacrificeAll | ValidCards$ Card.IsRemembered | Controller$ You | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True

View File

@@ -6,7 +6,7 @@ SVar:TrigExile:DB$ Dig | Defined$ You | DestinationZone$ Exile | DigNum$ 1 | Cha
S:Mode$ Continuous | Affected$ Card.IsRemembered | AffectedZone$ Exile | MayPlay$ True | Condition$ PlayerTurn | CheckSVar$ X | Description$ During your turn, if an opponent lost life this turn, you may play lands and cast spells from among cards exiled with CARDNAME. S:Mode$ Continuous | Affected$ Card.IsRemembered | AffectedZone$ Exile | MayPlay$ True | Condition$ PlayerTurn | CheckSVar$ X | Description$ During your turn, if an opponent lost life this turn, you may play lands and cast spells from among cards exiled with CARDNAME.
SVar:X:Count$LifeOppsLostThisTurn SVar:X:Count$LifeOppsLostThisTurn
T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered | Execute$ DBForget T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered | Execute$ DBForget
SVar:DBForget:DB$ Pump | Defined$ TriggeredCard | ForgetObjects$ TriggeredCard SVar:DBForget:DB$ Pump | ForgetObjects$ TriggeredCard
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
A:AB$ DealDamage | Cost$ 3 R | ValidTgts$ Opponent,Planeswalker | TgtPrompt$ Select target opponent or planeswalker | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target opponent or planeswalker. A:AB$ DealDamage | Cost$ 3 R | ValidTgts$ Opponent,Planeswalker | TgtPrompt$ Select target opponent or planeswalker | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target opponent or planeswalker.

View File

@@ -0,0 +1,10 @@
Name:Academy Loremaster
ManaCost:U U
Types:Creature Human Wizard
PT:2/3
T:Mode$ Phase | Phase$ Draw | ValidPlayer$ Player | TriggerZones$ Battlefield | OptionalDecider$ TriggeredPlayer | Execute$ TrigDraw | TriggerDescription$ At the beginning of each player's draw step, that player may draw an additional card. If they do, spells they cast this turn cost {2} more to cast
SVar:TrigDraw:DB$ Draw | NumCards$ 1 | Defined$ TriggeredPlayer | RememberDrawn$ True | SubAbility$ DBEffect
SVar:DBEffect:DB$ Effect | ConditionDefined$ Remembered | ConditionPresent$ Card | Duration$ EndOfTurn | StaticAbilities$ RaiseCost | SubAbility$ DBCleanup | SpellDescription$ Spells they cast this turn cost {2} more to cast
SVar:RaiseCost:Mode$ RaiseCost | ValidCard$ Card.ActivePlayerCtrl | Type$ Spell | Amount$ 2 | Description$ Spells they cast this turn cost {2} more to cast
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
Oracle:At the beginning of each player's draw step, that player may draw an additional card. If they do, spells they cast this turn cost {2} more to cast

View File

@@ -0,0 +1,8 @@
Name:Academy Wall
ManaCost:2 U
Types:Creature Wall
PT:0/5
K:Defender
T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | OptionalDecider$ You | Execute$ TrigLoot | ActivationLimit$ 1 | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast an instant or sorcery spell, you may draw a card. If you do, discard a card. This ability triggers only once each turn.
SVar:TrigLoot:AB$ Discard | Defined$ You | Mode$ TgtChoose | Cost$ Draw<1/You>
Oracle:Defender\nWhenever you cast an instant or sorcery spell, you may draw a card. If you do, discard a card. This ability triggers only once each turn.

View File

@@ -0,0 +1,8 @@
Name:Activated Sleeper
ManaCost:2 B
Types:Creature Phyrexian Shapeshifter
PT:0/0
K:Flash
K:ETBReplacement:Copy:DBCopy:Optional
SVar:DBCopy:DB$ Clone | Choices$ Creature.ThisTurnEnteredFrom_Battlefield | ChoiceZone$ Graveyard | AddTypes$ Phyrexian | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature card in a graveyard that was put there from the battlefield this turn, except it's a Phyrexian in addition to its other types.
Oracle:You may have Activated Sleeper enter the battlefield as a copy of any creature card in a graveyard that was put there from the battlefield this turn, except it's a Phyrexian in addition to its other types.

View File

@@ -0,0 +1,7 @@
Name:Aggressive Sabotage
ManaCost:2 B
Types:Sorcery
K:Kicker:R
A:SP$ Discard | ValidTgts$ Opponent | Mode$ TgtChoose | NumCards$ 2 | SubAbility$ DBDealDamage | SpellDescription$ Target opponent discards two cards, if this spell was kicked, it deals 3 damage to that player.
SVar:DBDealDamage:DB$ DealDamage | Defined$ ParentTarget | Condition$ Kicked | NumDmg$ 3
Oracle:Kicker {R} (You may pay an additional {R} as you cast this spell.)\nTarget player discards two cards. If this spell was kicked, it deals 3 damage to that player.

View File

@@ -0,0 +1,86 @@
Name:Alora, Rogue Companion
ManaCost:3 U
Types:Legendary Creature Halfling Rogue
PT:3/3
K:Specialize:2
T:Mode$ AttackersDeclared | AttackingPlayer$ You | Execute$ TrigPump | TriggerZones$ Battlefield | TriggerDescription$ Whenever you attack, up to one target attacking creature can't be blocked this turn. At the beginning of the next end step, return that creature to its owner's hand.
SVar:TrigPump:DB$ Pump | KW$ HIDDEN Unblockable | TgtPrompt$ Select target attacking creature | ValidTgts$ Creature.attacking | TargetMin$ 0 | TargetMax$ 1 | SubAbility$ DBDelTrig
SVar:DBDelTrig:DB$ DelayedTrigger | ConditionDefined$ Targeted | ConditionPresent$ Card | Mode$ Phase | Phase$ End of Turn | RememberObjects$ Targeted | Execute$ TrigReturn | TriggerDescription$ At the beginning of the next end step, return that creature to its owner's hand.
SVar:TrigReturn:DB$ ChangeZone | Defined$ DelayTriggerRememberedLKI | Origin$ Battlefield | Destination$ Hand
AlternateMode:Specialize
Oracle:Specialize {2}\nWhenever you attack, up to one target attacking creature can't be blocked this turn. At the beginning of the next end step, return that creature to its owner's hand.
SPECIALIZE:WHITE
Name:Alora, Cheerful Mastermind
ManaCost:3 W U
Types:Legendary Creature Halfling Rogue
PT:4/4
T:Mode$ AttackersDeclared | AttackingPlayer$ You | Execute$ TrigPump | TriggerZones$ Battlefield | TriggerDescription$ Whenever you attack, up to one target attacking creature can't be blocked this turn. At the beginning of the next end step, return that creature to its owner's hand. If you do, create a 1/1 white Soldier creature token.
SVar:TrigPump:DB$ Pump | KW$ HIDDEN Unblockable | TgtPrompt$ Select target attacking creature | ValidTgts$ Creature.attacking | TargetMin$ 0 | TargetMax$ 1 | SubAbility$ DBDelTrig
SVar:DBDelTrig:DB$ DelayedTrigger | ConditionDefined$ Targeted | ConditionPresent$ Card | Mode$ Phase | Phase$ End of Turn | RememberObjects$ Targeted | Execute$ TrigReturn | TriggerDescription$ At the beginning of the next end step, return that creature to its owner's hand. If you do, create a 1/1 white Soldier creature token.
SVar:TrigReturn:DB$ ChangeZone | Defined$ DelayTriggerRememberedLKI | Origin$ Battlefield | Destination$ Hand | ForgetOtherRemembered$ True | RememberChanged$ True | SubAbility$ DBToken
SVar:DBToken:DB$ Token | TokenScript$ w_1_1_soldier | ConditionDefined$ Remembered | ConditionPresent$ Card | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
DeckHas:Ability$Token & Type$Soldier
Oracle:Whenever you attack, up to one target attacking creature can't be blocked this turn. At the beginning of the next end step, return that creature to its owner's hand. If you do, create a 1/1 white Soldier creature token.
SPECIALIZE:BLUE
Name:Alora, Cheerful Thief
ManaCost:3 U U
Types:Legendary Creature Halfling Rogue
PT:4/4
T:Mode$ AttackersDeclared | AttackingPlayer$ You | Execute$ TrigPump | TriggerZones$ Battlefield | TriggerDescription$ Whenever you attack, up to one target attacking creature can't be blocked this turn. At the beginning of the next end step, return that creature to its owner's hand. If you do, a creature of your choice an opponent controls perpetually gets -1/-0.
SVar:TrigPump:DB$ Pump | KW$ HIDDEN Unblockable | TgtPrompt$ Select target attacking creature | ValidTgts$ Creature.attacking | TargetMin$ 0 | TargetMax$ 1 | SubAbility$ DBDelTrig
SVar:DBDelTrig:DB$ DelayedTrigger | ConditionDefined$ Targeted | ConditionPresent$ Card | Mode$ Phase | Phase$ End of Turn | RememberObjects$ Targeted | Execute$ TrigReturn | TriggerDescription$ At the beginning of the next end step, return that creature to its owner's hand. If you do, a creature of your choice an opponent controls perpetually gets -1/-0.
SVar:TrigReturn:DB$ ChangeZone | Defined$ DelayTriggerRememberedLKI | Origin$ Battlefield | Destination$ Hand | ForgetOtherRemembered$ True | RememberChanged$ True | SubAbility$ DBChooseCard
SVar:DBChooseCard:DB$ ChooseCard | ConditionDefined$ Remembered | ConditionPresent$ Card | Choices$ Creature.OppCtrl | Mandatory$ True | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | SubAbility$ DBPerpetual
SVar:DBPerpetual:DB$ Effect | ConditionDefined$ ChosenCard | ConditionPresent$ Card | StaticAbilities$ PerpetualDebuff | Name$ Alora, Cheerful Thief's Perpetual Effect | Duration$ Permanent | SubAbility$ DBClearChosen
SVar:PerpetualDebuff:Mode$ Continuous | Affected$ Card.ChosenCard | AddPower$ -1 | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ The chosen creature perpetually gets -1/-0.
SVar:DBClearChosen:DB$ Cleanup | ClearChosenCard$ True
Oracle:Whenever you attack, up to one target attacking creature can't be blocked this turn. At the beginning of the next end step, return that creature to its owner's hand. If you do, a creature of your choice an opponent controls perpetually gets -1/-0.
SPECIALIZE:BLACK
Name:Alora, Cheerful Assassin
ManaCost:3 U B
Types:Legendary Creature Halfling Rogue Assassin
PT:4/4
T:Mode$ AttackersDeclared | AttackingPlayer$ You | Execute$ TrigPump | TriggerZones$ Battlefield | TriggerDescription$ Whenever you attack, up to one target attacking creature can't be blocked this turn. At the beginning of the next end step, return that creature to its owner's hand. If you do, each opponent loses 2 life.
SVar:TrigPump:DB$ Pump | KW$ HIDDEN Unblockable | TgtPrompt$ Select target attacking creature | ValidTgts$ Creature.attacking | TargetMin$ 0 | TargetMax$ 1 | SubAbility$ DBDelTrig
SVar:DBDelTrig:DB$ DelayedTrigger | ConditionDefined$ Targeted | ConditionPresent$ Card | Mode$ Phase | Phase$ End of Turn | RememberObjects$ Targeted | Execute$ TrigReturn | TriggerDescription$ At the beginning of the next end step, return that creature to its owner's hand. If you do, each opponent loses 2 life.
SVar:TrigReturn:DB$ ChangeZone | Defined$ DelayTriggerRememberedLKI | Origin$ Battlefield | Destination$ Hand | ForgetOtherRemembered$ True | RememberChanged$ True | SubAbility$ DBDrain
SVar:DBDrain:DB$ LoseLife | Defined$ Opponent | LifeAmount$ 2 | ConditionDefined$ Remembered | ConditionPresent$ Card
Oracle:Whenever you attack, up to one target attacking creature can't be blocked this turn. At the beginning of the next end step, return that creature to its owner's hand. If you do, each opponent loses 2 life.
SPECIALIZE:RED
Name:Alora, Cheerful Swashbuckler
ManaCost:3 U R
Types:Legendary Creature Halfling Rogue
PT:4/4
T:Mode$ AttackersDeclared | AttackingPlayer$ You | Execute$ TrigPump | TriggerZones$ Battlefield | TriggerDescription$ Whenever you attack, up to one target attacking creature can't be blocked this turn. At the beginning of the next end step, return that creature to its owner's hand. If you do, create a Treasure token.
SVar:TrigPump:DB$ Pump | KW$ HIDDEN Unblockable | TgtPrompt$ Select target attacking creature | ValidTgts$ Creature.attacking | TargetMin$ 0 | TargetMax$ 1 | SubAbility$ DBDelTrig
SVar:DBDelTrig:DB$ DelayedTrigger | ConditionDefined$ Targeted | ConditionPresent$ Card | Mode$ Phase | Phase$ End of Turn | RememberObjects$ Targeted | Execute$ TrigReturn | TriggerDescription$ At the beginning of the next end step, return that creature to its owner's hand. If you do, create a Treasure token.
SVar:TrigReturn:DB$ ChangeZone | Defined$ DelayTriggerRememberedLKI | Origin$ Battlefield | Destination$ Hand | ForgetOtherRemembered$ True | RememberChanged$ True | SubAbility$ DBTreasure
SVar:DBTreasure:DB$ Token | TokenScript$ c_a_treasure_sac | ConditionDefined$ Remembered | ConditionPresent$ Card | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
DeckHas:Ability$Token|Sacrifice & Type$Artifact|Treasure
Oracle:Whenever you attack, up to one target attacking creature can't be blocked this turn. At the beginning of the next end step, return that creature to its owner's hand. If you do, create a Treasure token.
SPECIALIZE:GREEN
Name:Alora, Cheerful Scout
ManaCost:3 G U
Types:Legendary Creature Halfling Rogue Scout
PT:4/4
T:Mode$ AttackersDeclared | AttackingPlayer$ You | Execute$ TrigPump | TriggerZones$ Battlefield | TriggerDescription$ Whenever you attack, up to one target attacking creature can't be blocked this turn. At the beginning of the next end step, return that creature to its owner's hand. If you do, it perpetually gets +1/+1.
SVar:TrigPump:DB$ Pump | KW$ HIDDEN Unblockable | TgtPrompt$ Select target attacking creature | ValidTgts$ Creature.attacking | TargetMin$ 0 | TargetMax$ 1 | SubAbility$ DBDelTrig
SVar:DBDelTrig:DB$ DelayedTrigger | ConditionDefined$ Targeted | ConditionPresent$ Card | Mode$ Phase | Phase$ End of Turn | RememberObjects$ Targeted | Execute$ TrigReturn | TriggerDescription$ At the beginning of the next end step, return that creature to its owner's hand. If you do, it perpetually gets +1/+1.
SVar:TrigReturn:DB$ ChangeZone | Defined$ DelayTriggerRememberedLKI | Origin$ Battlefield | Destination$ Hand | ForgetOtherRemembered$ True | RememberChanged$ True | SubAbility$ DBPerpetual
SVar:DBPerpetual:DB$ Effect | ConditionDefined$ Remembered | ConditionPresent$ Card | RememberObjects$ Remembered | StaticAbilities$ PerpetualP1P1 | Name$ Alora, Cheerful Scout's Perpetual Effect | Duration$ Permanent | SubAbility$ DBCleanup
SVar:PerpetualP1P1:Mode$ Continuous | Affected$ Card.IsRemembered | AddPower$ 1 | AddToughness$ 1 | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ That creature perpetually gets +1/+1.
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
Oracle:Whenever you attack, up to one target attacking creature can't be blocked this turn. At the beginning of the next end step, return that creature to its owner's hand. If you do, it perpetually gets +1/+1.

View File

@@ -0,0 +1,14 @@
Name:Anointed Peacekeeper
ManaCost:2 W
Types:Creature Human Cleric
PT:3/3
K:Vigilance
K:ETBReplacement:Other:ChoosePlayer
SVar:ChoosePlayer:DB$ ChoosePlayer | Defined$ You | Choices$ Player.Opponent | ChoiceTitle$ Choose an opponent to look at the hand: | SubAbility$ DBLook | SpellDescription$ As CARDNAME enters the battlefield, look at an opponent's hand, then choose any card name.
SVar:DBLook:DB$ RevealHand | Defined$ ChosenPlayer | Look$ True | SubAbility$ DBNameCard
SVar:DBNameCard:DB$ NameCard | Defined$ You | SubAbility$ DBClear
SVar:DBClear:DB$ Cleanup | ClearChosenPlayer$ True
S:Mode$ RaiseCost | EffectZone$ Battlefield | ValidCard$ Card.NamedCard | Type$ Spell | Amount$ 2 | Activator$ Opponent | Description$ Spells your opponents cast with the chosen name cost {2} more to cast.
S:Mode$ RaiseCost | EffectZone$ Battlefield | ValidCard$ Card.NamedCard | Type$ NonManaAbility | Amount$ 2 | Description$ Activated abilities of sources with the chosen name cost {2} more to activate unless they're mana abilities.
AI:RemoveDeck:Random
Oracle:Vigilance\nAs Anointed Peacekeeper enters the battlefield, look at an opponent's hand, then choose any card name.\nSpells your opponents cast with the chosen name cost {2} more to cast.\nActivated abilities of sources with the chosen name cost {2} more to activate unless they're mana abilities.

View File

@@ -0,0 +1,11 @@
Name:Arcane Archery
ManaCost:2 G
Types:Instant
A:SP$ Pump | ValidTgts$ Creature | NumAtt$ 3 | NumDef$ 3 | KW$ Reach,Trample | SubAbility$ DBDelayedTrigger | SpellDescription$ Target creature gets +3/+3 and gains reach and trample until end of turn. You get a boon with "When you cast your next creature spell, that creature enters the battlefield with an additional +1/+1 counter, reach counter, and trample counter on it."
SVar:DBDelayedTrigger:DB$ DelayedTrigger | Execute$ TrigAddAPI | Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ You
SVar:TrigAddAPI:DB$ Effect | RememberObjects$ TriggeredCard | ForgetOnMoved$ Stack | ReplacementEffects$ ReplaceEnter
SVar:ReplaceEnter:Event$ Moved | ValidCard$ Card.IsRemembered | Destination$ Battlefield | ReplaceWith$ AddExtraCounter | ReplacementResult$ Updated | Description$ This creature enters the battlefield with an additional +1/+1 counter, reach counter, and trample counter on it.
SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterTypes$ P1P1,Trample,Reach | CounterNum$ 1 | SubAbility$ DBExile
SVar:DBExile:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile
DeckHas:Ability$Counters
Oracle:Target creature gets +3/+3 and gains reach and trample until end of turn.\nYou get a boon with "When you cast your next creature spell, that creature enters the battlefield with an additional +1/+1 counter, reach counter, and trample counter on it."

View File

@@ -0,0 +1,8 @@
Name:Argivian Phalanx
ManaCost:5 W
Types:Creature Human Kor Soldier
PT:4/4
K:Vigilance
S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ This spell costs {1} less to cast for each creature you control.
SVar:X:Count$Valid Creature.YouCtrl
Oracle:This spell costs {1} less to cast for each creature you control.\nVigilance

View File

@@ -0,0 +1,7 @@
Name:Automatic Librarian
ManaCost:3
Types:Artifact Creature Construct
PT:3/2
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigScry | TriggerDescription$ When CARDNAME enters the battlefield, scry 2. (Look at the top two cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.)
SVar:TrigScry:DB$ Scry | ScryNum$ 2
Oracle:When Automatic Librarian enters the battlefield, scry 2. (Look at the top two cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.)

View File

@@ -0,0 +1,11 @@
Name:Balduvian Atrocity
ManaCost:2 B
Types:Creature Phyrexian Berserker
PT:2/3
K:Kicker:R
K:Menace
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, return target creature card with mana value 3 or less from your graveyard to the battlefield. It gains haste. Sacrifice it at the beginning of the next end step.
SVar:TrigChange:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouCtrl+cmcLE3 | SubAbility$ DBPump
SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ Haste | AtEOT$ Sacrifice
DeckHints:Ability$Graveyard
Oracle:Kicker {R} (You may pay an additional {R} as you cast this spell.)\nMenace\nWhen Balduvian Atrocity enters the battlefield, if it was kicked, return target creature card with mana value 3 or less from your graveyard to the battlefield. It gains haste. Sacrifice it at the beginning of the next end step.

View File

@@ -0,0 +1,10 @@
Name:Baru, Wurmspeaker
ManaCost:2 G G
Types:Legendary Creature Human Druid
PT:3/3
S:Mode$ Continuous | Affected$ Wurm.YouCtrl | AddPower$ 2 | AddToughness$ 2 | AddKeyword$ Trample | Description$ Wurms you control get +2/+2 and have trample.
A:AB$ Token | Cost$ 7 G T | ReduceCost$ X | TokenScript$ g_4_4_wurm | TokenOwner$ You | SpellDescription$ Create a 4/4 green Wurm creature token. This ability costs {X} less to activate, where X is the greatest power among Wurms you control
SVar:X:Count$GreatestPower_Wurm.YouCtrl
DeckHas:Ability$Token & Type$Wurm
DeckHints:Type$Wurm
Oracle:Wurms you control get +2/+2 and have trample.\n{7}{G}, {T}: Create a 4/4 green Wurm creature token. This ability costs {X} less to activate, where X is the greatest power among Wurms you control

View File

@@ -0,0 +1,11 @@
Name:Battlewing Mystic
ManaCost:1 U
Types:Bird Wizard
PT:2/1
K:Kicker:R
K:Flying
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, discard your hand, then draw two cards.
SVar:TrigDiscard:DB$ Discard | Mode$ Hand | Defined$ You | SubAbility$ DBDraw
SVar:DBDraw:DB$ Draw | Condition$ Kicked | Defined$ You | NumCards$ 2
DeckHints:Ability$Discard
Oracle:Kicker {R} (You may pay an additional {R} as you cast this spell.)\nFlying\nWhen Battlewing Mystic enters the battlefield, if it was kicked, discard your hand, then draw two cards.

View File

@@ -0,0 +1,9 @@
Name:Benalish Sleeper
ManaCost:1 W
Types:Creature Phyrexian Human Soldier
PT:3/1
K:Kicker:B
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigSac | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, each player sacrifices a creature.
SVar:TrigSac:DB$ Sacrifice | Defined$ Player | SacValid$ Creature
SVar:NeedsToPlay:Creature.OppCtrl
Oracle:Kicker {B} (You may pay an additional {B} as you cast this spell.)\nWhen Benalish Sleeper enters the battlefield, if it was kicked, each player sacrifices a creature.

View File

@@ -0,0 +1,12 @@
Name:Bladewing, Deathless Tyrant
ManaCost:5 B R
Types:Legendary Creature Dragon Skeleton
PT:6/6
K:Flying
K:Haste
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player,Planeswalker | CombatDamage$ True | Execute$ TrigToken | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player or planeswalker, for each creature card in your graveyard, create a 2/2 black Zombie Knight creature token with menace.
SVar:TrigToken:DB$ Token | TokenScript$ b_2_2_zombie_knight_menace | TokenAmount$ X | TokenOwner$ You
SVar:X:Count$TypeInYourYard.Creature
DeckHas:Ability$Token & Type$Zombie|Knight
DeckHints:Ability$Graveyard
Oracle:Flying, haste\nWhenever Bladewing, Deathless Tyrant deals combat damage to a player or planeswalker, for each creature card in your graveyard, create a 2/2 black Zombie Knight creature token with menace.

View File

@@ -0,0 +1,9 @@
Name:Blight Pile
ManaCost:1 B
Types:Creature Phyrexian
K:Defender
PT:3/3
A:AB$ LoseLife | Cost$ T 2 B | Defined$ Player.Opponent | LifeAmount$ X | SpellDescription$ Each opponent loses X life, where X is the number of creatures with defender you control.
SVar:X:Count$Valid Creature.withDefender+YouCtrl
DeckHints:Keyword$Defender
Oracle:Defender\n{2}{B}, {T}: Each opponent loses X life, where X is the number of creatures with defender you control.

View File

@@ -0,0 +1,10 @@
Name:Bog Badger
ManaCost:2 G
Types:Creature Badger
PT:3/3
K:Kicker:B
K:Flash
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, creatures you control gain menace until end of turn. (A creature with menace can't be blocked except by two or more creatures.)
SVar:TrigPump:DB$ PumpAll | ValidCards$ Creature.YouCtrl | KW$ Menace
DeckHas:Keyword$Menace
Oracle:Kicker {B} (You may pay an additional {B} as you cast this spell.)\nWhen Bog Badger enters the battlefield, if it was kicked, creatures you control gain menace until end of turn. (A creature with menace can't be blocked except by two or more creatures.)

View File

@@ -0,0 +1,12 @@
Name:Bortuk Bonerattle
ManaCost:4 B G
Types:Legendary Creature Troll Shaman
PT:4/4
T:Mode$ ChangesZone | ValidCard$ Card.wasCastByYou+Self | Destination$ Battlefield | Execute$ TrigChangeZone | TriggerDescription$ Domain — When CARDNAME enters the battlefield, if you cast it, choose target creature card in your graveyard. Return that card to the battlefield if its mana value is less than or equal to the number of basic land types among lands you control. Otherwise, put it into your hand.
SVar:TrigChangeZone:DB$ ChangeZone | ValidTgts$ Creature.YouOwn | Origin$ Graveyard | Destination$ Battlefield | ConditionDefined$ Targeted | ConditionPresent$ Card.cmcLEX | SubAbility$ DBChangeZone
SVar:DBChangeZone:DB$ ChangeZone | Defined$ Targeted | Origin$ Graveyard | Destination$ Hand | ConditionDefined$ Targeted | ConditionPresent$ Card.cmcGTX
SVar:X:Count$Domain
SVar:BuffedBy:Plains,Island,Swamp,Mountain,Forest
RemoveDeck:Random
DeckHas:Ability$Graveyard
Oracle:Domain — When Bortuk Bonerattle enters the battlefield, if you cast it, choose target creature card in your graveyard. Return that card to the battlefield if its mana value is less than or equal to the number of basic land types among lands you control. Otherwise, put it into your hand.

View File

@@ -0,0 +1,11 @@
Name:Briar Hydra
ManaCost:5 G
Types:Creature Plant Hydra
PT:6/6
K:Trample
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ DBCounter | TriggerZones$ Battlefield | TriggerDescription$ Domain — Whenever CARDNAME deals combat damage to a player, put X +1/+1 counters on target creature you control, where X is the number of basic land types among lands you control.
SVar:DBCounter:DB$ PutCounter | CounterNum$ X | CounterType$ P1P1 | ValidTgts$ Creature.YouCtrl
SVar:X:Count$Domain
DeckHas:Ability$Counters
AI:RemoveDeck:Random (
Oracle:Trample\nDomain — Whenever Briar Hydra deals combat damage to a player, put X +1/+1 counters on target creature you control, where X is the number of basic land types among lands you control.

View File

@@ -0,0 +1,11 @@
Name:Cadric, Soul Kindler
ManaCost:2 R W
Types:Legendary Creature Dwarf Wizard
PT:4/3
S:Mode$ IgnoreLegendRule | ValidCard$ Permanent.token+YouCtrl | Description$ The "legend rule" doesn't apply to tokens you control.
T:Mode$ ChangesZone | ValidCard$ Permanent.nonToken+Legendary+Other+YouCtrl | Origin$ Any | Destination$ Battlefield | TriggerZones$ Battlefield | Execute$ TrigCopy | TriggerDescription$ Whenever another nontoken legendary permanent enters the battlefield under your control, you may pay {1}. If you do, create a token that's a copy of it. That token gains haste. Sacrifice it at the beginning of the next end step.
SVar:TrigCopy:AB$ CopyPermanent | Cost$ 1 | Defined$ TriggeredCard | PumpKeywords$ Haste | AtEOT$ Sacrifice
SVar:BuffedBy:Legendary
DeckHas:Ability$Token
DeckNeeds:Type$Legendary
Oracle:The "legend rule" doesn't apply to tokens you control.\nWhenever another nontoken legendary permanent enters the battlefield under your control, you may pay {1}. If you do, create a token that's a copy of it. That token gains haste. Sacrifice it at the beginning of the next end step.

View File

@@ -0,0 +1,6 @@
Name:Charismatic Vanguard
ManaCost:2 W
Types:Creature Dwarf Soldier
PT:3/2
A:AB$ PumpAll | Cost$ 4 W | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Creatures you control get +1/+1 until end of turn.
Oracle:{4}{W}: Creatures you control get +1/+1 until end of turn.

View File

@@ -0,0 +1,7 @@
Name:Citizen's Arrest
ManaCost:1 W W
Types:Enchantment
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | SpellDescription$ When CARDNAME enters the battlefield, exile target creature or planeswalker an opponent controls until CARDNAME leaves the battlefield.
SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.OppCtrl,Planeswalker.OppCtrl | Duration$ UntilHostLeavesPlay
SVar:PlayMain1:TRUE
Oracle:When Citizen's Arrest enters the battlefield, exile target creature or planeswalker an opponent controls until Citizen's Arrest leaves the battlefield.

View File

@@ -0,0 +1,12 @@
Name:Cleaving Skyrider
ManaCost:2 W
Types:Creature Human Warrior
PT:2/2
K:Flash
K:Kicker:2 R
K:Flying
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigDamage | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, it deals X damage to any target, where X is the number of attacking creatures.
SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X
SVar:X:Count$Valid Creature.attacking
SVar:BuffedBy:Creature.attacking
Oracle:Flash\nKicker {2}{R} (You may pay an additional {2}{R} as you cast this spell.)\nFlying\nWhen Cleaving Skyrider enters the battlefield, if it was kicked, it deals X damage to any target, where X is the number of attacking creatures.

View File

@@ -0,0 +1,7 @@
Name:Colossal Growth
ManaCost:1 G
Types:Instant
K:Kicker:R
A:SP$ Pump | ValidTgts$ Creature | NumAtt$ +3 | NumDef$ +3 | SubAbility$ PumpKicked | SpellDescription$ Target creature gets +3/+3 until end of turn.
SVar:PumpKicked:DB$ Pump | Defined$ Targeted | Condition$ Kicked | KW$ Haste & Trample | NumAtt$ +1 | NumDef$ +1
Oracle:Kicker {R} (You may pay an additional {R} as you cast this spell.)\nTarget creature gets +3/+3 until end of turn. If this spell was kicked, instead that creature gets +4/+4 and gains trample and haste until end of turn.

View File

@@ -0,0 +1,5 @@
Name:Contaminated Aquifer
ManaCost:no cost
Types:Land Island Swamp
K:CARDNAME enters the battlefield tapped.
Oracle:({T}: Add {U} or {B}.)\nContaminated Aquifer enters the battlefield tapped.

View File

@@ -0,0 +1,8 @@
Name:Cosmic Epiphany
ManaCost:4 U U
Types:Sorcery
A:SP$ Draw | NumCards$ X | SpellDescription$ Draw cards equal to the number of instant and sorcery cards in your graveyard.
SVar:X:Count$ValidGraveyard Instant.YouOwn,Sorcery.YouOwn
DeckNeeds:Type$Instant|Sorcery
DeckHas:Ability$Graveyard
Oracle:Draw cards equal to the number of instant and sorcery cards in your graveyard.

View File

@@ -0,0 +1,11 @@
Name:Emperor Mihail II
ManaCost:1 U U
Types:Legendary Creature Merfolk Noble
PT:3/3
S:Mode$ Continuous | Affected$ Card.TopLibrary+YouCtrl | AffectedZone$ Library | MayLookAt$ You | Description$ You may look at the top card of your library any time.
S:Mode$ Continuous | Affected$ Merfolk.TopLibrary+YouCtrl | AffectedZone$ Library | MayPlay$ True | Description$ You may play Merfolk spells from the top of your library.
T:Mode$ SpellCast | ValidCard$ Merfolk | ValidActivatingPlayer$ You | Execute$ TrigToken | OptionalDecider$ You | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a Merfolk spell, you may pay {1}. If you do, create a 1/1 blue Merfolk creature token.
SVar:TrigToken:AB$ Token | Cost$ 1 | TokenScript$ u_1_1_merfolk | TokenOwner$ You | SpellDescription$ Create a 1/1 blue Merfolk creature token.
DeckHas:Ability$Token
DeckHints:Type$Merfolk
Oracle:You may look at the top card of your library any time.\nYou may cast Merfolk spells from the top of your library.\nWhenever you cast a Merfolk spell, you may pay {1}. If you do, create a 1/1 blue Merfolk creature token.

View File

@@ -0,0 +1,5 @@
Name:Geothermal Bog
ManaCost:no cost
Types:Land Swamp Mountain
K:CARDNAME enters the battlefield tapped.
Oracle:({T}: Add {B} or {R}.)\nGeothermal Bog enters the battlefield tapped.

View File

@@ -0,0 +1,7 @@
Name:Gerrard's Hourglass Pendant
ManaCost:1
Types:Legendary Artifact
K:Flash
R:Event$ BeginTurn | ActiveZones$ Battlefield | ExtraTurn$ True | Skip$ True | Description$ If a player would begin an extra turn, that player skips that turn instead.
A:AB$ ChangeZone | Cost$ 4 T Exile<1/CARDNAME> | Origin$ Graveyard | Destination$ Battlefield | Defined$ ValidGraveyard Artifact.YouOwn+ThisTurnEnteredFrom_Battlefield,Creature.YouOwn+ThisTurnEnteredFrom_Battlefield,Land.YouOwn+ThisTurnEnteredFrom_Battlefield,Enchantment.YouOwn+ThisTurnEnteredFrom_Battlefield | Tapped$ True | SpellDescription$ Return to the battlefield tapped all artifact, creature, enchantment, and land cards in your graveyard that were put there from the battlefield this turn.
Oracle:Flash\nIf a player would begin an extra turn, that player skips that turn instead.\n{4}, {T}, Exile Gerrard's Hourglass Pendant: Return to the battlefield tapped all artifact, creature, enchantment, and land cards in your graveyard that were put there from the battlefield this turn.

View File

@@ -0,0 +1,12 @@
Name:Greensleeves, Maro-Sorcerer
ManaCost:3 G G
Types:Legendary Creature Elemental
PT:*/*
K:Protection:Planeswalker,Wizards:Protection from planeswalkers and Wizards
S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | SetToughness$ X | Description$ CARDNAME's power and toughness are each equal to the number of lands you control.
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever a land enters the battlefield under your control, create a 3/3 green Badger creature token.
SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ g_3_3_badger | TokenOwner$ You
SVar:X:Count$Valid Land.YouCtrl
DeckHas:Ability$Token & Type$Badger
Oracle:Protection from planeswalkers and from Wizards\nGreensleeves, Maro-Sorcerers power and toughness are each equal to the number of lands you control.\nWhenever a land enters the battlefield under your control, create a 3/3 green Badger creature token.

View File

@@ -0,0 +1,5 @@
Name:Haunted Mire
ManaCost:no cost
Types:Land Swamp Forest
K:CARDNAME enters the battlefield tapped.
Oracle:({T}: Add {B} or {G}.)\nHaunted Mire enters the battlefield tapped.

View File

@@ -4,7 +4,7 @@ Types:Legendary Creature Human Warrior
PT:3/3 PT:3/3
K:Desertwalk K:Desertwalk
S:Mode$ Continuous | Affected$ Desert.YouOwn | MayPlay$ True | AffectedZone$ Graveyard | Description$ You may play Desert lands from your graveyard S:Mode$ Continuous | Affected$ Desert.YouOwn | MayPlay$ True | AffectedZone$ Graveyard | Description$ You may play Desert lands from your graveyard
T:Mode$ ChangesZone | ValidCard$ Desert.YouCtrl | Origin$ Any | Destination$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever a Desert enters the battlefield under your control, create two 1/1 red, green, and white Sand Warrior creature tokens. T:Mode$ ChangesZone | ValidCard$ Desert.YouCtrl | Origin$ Any | Destination$ Battlefield | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever a Desert enters the battlefield under your control, create two 1/1 red, green, and white Sand Warrior creature tokens.
SVar:TrigToken:DB$ Token | TokenAmount$ 2 | TokenScript$ rgw_1_1_sand_warrior | TokenOwner$ You SVar:TrigToken:DB$ Token | TokenAmount$ 2 | TokenScript$ rgw_1_1_sand_warrior | TokenOwner$ You
DeckHas:Ability$Token DeckHas:Ability$Token
DeckHints:Type$Desert DeckHints:Type$Desert

View File

@@ -0,0 +1,10 @@
Name:Historian's Boon
ManaCost:3 W
Types:Enchantment
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self,Enchantment.nonToken+Other+YouCtrl | Execute$ TrigSmallToken | TriggerDescription$ Whenever CARDNAME or another nontoken enchantment enters the battlefield under your control, create a 1/1 white Soldier creature token.
SVar:TrigSmallToken:DB$ Token | TokenAmount$ 1 | TokenScript$ w_1_1_soldier | TokenOwner$ You
T:Mode$ AbilityTriggered | ValidMode$ CounterAdded | ValidSpellAbility$ Triggered.LastChapter | TriggerZones$ Battlefield | Execute$ TrigBigToken | TriggerDescription$ Whenever the final chapter of a Saga you control triggers, create a 4/4 white Angel creature token with flying and vigilance.
SVar:TrigBigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ w_4_4_angel_flying_vigilance | TokenOwner$ You
DeckHas:Ability$Token
DeckHints:Type$Enchantment|Saga
Oracle:Whenever Historians Boon or another nontoken enchantment enters the battlefield under your control, create a 1/1 white Soldier creature token.\nWhenever the final chapter of a Saga you control triggers, create a 4/4 white Angel creature token with flying and vigilance.

View File

@@ -0,0 +1,5 @@
Name:Idyllic Beachfront
ManaCost:no cost
Types:Land Plains Island
K:CARDNAME enters the battlefield tapped.
Oracle:({T}: Add {W} or {U}.)\nIdyllic Beachfront enters the battlefield tapped.

View File

@@ -0,0 +1,5 @@
Name:Iridian Maelstrom
ManaCost:W U B R G
Types:Sorcery
A:SP$ DestroyAll | ValidCards$ Creature.!AllColors | SpellDescription$ Destroy each creature that isn't all colors.
Oracle:Destroy each creature that isn't all colors.

View File

@@ -0,0 +1,8 @@
Name:Ivy, Gleeful Spellthief
ManaCost:G U
Types:Legendary Creature Faerie Rogue
PT:2/1
K:Flying
T:Mode$ SpellCast | TriggerZones$ Battlefield | IsSingleTarget$ True | TargetsValid$ Creature.Other+inZoneBattlefield | Execute$ TrigCopyTarget | OptionalDecider$ You | TriggerDescription$ Whenever a player casts a spell that targets only a single creature other than CARDNAME, you may copy that spell. The copy targets NICKNAME. (A copy of an Aura spell becomes a token.)
SVar:TrigCopyTarget:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | CopyForEachCanTarget$ Card.Self
Oracle:Flying\nWhenever a player casts a spell that targets only a single creature other than Ivy, Gleeful Spellthief, you may copy that spell. The copy targets Ivy. (A copy of an Aura spell becomes a token.)

View File

@@ -0,0 +1,10 @@
Name:Jenson Carthalion, Druid Exile
ManaCost:G W
Types:Legendary Creature Human Druid
PT:2/2
T:Mode$ SpellCast | ValidCard$ Card.MultiColor | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigScry | TriggerDescription$ Whenever you cast a multicolored spell, scry 1. If that spell was all colors, create a 4/4 white Angel creature token with flying and vigilance.
SVar:TrigScry:DB$ Scry | ScryNum$ 1 | SubAbility$ DBToken
SVar:DBToken:DB$ Token | TokenScript$ w_4_4_angel_flying_vigilance | TokenAmount$ 1 | ConditionDefined$ TriggeredCard | ConditionPresent$ Card.AllColors
A:AB$ Mana | Cost$ 5 T | Produced$ W U B R G | SpellDescription$ Add {W}{U}{B}{R}{G}.
DeckHas:Ability$Token & Type$Angel
Oracle:Whenever you cast a multicolored spell, scry 1. If that spell was all colors, create a 4/4 white Angel creature token with flying and vigilance.\n{5}, {T}: Add {W}{U}{B}{R}{G}.

View File

@@ -0,0 +1,12 @@
Name:Jodah, the Unifier
ManaCost:W U B R G
Types:Legendary Creature Human Wizard
PT:5/5
S:Mode$ Continuous | Affected$ Creature.Legendary+YouCtrl | AddPower$ X | AddToughness$ X | Description$ Legendary creatures you control get +X/+X, where X is the number of legendary creatures you control.
T:Mode$ SpellCast | ValidCard$ Card.Legendary+wasCastFromYourHandByYou | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ DBDigUntil | TriggerDescription$ Whenever you cast a legendary spell from your hand, exile cards from the top of your library until you exile a legendary nonland card with lesser mana value. You may cast that card without paying its mana cost. Put the rest on the bottom of your library in a random order.
SVar:DBDigUntil:DB$ DigUntil | Defined$ You | Valid$ Card.nonLand+Legendary+cmcLEY | FoundDestination$ Exile | RevealedDestination$ Library | RestRandomOrder$ True | SubAbility$ DBPlay | StackDescription$ then reveals cards from the top of it until they reveal a legendary nonland card with lesser mana value. {p:You} exiles that card and puts the rest on the bottom of their library in a random order.
SVar:DBPlay:DB$ Play | Defined$ Remembered | ValidSA$ Spell | WithoutManaCost$ True | Optional$ True | StackDescription$ {p:You} may cast the exiled card without paying its mana cost. | SpellDescription$ You may cast the exiled card without paying its mana cost.
SVar:X:Count$Valid Creature.Legendary+YouCtrl
SVar:Y:TriggeredCard$CardManaCost
DeckHints:Type$Legendary
Oracle:Legendary creatures you control get +X/+X, where X is the number of legendary creatures you control.\nWhenever you cast a legendary spell from your hand, exile cards from the top of your library until you exile a legendary nonland card with lesser mana value. You may cast that card without paying its mana cost. Put the rest on the bottom of your library in a random order

View File

@@ -0,0 +1,96 @@
Name:Karlach, Raging Tiefling
ManaCost:1 R
Types:Legendary Creature Tiefling Barbarian
PT:2/2
K:First strike
K:Specialize:6:Rage Beyond Death:You may also activate this ability if CARDNAME is in your graveyard.:AdditionalActivationZone$ Graveyard
AlternateMode:Specialize
DeckHas:Ability$Graveyard
Oracle:First strike\nRage Beyond Death — Specialize {6}. You may also activate this ability if Karlach, Raging Tiefling is in your graveyard.
SPECIALIZE:WHITE
Name:Karlach, Tiefling Zealot
ManaCost:1 R W
Types:Legendary Creature Tiefling Barbarian
PT:4/4
K:First strike
K:Haste
T:Mode$ Specializes | ValidCard$ Card.Self | TriggerZones$ Graveyard | Execute$ TrigReturn | TriggerDescription$ When this card specializes from your graveyard, return it from your graveyard to the battlefield. It perpetually gains "This creature can't block."
SVar:TrigReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Defined$ TriggeredCard | SubAbility$ DBEffect
SVar:DBEffect:DB$ Effect | RememberObjects$ TriggeredCard | StaticAbilities$ PerpetualStatic | Duration$ Permanent
SVar:PerpetualStatic:Mode$ Continuous | Affected$ Card.IsRemembered | AddKeyword$ CARDNAME can't block. | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ It perpetually gains "This creature can't block."
T:Mode$ Specializes | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When this card specializes from any zone, create a 2/2 white Knight creature token. Creatures you control get +1/+1 and gain haste until end of turn.
SVar:TrigToken:DB$ Token | TokenScript$ w_2_2_knight | SubAbility$ DBPumpAll
SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | NumDef$ +1 | KW$ Haste
DeckHas:Ability$Token & Type$Knight
Oracle:First strike, haste\nWhen this card specializes from your graveyard, return it from your graveyard to the battlefield. It perpetually gains "This creature can't block."\nWhen this card specializes from any zone, create a 2/2 white Knight creature token. Creatures you control get +1/+1 and gain haste until end of turn.
SPECIALIZE:BLUE
Name:Karlach, Tiefling Spellrager
ManaCost:1 U R
Types:Legendary Creature Tiefling Barbarian
PT:4/4
K:First strike
K:Haste
T:Mode$ Specializes | ValidCard$ Card.Self | TriggerZones$ Graveyard | Execute$ TrigReturn | TriggerDescription$ When this card specializes from your graveyard, return it from your graveyard to the battlefield. It perpetually gains "This creature can't block."
SVar:TrigReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Defined$ TriggeredCard | SubAbility$ DBEffect
SVar:DBEffect:DB$ Effect | RememberObjects$ TriggeredCard | StaticAbilities$ PerpetualStatic | Duration$ Permanent
SVar:PerpetualStatic:Mode$ Continuous | Affected$ Card.IsRemembered | AddKeyword$ CARDNAME can't block. | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ It perpetually gains "This creature can't block."
T:Mode$ Specializes | ValidCard$ Card.Self | Execute$ TrigSeek | TriggerDescription$ When this card specializes from any zone, seek an instant or sorcery card with mana value 3 or less. Until end of turn, you may cast that card without paying its mana cost.
SVar:TrigSeek:DB$ ChangeZone | Origin$ Library | Destination$ Hand | AtRandom$ True | NoShuffle$ True | NoLooking$ True | NoReveal$ True | ChangeNum$ 1 | ChangeType$ Instant.cmcLE3,Sorcery.cmcLE3 | RememberChanged$ True
SVar:DBEffect:DB$ Effect | StaticAbilities$ MayPlay | RememberObjects$ Remembered | ForgetOnMoved$ Hand | SubAbility$ DBCleanup
SVar:MayPlay:Mode$ Continuous | Affected$ Card.IsRemembered+nonLand | MayPlayWithoutManaCost$ True | EffectZone$ Command | AffectedZone$ Hand
DeckHints:Type$Instant|Sorcery
Oracle:First strike, haste\nWhen this card specializes from your graveyard, return it from your graveyard to the battlefield. It perpetually gains "This creature can't block."\nWhen this card specializes from any zone, seek an instant or sorcery card with mana value 3 or less. Until end of turn, you may cast that card without paying its mana cost.
SPECIALIZE:BLACK
Name:Karlach, Tiefling Punisher
ManaCost:1 B R
Types:Legendary Creature Tiefling Barbarian
PT:4/4
K:First strike
K:Haste
T:Mode$ Specializes | ValidCard$ Card.Self | TriggerZones$ Graveyard | Execute$ TrigReturn | TriggerDescription$ When this card specializes from your graveyard, return it from your graveyard to the battlefield. It perpetually gains "This creature can't block."
SVar:TrigReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Defined$ TriggeredCard | SubAbility$ DBEffect
SVar:DBEffect:DB$ Effect | RememberObjects$ TriggeredCard | StaticAbilities$ PerpetualStatic | Duration$ Permanent
SVar:PerpetualStatic:Mode$ Continuous | Affected$ Card.IsRemembered | AddKeyword$ CARDNAME can't block. | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ It perpetually gains "This creature can't block."
T:Mode$ Specializes | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When this card specializes from any zone, you may sacrifice a creature. If you do, you draw two cards and each opponent loses 2 life.
SVar:TrigDraw:AB$ Draw | Cost$ Sac<1/Creature> | NumCards$ 2 | SubAbility$ DBLoseLife
SVar:DBLoseLife:DB$ LoseLife | Defined$ Opponent | LifeAmount$ 2
DeckHas:Ability$Sacrifice
Oracle:First strike, haste\nWhen this card specializes from your graveyard, return it from your graveyard to the battlefield. It perpetually gains "This creature can't block."\nWhen this card specializes from any zone, you may sacrifice a creature. If you do, you draw two cards and each opponent loses 2 life.
SPECIALIZE:RED
Name:Karlach, Tiefling Berserker
ManaCost:1 R R
Types:Legendary Creature Tiefling Barbarian
PT:4/4
K:First strike
K:Haste
T:Mode$ Specializes | ValidCard$ Card.Self | TriggerZones$ Graveyard | Execute$ TrigReturn | TriggerDescription$ When this card specializes from your graveyard, return it from your graveyard to the battlefield. It perpetually gains "This creature can't block."
SVar:TrigReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Defined$ TriggeredCard | SubAbility$ DBEffect
SVar:DBEffect:DB$ Effect | RememberObjects$ TriggeredCard | StaticAbilities$ PerpetualStatic | Duration$ Permanent
SVar:PerpetualStatic:Mode$ Continuous | Affected$ Card.IsRemembered | AddKeyword$ CARDNAME can't block. | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ It perpetually gains "This creature can't block."
T:Mode$ Specializes | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When this card specializes from any zone, target creature an opponent controls can't block this turn.
SVar:TrigPump:DB$ Pump | ValidTgts$ Creature.OppCtrl | KW$ HIDDEN CARDNAME can't block. | TgtPrompt$ Select target creature an opponent controls | IsCurse$ True
Oracle:First strike, haste\nWhen this card specializes from your graveyard, return it from your graveyard to the battlefield. It perpetually gains "This creature can't block."\nWhen this card specializes from any zone, target creature an opponent controls can't block this turn.
SPECIALIZE:GREEN
Name:Karlach, Tiefling Guardian
ManaCost:1 R G
Types:Legendary Creature Tiefling Barbarian
PT:4/4
K:First strike
K:Haste
T:Mode$ Specializes | ValidCard$ Card.Self | TriggerZones$ Graveyard | Execute$ TrigReturn | TriggerDescription$ When this card specializes from your graveyard, return it from your graveyard to the battlefield. It perpetually gains "This creature can't block."
SVar:TrigReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Defined$ TriggeredCard | SubAbility$ DBEffect
SVar:DBEffect:DB$ Effect | RememberObjects$ TriggeredCard | StaticAbilities$ PerpetualStatic | Duration$ Permanent
SVar:PerpetualStatic:Mode$ Continuous | Affected$ Card.IsRemembered | AddKeyword$ CARDNAME can't block. | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ It perpetually gains "This creature can't block."
T:Mode$ Specializes | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When this card specializes from any zone, another target creature you control gets +4/+4 until end of turn.
SVar:TrigPump:DB$ Pump | ValidTgts$ Creature.Other+YouCtrl | TgtPrompt$ Select another target creature you control | NumAtt$ +4 | NumDef$ +4
Oracle:First strike, haste\nWhen this card specializes from your graveyard, return it from your graveyard to the battlefield. It perpetually gains "This creature can't block."\nWhen this card specializes from any zone, another target creature you control gets +4/+4 until end of turn.

View File

@@ -0,0 +1,12 @@
Name:King Darien XLVIII
ManaCost:1 G W
Types:Legendary Creature Human Soldier
PT:2/3
S:Mode$ Continuous | Affected$ Creature.Other+YouCtrl | AddPower$ 1 | AddToughness$ 1 | Description$ Other creatures you control get +1/+1.
A:AB$ PutCounter | Cost$ 3 G W | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBToken | SpellDescription$ Put a +1/+1 counter on NICKNAME and create a 1/1 white Soldier creature token.
SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ w_1_1_soldier | TokenOwner$ You | StackDescription$ None
A:AB$ PumpAll | Cost$ Sac<1/CARDNAME> | ValidCards$ Creature.token+YouCtrl | KW$ Hexproof & Indestructible | SpellDescription$ Creature tokens you control gain hexproof and indestructible until end of turn.
DeckHas:Ability$Counters|Token|Sacrifice & Type|Soldier
DeckHints:Ability$Token
SVar:PlayMain1:TRUE
Oracle:Other creatures you control get +1/+1.\n{3}{G}{W}: Put a +1/+1 counter on King Darien and create a 1/1 white Soldier creature token.\nSacrifice King Darien: Creature tokens you control gain hexproof and indestructible until end of turn.

View File

@@ -0,0 +1,10 @@
Name:Lagomos, Hand of Hatred
ManaCost:1 B R
Types:Legendary Creature Human Shaman
PT:1/3
T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ At the beginning of combat on your turn, create a 2/1 red Elemental creature token with trample and haste. Sacrifice it at the beginning of the next end step.
SVar:TrigToken:DB$ Token | TokenScript$ r_2_1_elemental_trample_haste | TokenAmount$ 1 | AtEOT$ Sacrifice
A:AB$ ChangeZone | Cost$ T | Origin$ Library | Destination$ Hand | ChangeType$ Card | ChangeNum$ 1 | Mandatory$ True | CheckSVar$ X | SVarCompare$ GE5 | SpellDescription$ Search your library for a card, put that card into your hand, then shuffle. Activate only if five or more creatures died this turn.
SVar:X:Count$ThisTurnEntered_Graveyard_from_Battlefield_Creature
DeckHas:Ability$Counters|Sacrifice|Token & Type$Elemental
Oracle:\nAt the beginning of combat on your turn, create a 2/1 red Elemental creature token with trample and haste. Sacrifice it at the beginning of the next end step.\n{T}: Search your library for a card, put it into your hand, then shuffle. Activate only if five or more creatures died this turn.

View File

@@ -0,0 +1,11 @@
Name:Leaf-Crowned Visionary
ManaCost:G G
Types:Creature Elf Druid
PT:1/1
S:Mode$ Continuous | AffectedZone$ Battlefield | Affected$ Elf.Other+YouCtrl | AddPower$ 1 | AddToughness$ 1 | Description$ Other Elves you control get +1/+1.
T:Mode$ SpellCast | ValidCard$ Elf | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ Whenever you cast an Elf spell, you may pay {G}. If you do, draw a card.
SVar:TrigDraw:AB$Draw | Cost$ G
AI:RemoveDeck:Random
DeckNeeds:Type$Elf
DeckHints:Type$Elf
Oracle:Other Elves you control get +1/+1.\nWhenever you cast an Elf spell, you may pay {G}. If you do, draw a card.

View File

@@ -0,0 +1,78 @@
Name:Lukamina, Moon Druid
ManaCost:2 G
Types:Legendary Creature Human Druid
PT:2/2
K:Specialize:3:Wild Shape:Activate only if you control six or more lands.:IsPresent$ Land.YouCtrl | PresentCompare$ GE6
T:Mode$ ChangesZone | ValidCard$ Card.wasCastByYou+Self | Destination$ Battlefield | Execute$ TrigSeek | TriggerDescription$ When CARDNAME enters the battlefield, if you cast it, seek a land card with a basic land type.
SVar:TrigSeek:DB$ ChangeZone | Origin$ Library | Destination$ Hand | AtRandom$ True | NoShuffle$ True | Mandatory$ True | NoLooking$ True | NoReveal$ True | ChangeType$ Land.hasABasicLandType | ChangeNum$ 1
AlternateMode:Specialize
Oracle:Wild Shape — Specialize {3}. Activate only if you control six or more lands.\nWhen Lukamina, Moon Druid enters the battlefield, if you cast it, seek a land card with a basic land type.
SPECIALIZE:WHITE
Name:Lukamina, Hawk Form
ManaCost:2 G W
Types:Legendary Creature Bird Druid
PT:4/4
K:Flying
K:Lifelink
T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigUnspecialize | TriggerDescription$ When CARDNAME dies, it unspecializes. If it unspecializes this way, return it to the battlefield tapped.
SVar:TrigUnspecialize:DB$ SetState | Mode$ Unspecialize | RememberChanged$ True | SubAbility$ DBReturn
SVar:DBReturn:DB$ ChangeZone | ConditionDefined$ Remembered | ConditionPresent$ Card | Origin$ Graveyard | Destination$ Battlefield | Tapped$ True | Defined$ Remembered
DeckHas:Ability$LifeGain
Oracle:Flying, lifelink\nWhen Lukamina, Hawk Form dies, it unspecializes. If it unspecializes this way, return it to the battlefield tapped.
SPECIALIZE:BLUE
Name:Lukamina, Crocodile Form
ManaCost:2 G U
Types:Legendary Creature Crocodile Druid
PT:4/4
T:Mode$ Specializes | ValidCard$ Card.Self | Execute$ TrigTap | TriggerDescription$ When this creature specializes, tap target nonland permanent an opponent controls. That permanent doesn't untap during its controller's untap step for as long as you control CARDNAME.
SVar:TrigTap:DB$ Tap | ValidTgts$ Permanent.nonLand+OppCtrl | TgtPrompt$ Select target nonland permanent an opponent controls | SubAbility$ DBPump
SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN CARDNAME doesn't untap during your untap step. | Duration$ UntilLoseControlOfHost
T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigUnspecialize | TriggerDescription$ When NICKNAME dies, it unspecializes. If it unspecializes this way, return it to the battlefield tapped.
SVar:TrigUnspecialize:DB$ SetState | Defined$ TriggeredCard | Mode$ Unspecialize | RememberChanged$ True | SubAbility$ DBReturn
SVar:DBReturn:DB$ ChangeZone | ConditionDefined$ Remembered | ConditionPresent$ Card | Origin$ Graveyard | Destination$ Battlefield | Tapped$ True | Defined$ Remembered
Oracle:When this creature specializes, tap target nonland permanent an opponent controls. That permanent doesn't untap during its controller's untap step for as long as you control Lukamina, Crocodile Form.\nWhen Lukamina dies, it unspecializes. If it unspecializes this way, return it to the battlefield tapped.
SPECIALIZE:BLACK
Name:Lukamina, Scorpion Form
ManaCost:2 B G
Types:Legendary Creature Scorpion Druid
PT:4/4
K:Deathtouch
K:CARDNAME must be blocked if able.
T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigUnspecialize | TriggerDescription$ When NICKNAME dies, it unspecializes. If it unspecializes this way, return it to the battlefield tapped.
SVar:TrigUnspecialize:DB$ SetState | Defined$ TriggeredCard | Mode$ Unspecialize | RememberChanged$ True | SubAbility$ DBReturn
SVar:DBReturn:DB$ ChangeZone | ConditionDefined$ Remembered | ConditionPresent$ Card | Origin$ Graveyard | Destination$ Battlefield | Tapped$ True | Defined$ Remembered
Oracle:Deathtouch\nLukamina, Scorpion Form must be blocked if able.\nWhen Lukamina dies, it unspecializes. If it unspecializes this way, return it to the battlefield tapped.
SPECIALIZE:RED
Name:Lukamina, Wolf Form
ManaCost:2 R G
Types:Legendary Creature Wolf Druid
PT:4/4
K:Menace
T:Mode$ Specializes | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When this creature specializes or attacks, create a 2/2 green Wolf creature token.
T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigToken | Secondary$ True | TriggerDescription$ Whenever this creature specializes or attacks, create a 2/2 green Wolf creature token.
SVar:TrigToken:DB$ Token | TokenScript$ g_2_2_wolf
T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigUnspecialize | TriggerDescription$ When NICKNAME dies, it unspecializes. If it unspecializes this way, return it to the battlefield tapped.
SVar:TrigUnspecialize:DB$ SetState | Defined$ TriggeredCard | Mode$ Unspecialize | RememberChanged$ True | SubAbility$ DBReturn
SVar:DBReturn:DB$ ChangeZone | ConditionDefined$ Remembered | ConditionPresent$ Card | Origin$ Graveyard | Destination$ Battlefield | Tapped$ True | Defined$ Remembered
DeckHas:Ability$Token
Oracle:Menace\nWhenever this creature specializes or attacks, create a 2/2 green Wolf creature token.\nWhen Lukamina, Wolf Form dies, it unspecializes. If it unspecializes this way, return it to the battlefield tapped.
SPECIALIZE:GREEN
Name:Lukamina, Bear Form
ManaCost:2 G G
Types:Legendary Creature Bear Druid
K:Trample
S:Mode$ Continuous | Affected$ Creature.YouCtrl+Other | AddPower$ 1 | AddToughness$ 1 | AddKeyword$ Trample | Description$ Other creatures you control get +1/+1 and have trample.
T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigUnspecialize | TriggerDescription$ When CARDNAME dies, it unspecializes. If it unspecializes this way, return it to the battlefield tapped.
SVar:TrigUnspecialize:DB$ SetState | Defined$ TriggeredCard | Mode$ Unspecialize | RememberChanged$ True | SubAbility$ DBReturn
SVar:DBReturn:DB$ ChangeZone | ConditionDefined$ Remembered | ConditionPresent$ Card | Origin$ Graveyard | Destination$ Battlefield | Tapped$ True | Defined$ Remembered
Oracle:Trample\nOther creatures you control get +1/+1 and have trample.\nWhen Lukamina, Bear Form dies, it unspecializes. If it unspecializes this way, return it to the battlefield tapped.

View File

@@ -0,0 +1,8 @@
Name:Mind Spike
ManaCost:B
Types:Sorcery
A:SP$ Reveal | ValidTgts$ Opponent | RevealAllValid$ Card.nonLand+nonCreature+TargetedPlayerCtrl | RememberRevealed$ True | SubAbility$ DBDiscard | StackDescription$ SpellDescription | SpellDescription$ Target opponent reveals each noncreature, nonland card in their hand. You choose a card revealed this way. That player discards that card. You lose 2 life. If they didn't reveal a card this way, you draw a card.
SVar:DBDiscard:DB$ Discard | Defined$ Targeted | Mode$ YouChoose | NumCards$ 1 | DiscardValid$ Card.nonLand+nonCreature | SubAbility$ DBLoseLife
SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ 2 | SubAbility$ DBDraw
SVar:DBDraw:DB$ Draw | NumCards$ 1 | Defined$ You | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ EQ0
Oracle:Target opponent reveals each noncreature, nonland card in their hand. You choose a card revealed this way. That player discards that card. You lose 2 life. If they didn't reveal a card this way, you draw a card.

View File

@@ -0,0 +1,5 @@
Name:Molten Tributary
ManaCost:no cost
Types:Land Island Mountain
K:CARDNAME enters the battlefield tapped.
Oracle:({T}: Add {U} or {R}.)\nMolten Tributary enters the battlefield tapped.

View File

@@ -0,0 +1,9 @@
Name:Ohabi Caleria
ManaCost:1 G W
Types:Legendary Creature Elf Archer
PT:1/3
K:Reach
S:Mode$ Continuous | Affected$ Archer.YouCtrl | AddHiddenKeyword$ CARDNAME untaps during each other player's untap step. | Description$ Untap all Archers you control during each other player's untap step.
T:Mode$ DamageDone | ValidSource$ Archer.YouCtrl | ValidTarget$ Creature | TriggerZones$ Battlefield | Execute$ DBDraw | TriggerDescription$ Whenever an Archer you control deals damage to a creature, you may pay {2}. If you do, draw a card.
SVar:DBDraw:AB$ Draw | Cost$ 2
Oracle:Reach\nUntap all Archers you control during each other player's untap step.\nWhenever an Archer you control deals damage to a creature, you may pay {2}. If you do, draw a card.

View File

@@ -0,0 +1,12 @@
Name:Orca, Siege Demon
ManaCost:5 B R
Types:Legendary Creature Human Soldier
K:Trample
PT:5/5
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.Other | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever another creature dies, put a +1/+1 counter on CARDNAME.
SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDamage | TriggerDescription$ When NICKNAME dies, it deals damage equal to its power divided as you choose among any number of targets.
SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any number of targets to distribute damage to | NumDmg$ X | TargetMin$ 1 | TargetMax$ X | DividedAsYouChoose$ X
SVar:X:TriggeredCard$CardPower
DeckHas:Ability$Counters
Oracle:Whenever another creature dies, put a +1/+1 counter on Orca, Siege Demon.\nWhen Orca dies, it deals damage equal to its power divided as you choose among any number of targets.

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