mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-15 18:28:00 +00:00
Merge branch 'Card-Forge:master' into Stangg
This commit is contained in:
@@ -2,10 +2,12 @@ package forge.ai;
|
||||
|
||||
import static forge.ai.ComputerUtilCard.getBestCreatureAI;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import forge.card.MagicColor;
|
||||
import forge.game.cost.*;
|
||||
import org.apache.commons.lang3.ObjectUtils;
|
||||
|
||||
@@ -55,6 +57,14 @@ public class AiCostDecision extends CostDecisionMakerBase {
|
||||
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
|
||||
public PaymentDecision visit(CostChooseCreatureType cost) {
|
||||
String choice = player.getController().chooseSomeType("Creature", ability, CardType.getAllCreatureTypes(),
|
||||
|
||||
@@ -1201,7 +1201,7 @@ public abstract class GameState {
|
||||
String[] allCounterStrings = counterString.split(",");
|
||||
for (final String counterPair : allCounterStrings) {
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -218,7 +218,7 @@ public class SpecialCardAi {
|
||||
|
||||
Card animated = AnimateAi.becomeAnimated(sa.getHostCard(), sa.getSubAbility());
|
||||
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 isValuableAttacker = ph.is(PhaseType.MAIN1, ai) && ComputerUtilCard.doesSpecifiedCreatureAttackAI(ai, animated);
|
||||
|
||||
@@ -105,13 +105,11 @@ public class ManaEffectAi extends SpellAbilityAi {
|
||||
}
|
||||
|
||||
PhaseHandler ph = ai.getGame().getPhaseHandler();
|
||||
boolean moreManaNextTurn = false;
|
||||
if (ph.is(PhaseType.END_OF_TURN) && (ph.getNextTurn() == ai || ComputerUtilCard.willUntap(ai, sa.getHostCard())) && canRampPool(ai, sa.getHostCard())) {
|
||||
moreManaNextTurn = true;
|
||||
}
|
||||
boolean moreManaNextTurn = ph.is(PhaseType.END_OF_TURN) && (ph.getNextTurn() == ai || ComputerUtilCard.willUntap(ai, sa.getHostCard()))
|
||||
&& canRampPool(ai, sa.getHostCard());
|
||||
|
||||
return sa.getPayCosts().hasNoManaCost() && sa.getPayCosts().isReusuableResource()
|
||||
&& sa.getSubAbility() == null && (ComputerUtil.playImmediately(ai, sa) || moreManaNextTurn);
|
||||
&& sa.getSubAbility() == null && (moreManaNextTurn || ComputerUtil.playImmediately(ai, sa));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -43,6 +43,11 @@ public final class CardRules implements ICardCharacteristics {
|
||||
private CardSplitType splitType;
|
||||
private ICardFace mainPart;
|
||||
private ICardFace otherPart;
|
||||
private ICardFace wSpecialize;
|
||||
private ICardFace uSpecialize;
|
||||
private ICardFace bSpecialize;
|
||||
private ICardFace rSpecialize;
|
||||
private ICardFace gSpecialize;
|
||||
private CardAiHints aiHints;
|
||||
private ColorSet colorIdentity;
|
||||
private ColorSet deckbuildingColors;
|
||||
@@ -54,6 +59,12 @@ public final class CardRules implements ICardCharacteristics {
|
||||
splitType = altMode;
|
||||
mainPart = faces[0];
|
||||
otherPart = faces[1];
|
||||
wSpecialize = faces[2];
|
||||
uSpecialize = faces[3];
|
||||
bSpecialize = faces[4];
|
||||
rSpecialize = faces[5];
|
||||
gSpecialize = faces[6];
|
||||
|
||||
aiHints = cah;
|
||||
meldWith = "";
|
||||
partnerWith = "";
|
||||
@@ -74,6 +85,11 @@ public final class CardRules implements ICardCharacteristics {
|
||||
splitType = newRules.splitType;
|
||||
mainPart = newRules.mainPart;
|
||||
otherPart = newRules.otherPart;
|
||||
wSpecialize = newRules.wSpecialize;
|
||||
uSpecialize = newRules.uSpecialize;
|
||||
bSpecialize = newRules.bSpecialize;
|
||||
rSpecialize = newRules.rSpecialize;
|
||||
gSpecialize = newRules.gSpecialize;
|
||||
aiHints = newRules.aiHints;
|
||||
colorIdentity = newRules.colorIdentity;
|
||||
meldWith = newRules.meldWith;
|
||||
@@ -132,6 +148,22 @@ public final class CardRules implements ICardCharacteristics {
|
||||
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() {
|
||||
switch (splitType.getAggregationMethod()) {
|
||||
case COMBINE:
|
||||
@@ -335,7 +367,7 @@ public final class CardRules implements ICardCharacteristics {
|
||||
// Reads cardname.txt
|
||||
public static class Reader {
|
||||
// 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 CardSplitType altMode = CardSplitType.None;
|
||||
private String meldWith = "";
|
||||
@@ -382,6 +414,11 @@ public final class CardRules implements ICardCharacteristics {
|
||||
CardAiHints cah = new CardAiHints(removedFromAIDecks, removedFromRandomDecks, removedFromNonCommanderDecks, hints, needs, has);
|
||||
faces[0].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);
|
||||
|
||||
result.setNormalizedName(this.normalizedName);
|
||||
@@ -518,6 +555,18 @@ public final class CardRules implements ICardCharacteristics {
|
||||
case 'S':
|
||||
if ("S".equals(key)) {
|
||||
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)) {
|
||||
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) {
|
||||
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].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.");
|
||||
|
||||
@@ -10,7 +10,8 @@ public enum CardSplitType
|
||||
Split(FaceSelectionMethod.COMBINE, CardStateName.RightSplit),
|
||||
Flip(FaceSelectionMethod.USE_PRIMARY_FACE, CardStateName.Flipped),
|
||||
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) {
|
||||
method = calcMode;
|
||||
|
||||
@@ -10,7 +10,12 @@ public enum CardStateName {
|
||||
LeftSplit,
|
||||
RightSplit,
|
||||
Adventure,
|
||||
Modal
|
||||
Modal,
|
||||
SpecializeW,
|
||||
SpecializeU,
|
||||
SpecializeB,
|
||||
SpecializeR,
|
||||
SpecializeG
|
||||
|
||||
;
|
||||
|
||||
|
||||
@@ -80,6 +80,22 @@ public class ForgeScript {
|
||||
return source.hasChosenColor()
|
||||
&& 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")) {
|
||||
// ... Other Card types
|
||||
return !cardState.getTypeWithChanges().hasStringType(property.substring(3));
|
||||
@@ -207,6 +223,8 @@ public class ForgeScript {
|
||||
return sa.hasParam("Nightbound");
|
||||
} else if (property.equals("paidPhyrexianMana")) {
|
||||
return sa.getSpendPhyrexianMana();
|
||||
} else if (property.equals("LastChapter")) {
|
||||
return sa.isLastChapter();
|
||||
} else if (property.startsWith("ManaSpent")) {
|
||||
String[] k = property.split(" ", 2);
|
||||
String comparator = k[1].substring(0, 2);
|
||||
|
||||
@@ -608,6 +608,10 @@ public class GameAction {
|
||||
if (c.hasIntensity()) {
|
||||
copied.setIntensity(c.getIntensity(false));
|
||||
}
|
||||
// specialize is perpetual
|
||||
if (c.isSpecialized()) {
|
||||
copied.setState(c.getCurrentStateName(), false);
|
||||
}
|
||||
|
||||
// update state for view
|
||||
copied.updateStateForView();
|
||||
@@ -688,7 +692,7 @@ public class GameAction {
|
||||
}
|
||||
|
||||
if (fromBattlefield) {
|
||||
if (!c.isRealToken()) {
|
||||
if (!c.isRealToken() && !c.isSpecialized()) {
|
||||
copied.setState(CardStateName.Original, true);
|
||||
}
|
||||
// Soulbond unpairing
|
||||
@@ -2415,7 +2419,7 @@ public class GameAction {
|
||||
}
|
||||
|
||||
// for Zangief do this before runWaitingTriggers DamageDone
|
||||
damageMap.triggerExcessDamage(isCombat, lethalDamage, game);
|
||||
damageMap.triggerExcessDamage(isCombat, lethalDamage, game, lkiCache);
|
||||
|
||||
// lose life simultaneously
|
||||
if (isCombat) {
|
||||
|
||||
@@ -26,6 +26,7 @@ import com.google.common.collect.Iterables;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Maps;
|
||||
|
||||
import forge.game.ability.AbilityKey;
|
||||
import forge.game.ability.AbilityUtils;
|
||||
import forge.game.ability.ApiType;
|
||||
import forge.game.card.Card;
|
||||
@@ -330,9 +331,9 @@ public abstract class GameEntity extends GameObject implements IIdentifiable {
|
||||
subtractCounter(CounterType.get(counterName), n);
|
||||
}
|
||||
|
||||
abstract public void addCounterInternal(final CounterType 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) {
|
||||
addCounterInternal(CounterType.get(counterType), n, source, fireEvents, 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, Map<AbilityKey, Object> params) {
|
||||
addCounterInternal(CounterType.get(counterType), n, source, fireEvents, table, params);
|
||||
}
|
||||
|
||||
public void receiveDamage(Pair<Integer, Boolean> dmg) {
|
||||
|
||||
@@ -155,11 +155,18 @@ public class GameEntityCounterTable extends ForwardingTable<Optional<Player>, Ga
|
||||
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
|
||||
for (Map.Entry<Optional<Player>, Map<CounterType, Integer>> e : values.entrySet()) {
|
||||
boolean remember = cause != null && cause.hasParam("RememberPut");
|
||||
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) {
|
||||
cause.getHostCard().addRemembered(gm.getKey());
|
||||
}
|
||||
|
||||
@@ -2737,10 +2737,10 @@ public class AbilityUtils {
|
||||
SpellAbility sa = (SpellAbility) ctb;
|
||||
if (sa.isReplacementAbility()) {
|
||||
if (zones.get(0).equals(ZoneType.Battlefield)) {
|
||||
cardsInZones = sa.getLastStateBattlefield();
|
||||
cardsInZones = sa.getRootAbility().getLastStateBattlefield();
|
||||
usedLastState = true;
|
||||
} else if (zones.get(0).equals(ZoneType.Graveyard)) {
|
||||
cardsInZones = sa.getLastStateGraveyard();
|
||||
cardsInZones = sa.getRootAbility().getLastStateGraveyard();
|
||||
usedLastState = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -450,11 +450,12 @@ public class CountersPutEffect extends SpellAbilityEffect {
|
||||
0);
|
||||
}
|
||||
if (sa.hasParam("UpTo")) {
|
||||
int min = AbilityUtils.calculateAmount(card, sa.getParamOrDefault("UpToMin", "0"), sa);
|
||||
Map<String, Object> params = Maps.newHashMap();
|
||||
params.put("Target", obj);
|
||||
params.put("CounterType", counterType);
|
||||
counterAmount = pc.chooseNumber(sa,
|
||||
Localizer.getInstance().getMessage("lblHowManyCounters"), 0, counterAmount, params);
|
||||
Localizer.getInstance().getMessage("lblHowManyCounters"), min, counterAmount, params);
|
||||
}
|
||||
if (sa.isDividedAsYouChoose() && !sa.usesTargeting()) {
|
||||
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")) {
|
||||
// make a copy to check if it would be on the battlefield
|
||||
Card noTributeLKI = CardUtil.getLKICopy(gameCard);
|
||||
|
||||
@@ -226,6 +226,8 @@ public class EffectEffect extends SpellAbilityEffect {
|
||||
if (!"Stack".equals(sa.getParam("ForgetOnMoved"))) {
|
||||
addForgetOnCastTrigger(eff);
|
||||
}
|
||||
} else if (sa.hasParam("ForgetOnCast")) {
|
||||
addForgetOnCastTrigger(eff);
|
||||
} else if (sa.hasParam("ExileOnMoved")) {
|
||||
addExileOnMovedTrigger(eff, sa.getParam("ExileOnMoved"));
|
||||
}
|
||||
|
||||
@@ -4,12 +4,15 @@ import forge.card.CardStateName;
|
||||
import forge.game.Game;
|
||||
import forge.game.GameEntityCounterTable;
|
||||
import forge.game.GameLogEntryType;
|
||||
import forge.game.ability.AbilityKey;
|
||||
import forge.game.ability.AbilityUtils;
|
||||
import forge.game.ability.SpellAbilityEffect;
|
||||
import forge.game.card.*;
|
||||
import forge.game.event.GameEventCardStatsChanged;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.player.PlayerActionConfirmMode;
|
||||
import forge.game.trigger.TriggerHandler;
|
||||
import forge.game.trigger.TriggerType;
|
||||
import forge.game.spellability.SpellAbility;
|
||||
import forge.game.zone.ZoneType;
|
||||
import forge.util.Lang;
|
||||
@@ -17,19 +20,28 @@ import forge.util.Localizer;
|
||||
import forge.util.TextUtil;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
public class SetStateEffect extends SpellAbilityEffect {
|
||||
|
||||
@Override
|
||||
protected String getStackDescription(final SpellAbility sa) {
|
||||
final Card host = sa.getHostCard();
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
boolean specialize = sa.getParam("Mode").equals("Specialize");
|
||||
|
||||
if (sa.hasParam("Flip")) {
|
||||
sb.append("Flip ");
|
||||
} else if (specialize) { // verb will come later
|
||||
} else {
|
||||
sb.append("Transform ");
|
||||
}
|
||||
|
||||
sb.append(Lang.joinHomogenous(getTargetCards(sa)));
|
||||
if (specialize) {
|
||||
sb.append(" perpetually specializes into ");
|
||||
sb.append(host.hasChosenColor() ? host.getChosenColor() : "the chosen color");
|
||||
}
|
||||
sb.append(".");
|
||||
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.
|
||||
// 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;
|
||||
}
|
||||
|
||||
@@ -160,6 +174,9 @@ public class SetStateEffect extends SpellAbilityEffect {
|
||||
hasTransformed = gameCard.turnFaceUp(sa);
|
||||
} else if (sa.isManifestUp()) {
|
||||
hasTransformed = gameCard.turnFaceUp(true, true, sa);
|
||||
} else if ("Specialize".equals(mode)) {
|
||||
hasTransformed = gameCard.changeCardState(mode, host.getChosenColor(), sa);
|
||||
host.setChosenColors(null);
|
||||
} else {
|
||||
hasTransformed = gameCard.changeCardState(mode, sa.getParam("NewState"), sa);
|
||||
if (gameCard.isFaceDown() && (sa.hasParam("FaceDownPower") || sa.hasParam("FaceDownToughness")
|
||||
@@ -193,6 +210,17 @@ public class SetStateEffect extends SpellAbilityEffect {
|
||||
}
|
||||
if (!gameCard.isDoubleFaced())
|
||||
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);
|
||||
|
||||
@@ -212,6 +212,8 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
|
||||
private boolean foretoldThisTurn;
|
||||
private boolean foretoldByEffect;
|
||||
|
||||
private boolean specialized;
|
||||
|
||||
private int timesCrewedThisTurn = 0;
|
||||
|
||||
private int classLevel = 1;
|
||||
@@ -336,6 +338,8 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
|
||||
private ReplacementEffect shieldCounterReplaceDestroy = null;
|
||||
private ReplacementEffect stunCounterReplaceUntap = null;
|
||||
|
||||
private Integer readAhead = null;
|
||||
|
||||
// Enumeration for CMC request types
|
||||
public enum SplitCMCMode {
|
||||
CurrentSideCMC,
|
||||
@@ -661,6 +665,20 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
|
||||
}
|
||||
} else if (mode.equals("Meld") && isMeldable()) {
|
||||
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;
|
||||
}
|
||||
@@ -1389,7 +1407,7 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
|
||||
}
|
||||
|
||||
@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;
|
||||
if (addAmount <= 0 || !canReceiveCounters(counterType)) {
|
||||
// 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);
|
||||
runParams.put(AbilityKey.Source, source);
|
||||
runParams.put(AbilityKey.CounterType, counterType);
|
||||
if (params != null) {
|
||||
runParams.putAll(params);
|
||||
}
|
||||
for (int i = 0; i < addAmount; i++) {
|
||||
runParams.put(AbilityKey.CounterAmount, oldValue + i + 1);
|
||||
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("Eternalize") || keyword.startsWith("Reinforce")
|
||||
|| 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("Cycling") || keyword.startsWith("TypeCycling")
|
||||
|| 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
|
||||
} else if (keyword.equals("Unblockable")) {
|
||||
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() {
|
||||
if (isFlipped() && hasState(CardStateName.Flipped)) {
|
||||
return CardStateName.Flipped;
|
||||
} else if (isSpecialized()) {
|
||||
return getCurrentStateName();
|
||||
} else if (backside && hasBackSide()) {
|
||||
CardStateName stateName = getRules().getSplitType().getChangedStateName();
|
||||
if (hasState(stateName)) {
|
||||
@@ -4501,7 +4525,7 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
public final void addKeywordForStaticAbility(KeywordInterface kw) {
|
||||
if (kw.getStaticId() > 0) {
|
||||
storedKeywords.put(kw.getStaticId(), kw.getOriginal(), kw);
|
||||
@@ -5730,6 +5754,16 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
|
||||
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() {
|
||||
return timesCrewedThisTurn;
|
||||
}
|
||||
@@ -7103,4 +7137,11 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
|
||||
}
|
||||
return StaticAbilityIgnoreLegendRule.ignoreLegendRule(this);
|
||||
}
|
||||
|
||||
public Integer getReadAhead() {
|
||||
return readAhead;
|
||||
}
|
||||
public void setReadAhead(int value) {
|
||||
readAhead = value;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -104,7 +104,7 @@ public class CardDamageMap extends ForwardingTable<Card, GameEntity, Integer> {
|
||||
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()) {
|
||||
int sum = 0;
|
||||
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());
|
||||
|
||||
// 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) {
|
||||
damaged.getKey().setHasBeenDealtExcessDamageThisTurn(true);
|
||||
// Run triggers
|
||||
|
||||
@@ -97,6 +97,7 @@ public class CardFactory {
|
||||
out.setAttachedCards(in.getAttachedCards());
|
||||
out.setEntityAttachedTo(in.getEntityAttachedTo());
|
||||
|
||||
out.setSpecialized(in.isSpecialized());
|
||||
out.addRemembered(in.getRemembered());
|
||||
out.addImprintedCards(in.getImprintedCards());
|
||||
out.setCommander(in.isRealCommander());
|
||||
@@ -364,7 +365,33 @@ public class CardFactory {
|
||||
|
||||
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.setState(st.getChangedStateName(), false);
|
||||
if (rules.getOtherPart() != null) {
|
||||
|
||||
@@ -1697,7 +1697,7 @@ public class CardFactoryUtil {
|
||||
parsedTrigger.setOverridingAbility(sa);
|
||||
|
||||
inst.addTrigger(parsedTrigger);
|
||||
} else if (keyword.startsWith("Saga")) {
|
||||
} else if (keyword.startsWith("Saga") || keyword.startsWith("Read ahead")) {
|
||||
final String[] k = keyword.split(":");
|
||||
final List<String> abs = Arrays.asList(k[2].split(","));
|
||||
if (abs.size() != Integer.valueOf(k[1])) {
|
||||
@@ -1724,9 +1724,10 @@ public class CardFactoryUtil {
|
||||
for (int i = idx; i <= skipId; i++) {
|
||||
SpellAbility sa = AbilityFactory.getAbility(card, ab);
|
||||
sa.setChapter(i);
|
||||
sa.setLastChapter(idx == abs.size());
|
||||
|
||||
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) {
|
||||
trigStr.append(" | Secondary$ True");
|
||||
}
|
||||
@@ -2311,6 +2312,23 @@ public class CardFactoryUtil {
|
||||
re.getOverridingAbility().setSVar("Sunburst", "Count$Converge");
|
||||
}
|
||||
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")) {
|
||||
String repeffstr = "Event$ Moved | ValidLKI$ Card.Self+wasCastFromHand+YouOwn+YouCtrl "
|
||||
+ " | Origin$ Stack | Destination$ Graveyard | Fizzle$ False "
|
||||
@@ -3215,6 +3233,22 @@ public class CardFactoryUtil {
|
||||
final AbilitySub cleanSub = (AbilitySub) AbilityFactory.getAbility(cleanStr, card);
|
||||
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);
|
||||
inst.addSpellAbility(sa);
|
||||
} else if (keyword.startsWith("Spectacle")) {
|
||||
|
||||
@@ -267,6 +267,8 @@ public enum CounterEnumType {
|
||||
|
||||
PHYLACTERY("PHYLA", 117, 219, 153),
|
||||
|
||||
PHYRESIS("PHYRE", 125, 97, 128),
|
||||
|
||||
POINT("POINT", 153, 255, 130),
|
||||
|
||||
POLYP("POLYP", 236, 185, 198),
|
||||
|
||||
@@ -341,6 +341,13 @@ public class Cost implements Serializable {
|
||||
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<")) {
|
||||
final String[] splitStr = abCostParse(parse, 1);
|
||||
return new CostChooseCreatureType(splitStr[0]);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -166,7 +166,9 @@ public class CostDiscard extends CostPartWithList {
|
||||
sameName = true;
|
||||
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
|
||||
handList = CardLists.getValidCards(handList, type.split(";"), payer, source, ability);
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ package forge.game.cost;
|
||||
public interface ICostVisitor<T> {
|
||||
|
||||
T visit(CostGainControl cost);
|
||||
T visit(CostChooseColor cost);
|
||||
T visit(CostChooseCreatureType cost);
|
||||
T visit(CostDiscard cost);
|
||||
T visit(CostDamage cost);
|
||||
@@ -40,6 +41,11 @@ public interface ICostVisitor<T> {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public T visit(CostChooseColor cost) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public T visit(CostChooseCreatureType cost) {
|
||||
return null;
|
||||
|
||||
@@ -13,6 +13,7 @@ import forge.util.TextUtil;
|
||||
public class PaymentDecision {
|
||||
public int c = 0;
|
||||
public String type;
|
||||
public List<String> colors;
|
||||
|
||||
public final CardCollection cards = new CardCollection();
|
||||
public final List<Mana> mana;
|
||||
@@ -48,6 +49,11 @@ public class PaymentDecision {
|
||||
type = choice;
|
||||
}
|
||||
|
||||
public PaymentDecision(List<String> choices) {
|
||||
this(null, null, null, null, null);
|
||||
colors = choices;
|
||||
}
|
||||
|
||||
public static PaymentDecision card(Card chosen) {
|
||||
return new PaymentDecision(chosen);
|
||||
}
|
||||
@@ -88,6 +94,10 @@ public class PaymentDecision {
|
||||
return new PaymentDecision(choice);
|
||||
}
|
||||
|
||||
public static PaymentDecision colors(List<String> choices) {
|
||||
return new PaymentDecision(choices);
|
||||
}
|
||||
|
||||
public static PaymentDecision players(List<Player> players) {
|
||||
return new PaymentDecision(null, null, players, null, null);
|
||||
}
|
||||
|
||||
@@ -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."),
|
||||
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."),
|
||||
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."),
|
||||
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."),
|
||||
|
||||
@@ -7,7 +7,8 @@ public class KeywordWithCost extends KeywordInstance<KeywordWithCost> {
|
||||
|
||||
@Override
|
||||
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
|
||||
|
||||
@@ -835,7 +835,8 @@ public class Player extends GameEntity implements Comparable<Player> {
|
||||
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;
|
||||
if (addAmount <= 0 || !canReceiveCounters(counterType)) {
|
||||
// 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);
|
||||
runParams.put(AbilityKey.Source, source);
|
||||
runParams.put(AbilityKey.CounterType, counterType);
|
||||
if (params != null) {
|
||||
runParams.putAll(params);
|
||||
}
|
||||
for (int i = 0; i < addAmount; i++) {
|
||||
runParams.put(AbilityKey.CounterAmount, oldValue + i + 1);
|
||||
getGame().getTriggerHandler().runTrigger(TriggerType.CounterAdded, AbilityKey.newMap(runParams), false);
|
||||
|
||||
@@ -135,6 +135,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
|
||||
private boolean cumulativeupkeep = false;
|
||||
private boolean blessing = false;
|
||||
private Integer chapter = null;
|
||||
private boolean lastChapter = false;
|
||||
|
||||
/** The pay costs. */
|
||||
private Cost payCosts;
|
||||
@@ -1066,6 +1067,13 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
|
||||
chapter = val;
|
||||
}
|
||||
|
||||
public boolean isLastChapter() {
|
||||
return lastChapter;
|
||||
}
|
||||
public boolean setLastChapter(boolean value) {
|
||||
return lastChapter = value;
|
||||
}
|
||||
|
||||
public StaticAbility getMayPlay() {
|
||||
return mayPlay;
|
||||
}
|
||||
@@ -1129,6 +1137,9 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
|
||||
clone.paidAbilities = Lists.newArrayList();
|
||||
clone.setPaidHash(Maps.newHashMap(getPaidHash()));
|
||||
|
||||
// copy last chapter flag for Trigger
|
||||
clone.lastChapter = this.lastChapter;
|
||||
|
||||
if (usesTargeting()) {
|
||||
// the targets need to be cloned, otherwise they might be cleared
|
||||
clone.targetChosen = getTargets().clone();
|
||||
|
||||
@@ -19,7 +19,6 @@ package forge.game.trigger;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.google.common.collect.Iterables;
|
||||
import forge.game.Game;
|
||||
import forge.game.ability.AbilityKey;
|
||||
import forge.game.card.Card;
|
||||
import forge.game.card.CardZoneTable;
|
||||
@@ -54,8 +53,8 @@ public class TriggerAbilityTriggered extends Trigger {
|
||||
return false;
|
||||
}
|
||||
final Card source = spellAbility.getHostCard();
|
||||
@SuppressWarnings("unchecked")
|
||||
final Iterable<Card> causes = (Iterable<Card>) runParams.get(AbilityKey.Cause);
|
||||
final Game game = source.getGame();
|
||||
|
||||
if (hasParam("ValidMode")) {
|
||||
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)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -102,6 +102,7 @@ public enum TriggerType {
|
||||
SearchedLibrary(TriggerSearchedLibrary.class),
|
||||
SetInMotion(TriggerSetInMotion.class),
|
||||
Shuffled(TriggerShuffled.class),
|
||||
Specializes(TriggerSpecializes.class),
|
||||
SpellAbilityCast(TriggerSpellAbilityCastOrCopy.class),
|
||||
SpellAbilityCopy(TriggerSpellAbilityCastOrCopy.class),
|
||||
SpellCast(TriggerSpellAbilityCastOrCopy.class),
|
||||
|
||||
@@ -286,19 +286,30 @@ public class WrappedAbility extends Ability {
|
||||
return sa.isCycling();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean isChapter() {
|
||||
return sa.isChapter();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Integer getChapter() {
|
||||
return sa.getChapter();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setChapter(int val) {
|
||||
sa.setChapter(val);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLastChapter() {
|
||||
return sa.isLastChapter();
|
||||
}
|
||||
@Override
|
||||
public boolean setLastChapter(boolean value) {
|
||||
return sa.setLastChapter(value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isFlashBackAbility() {
|
||||
return sa.isFlashBackAbility();
|
||||
@@ -566,4 +577,5 @@ public class WrappedAbility extends Ability {
|
||||
public void setChosenList(List<AbilitySub> choices) {
|
||||
sa.setChosenList(choices);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -230,7 +230,7 @@ public class GameSimulationTest extends SimulationTest {
|
||||
Game game = initAndCreateGame();
|
||||
Player p = game.getPlayers().get(1);
|
||||
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.getAction().checkStateEffects(true);
|
||||
@@ -275,7 +275,7 @@ public class GameSimulationTest extends SimulationTest {
|
||||
String bearCardName = "Runeclaw Bear";
|
||||
addCard(bearCardName, 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.getAction().checkStateEffects(true);
|
||||
@@ -404,7 +404,7 @@ public class GameSimulationTest extends SimulationTest {
|
||||
Game game = initAndCreateGame();
|
||||
Player p = game.getPlayers().get(1);
|
||||
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.getAction().checkStateEffects(true);
|
||||
|
||||
@@ -439,7 +439,7 @@ public class GameSimulationTest extends SimulationTest {
|
||||
addCard(ornithoperCardName, p);
|
||||
addCard(bearCardName, 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.getAction().checkStateEffects(true);
|
||||
|
||||
@@ -472,7 +472,7 @@ public class GameSimulationTest extends SimulationTest {
|
||||
SpellAbility boltSA = boltCard.getFirstSpellAbility();
|
||||
|
||||
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.getAction().checkStateEffects(true);
|
||||
|
||||
@@ -523,7 +523,7 @@ public class GameSimulationTest extends SimulationTest {
|
||||
addCard("Swamp", p);
|
||||
addCard("Swamp", 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);
|
||||
game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p);
|
||||
game.getAction().checkStateEffects(true);
|
||||
@@ -2256,7 +2256,7 @@ public class GameSimulationTest extends SimulationTest {
|
||||
Player p = game.getPlayers().get(0);
|
||||
|
||||
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(leylineCardName, p);
|
||||
for (int i = 0; i < 2; ++i) {
|
||||
@@ -2301,7 +2301,7 @@ public class GameSimulationTest extends SimulationTest {
|
||||
}
|
||||
|
||||
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);
|
||||
Card pridemate = addCard(pridemateName, p1);
|
||||
Card indestructibility = addCard(indestructibilityName, p1);
|
||||
|
||||
@@ -4,7 +4,7 @@ Types:Legendary Creature Halfling Rogue
|
||||
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.
|
||||
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
|
||||
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.)
|
||||
|
||||
@@ -2,8 +2,8 @@ Name:Alpha Brawl
|
||||
ManaCost:6 R R
|
||||
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.
|
||||
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: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: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.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.
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
SVar:X:Count$CardPower
|
||||
|
||||
@@ -4,6 +4,6 @@ Types:Creature Human Knight
|
||||
PT:2/1
|
||||
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.
|
||||
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
|
||||
Oracle:As Dauntless Bodyguard enters the battlefield, choose another creature you control.\nSacrifice Dauntless Bodyguard: The chosen creature gains indestructible until end of turn.
|
||||
|
||||
@@ -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: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
|
||||
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
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
AI:RemoveDeck:All
|
||||
|
||||
@@ -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
|
||||
S:Mode$ Continuous | MayPlay$ True | Affected$ Card.IsRemembered | AffectedZone$ Exile
|
||||
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
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
A:AB$ Regenerate | Cost$ Sac<1/Human> | SpellDescription$ Regenerate CARDNAME.
|
||||
|
||||
@@ -3,7 +3,7 @@ ManaCost:no cost
|
||||
Types:Land Gate
|
||||
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$ 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
|
||||
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.")
|
||||
|
||||
@@ -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 | 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
|
||||
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
|
||||
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.
|
||||
|
||||
@@ -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
|
||||
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
|
||||
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
|
||||
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.
|
||||
|
||||
@@ -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.
|
||||
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
|
||||
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
|
||||
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.
|
||||
|
||||
@@ -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
|
||||
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
|
||||
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
|
||||
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.
|
||||
|
||||
@@ -3,7 +3,7 @@ ManaCost:6 R R
|
||||
Types:Creature Elemental
|
||||
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.
|
||||
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.
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
SVar:X:Count$CardPower
|
||||
|
||||
@@ -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:DBExileSelf:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile
|
||||
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
|
||||
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.
|
||||
|
||||
@@ -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.
|
||||
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
|
||||
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
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
K:Crew:3
|
||||
|
||||
@@ -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
|
||||
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
|
||||
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
|
||||
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.
|
||||
|
||||
14
forge-gui/res/cardsfolder/r/racketeer_boss.txt
Normal file
14
forge-gui/res/cardsfolder/r/racketeer_boss.txt
Normal 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."
|
||||
@@ -4,7 +4,7 @@ Types:Creature Beast
|
||||
PT:3/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.
|
||||
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:GigantotheriumFight:DB$ DealDamage | DamageSource$ Imprinted | NumDmg$ Y | Defined$ Self | StackDescription$ None
|
||||
SVar:FirePower:Count$CardPower
|
||||
|
||||
@@ -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
|
||||
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
|
||||
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
|
||||
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.
|
||||
|
||||
@@ -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
|
||||
#TODO make the sacrifice part as another delayed Trigger
|
||||
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.
|
||||
SVar:Sacrifice:DB$ SacrificeAll | ValidCards$ Card.IsRemembered | Controller$ You | SubAbility$ DBCleanup
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
|
||||
@@ -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.
|
||||
SVar:X:Count$LifeOppsLostThisTurn
|
||||
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
|
||||
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.
|
||||
|
||||
10
forge-gui/res/cardsfolder/upcoming/academy_loremaster.txt
Normal file
10
forge-gui/res/cardsfolder/upcoming/academy_loremaster.txt
Normal 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
|
||||
8
forge-gui/res/cardsfolder/upcoming/academy_wall.txt
Normal file
8
forge-gui/res/cardsfolder/upcoming/academy_wall.txt
Normal 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.
|
||||
8
forge-gui/res/cardsfolder/upcoming/activated_sleeper.txt
Normal file
8
forge-gui/res/cardsfolder/upcoming/activated_sleeper.txt
Normal 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.
|
||||
@@ -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.
|
||||
86
forge-gui/res/cardsfolder/upcoming/alora_rogue_companion.txt
Normal file
86
forge-gui/res/cardsfolder/upcoming/alora_rogue_companion.txt
Normal 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.
|
||||
14
forge-gui/res/cardsfolder/upcoming/anointed_peacekeeper.txt
Normal file
14
forge-gui/res/cardsfolder/upcoming/anointed_peacekeeper.txt
Normal 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.
|
||||
11
forge-gui/res/cardsfolder/upcoming/arcane_archery.txt
Normal file
11
forge-gui/res/cardsfolder/upcoming/arcane_archery.txt
Normal 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."
|
||||
8
forge-gui/res/cardsfolder/upcoming/argivian_phalanx.txt
Normal file
8
forge-gui/res/cardsfolder/upcoming/argivian_phalanx.txt
Normal 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
|
||||
@@ -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.)
|
||||
11
forge-gui/res/cardsfolder/upcoming/balduvian_atrocity.txt
Normal file
11
forge-gui/res/cardsfolder/upcoming/balduvian_atrocity.txt
Normal 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.
|
||||
10
forge-gui/res/cardsfolder/upcoming/baru_wurmspeaker.txt
Normal file
10
forge-gui/res/cardsfolder/upcoming/baru_wurmspeaker.txt
Normal 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
|
||||
11
forge-gui/res/cardsfolder/upcoming/battlewing_mystic.txt
Normal file
11
forge-gui/res/cardsfolder/upcoming/battlewing_mystic.txt
Normal 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.
|
||||
9
forge-gui/res/cardsfolder/upcoming/benalish_sleeper.txt
Normal file
9
forge-gui/res/cardsfolder/upcoming/benalish_sleeper.txt
Normal 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.
|
||||
@@ -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.
|
||||
9
forge-gui/res/cardsfolder/upcoming/blight_pile.txt
Normal file
9
forge-gui/res/cardsfolder/upcoming/blight_pile.txt
Normal 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.
|
||||
10
forge-gui/res/cardsfolder/upcoming/bog_badger.txt
Normal file
10
forge-gui/res/cardsfolder/upcoming/bog_badger.txt
Normal 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.)
|
||||
12
forge-gui/res/cardsfolder/upcoming/bortuk_bonerattle.txt
Normal file
12
forge-gui/res/cardsfolder/upcoming/bortuk_bonerattle.txt
Normal 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.
|
||||
11
forge-gui/res/cardsfolder/upcoming/briar_hydra.txt
Normal file
11
forge-gui/res/cardsfolder/upcoming/briar_hydra.txt
Normal 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.
|
||||
11
forge-gui/res/cardsfolder/upcoming/cadric_soul_kindler.txt
Normal file
11
forge-gui/res/cardsfolder/upcoming/cadric_soul_kindler.txt
Normal 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.
|
||||
@@ -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.
|
||||
7
forge-gui/res/cardsfolder/upcoming/citizens_arrest.txt
Normal file
7
forge-gui/res/cardsfolder/upcoming/citizens_arrest.txt
Normal 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.
|
||||
12
forge-gui/res/cardsfolder/upcoming/cleaving_skyrider.txt
Normal file
12
forge-gui/res/cardsfolder/upcoming/cleaving_skyrider.txt
Normal 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.
|
||||
7
forge-gui/res/cardsfolder/upcoming/colossal_growth.txt
Normal file
7
forge-gui/res/cardsfolder/upcoming/colossal_growth.txt
Normal 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.
|
||||
@@ -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.
|
||||
8
forge-gui/res/cardsfolder/upcoming/cosmic_epiphany.txt
Normal file
8
forge-gui/res/cardsfolder/upcoming/cosmic_epiphany.txt
Normal 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.
|
||||
11
forge-gui/res/cardsfolder/upcoming/emperor_mihail_ii.txt
Normal file
11
forge-gui/res/cardsfolder/upcoming/emperor_mihail_ii.txt
Normal 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.
|
||||
5
forge-gui/res/cardsfolder/upcoming/geothermal_bog.txt
Normal file
5
forge-gui/res/cardsfolder/upcoming/geothermal_bog.txt
Normal 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.
|
||||
@@ -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.
|
||||
@@ -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-Sorcerer’s 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.
|
||||
|
||||
5
forge-gui/res/cardsfolder/upcoming/haunted_mire.txt
Normal file
5
forge-gui/res/cardsfolder/upcoming/haunted_mire.txt
Normal 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.
|
||||
@@ -4,7 +4,7 @@ Types:Legendary Creature Human Warrior
|
||||
PT:3/3
|
||||
K:Desertwalk
|
||||
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
|
||||
DeckHas:Ability$Token
|
||||
DeckHints:Type$Desert
|
||||
|
||||
10
forge-gui/res/cardsfolder/upcoming/historians_boon.txt
Normal file
10
forge-gui/res/cardsfolder/upcoming/historians_boon.txt
Normal 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 Historian’s 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.
|
||||
@@ -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.
|
||||
5
forge-gui/res/cardsfolder/upcoming/iridian_maelstrom.txt
Normal file
5
forge-gui/res/cardsfolder/upcoming/iridian_maelstrom.txt
Normal 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.
|
||||
@@ -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.)
|
||||
@@ -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}.
|
||||
12
forge-gui/res/cardsfolder/upcoming/jodah_the_unifier.txt
Normal file
12
forge-gui/res/cardsfolder/upcoming/jodah_the_unifier.txt
Normal 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
|
||||
@@ -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.
|
||||
12
forge-gui/res/cardsfolder/upcoming/king_darien_xlviii.txt
Normal file
12
forge-gui/res/cardsfolder/upcoming/king_darien_xlviii.txt
Normal 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.
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
78
forge-gui/res/cardsfolder/upcoming/lukamina_moon_druid.txt
Normal file
78
forge-gui/res/cardsfolder/upcoming/lukamina_moon_druid.txt
Normal 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.
|
||||
8
forge-gui/res/cardsfolder/upcoming/mind_spike.txt
Normal file
8
forge-gui/res/cardsfolder/upcoming/mind_spike.txt
Normal 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.
|
||||
5
forge-gui/res/cardsfolder/upcoming/molten_tributary.txt
Normal file
5
forge-gui/res/cardsfolder/upcoming/molten_tributary.txt
Normal 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.
|
||||
9
forge-gui/res/cardsfolder/upcoming/ohabi_caleria.txt
Normal file
9
forge-gui/res/cardsfolder/upcoming/ohabi_caleria.txt
Normal 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.
|
||||
12
forge-gui/res/cardsfolder/upcoming/orca_siege_demon.txt
Normal file
12
forge-gui/res/cardsfolder/upcoming/orca_siege_demon.txt
Normal 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
Reference in New Issue
Block a user