mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-20 20:58:03 +00:00
Merge branch 'Card-Forge:master' into master
This commit is contained in:
@@ -305,8 +305,6 @@ public abstract class GameState {
|
||||
newText.append("|Meld");
|
||||
} else if (c.getCurrentStateName().equals(CardStateName.Modal)) {
|
||||
newText.append("|Modal");
|
||||
} else if (c.getCurrentStateName().equals(CardStateName.Converted)) {
|
||||
newText.append("|Converted");
|
||||
}
|
||||
|
||||
if (c.getPlayerAttachedTo() != null) {
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package forge;
|
||||
|
||||
import forge.card.CardEdition;
|
||||
import forge.item.PaperCard;
|
||||
import forge.util.FileUtil;
|
||||
import forge.util.TextUtil;
|
||||
@@ -38,6 +39,8 @@ public final class ImageKeys {
|
||||
private static Map<String, String> CACHE_CARD_PICS_SUBDIR;
|
||||
|
||||
private static Map<String, Boolean> editionImageLookup = new HashMap<>();
|
||||
|
||||
private static Map<String, String> editionAlias = new HashMap<>();
|
||||
private static Set<String> toFind = new HashSet<>();
|
||||
|
||||
private static boolean isLibGDXPort = false;
|
||||
@@ -187,6 +190,19 @@ public final class ImageKeys {
|
||||
toFind.remove(filename);
|
||||
}
|
||||
}
|
||||
String setCode = filename.contains("/") ? filename.substring(0, filename.indexOf("/")) : "";
|
||||
if (!setCode.isEmpty() && editionAlias.containsKey(setCode)) {
|
||||
file = findFile(dir, TextUtil.fastReplace(filename, setCode + "/", editionAlias.get(setCode) + "/"));
|
||||
if (file != null) {
|
||||
cachedCards.put(filename, file);
|
||||
return file;
|
||||
}
|
||||
file = findFile(dir, TextUtil.fastReplace(fullborderFile, setCode + "/", editionAlias.get(setCode) + "/"));
|
||||
if (file != null) {
|
||||
cachedCards.put(filename, file);
|
||||
return file;
|
||||
}
|
||||
}
|
||||
}
|
||||
//if an image, like phenomenon or planes is missing .full in their filenames but you have an existing images that have .full/.fullborder
|
||||
if (!filename.contains(".full")) {
|
||||
@@ -355,6 +371,11 @@ public final class ImageKeys {
|
||||
Boolean editionHasImage = editionImageLookup.get(pc.getEdition());
|
||||
if (editionHasImage == null) {
|
||||
String setFolder = getSetFolder(pc.getEdition());
|
||||
CardEdition ed = StaticData.instance().getEditions().get(setFolder);
|
||||
if (ed != null && !editionAlias.containsKey(setFolder)) {
|
||||
String alias = ed.getAlias();
|
||||
editionAlias.put(setFolder, alias == null ? ed.getCode() : alias);
|
||||
}
|
||||
editionHasImage = FileUtil.isDirectoryWithFiles(CACHE_CARD_PICS_DIR + setFolder);
|
||||
editionImageLookup.put(pc.getEdition(), editionHasImage);
|
||||
if (editionHasImage) {
|
||||
|
||||
@@ -5,7 +5,6 @@ import forge.card.CardFace.FaceSelectionMethod;
|
||||
public enum CardSplitType
|
||||
{
|
||||
None(FaceSelectionMethod.USE_PRIMARY_FACE, null),
|
||||
Convert(FaceSelectionMethod.USE_ACTIVE_FACE, CardStateName.Converted),
|
||||
Transform(FaceSelectionMethod.USE_ACTIVE_FACE, CardStateName.Transformed),
|
||||
Meld(FaceSelectionMethod.USE_ACTIVE_FACE, CardStateName.Meld),
|
||||
Split(FaceSelectionMethod.COMBINE, CardStateName.RightSplit),
|
||||
|
||||
@@ -403,7 +403,7 @@ public class PaperCard implements Comparable<IPaperCard>, InventoryItemFromSet,
|
||||
public boolean hasBackFace(){
|
||||
CardSplitType cst = this.rules.getSplitType();
|
||||
return cst == CardSplitType.Transform || cst == CardSplitType.Flip || cst == CardSplitType.Meld
|
||||
|| cst == CardSplitType.Modal || cst == CardSplitType.Convert;
|
||||
|| cst == CardSplitType.Modal;
|
||||
}
|
||||
|
||||
// Return true if card is one of the five basic lands that can be added for free
|
||||
|
||||
@@ -275,28 +275,6 @@ public final class GameActionUtil {
|
||||
foretold.setPayCosts(new Cost(k[1], false));
|
||||
|
||||
alternatives.add(foretold);
|
||||
} else if (keyword.startsWith("More Than Meets the Eye")) {
|
||||
final String[] k = keyword.split(":");
|
||||
final Cost convertCost = new Cost(k[1], true);
|
||||
|
||||
final SpellAbility newSA = new SpellPermanent(source);
|
||||
newSA.setCardState(source.getAlternateState());
|
||||
newSA.setPayCosts(convertCost);
|
||||
newSA.setActivatingPlayer(activator);
|
||||
|
||||
newSA.putParam("PrecostDesc", k[0] + " ");
|
||||
newSA.putParam("CostDesc", convertCost.toString());
|
||||
|
||||
// makes new SpellDescription
|
||||
final StringBuilder desc = new StringBuilder();
|
||||
desc.append(newSA.getCostDescription());
|
||||
desc.append("(").append(inst.getReminderText()).append(")");
|
||||
newSA.setDescription(desc.toString());
|
||||
newSA.putParam("AfterDescription", "(Converted)");
|
||||
|
||||
newSA.setAlternativeCost(AlternativeCost.MTMtE);
|
||||
|
||||
alternatives.add(newSA);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -43,7 +43,7 @@ public class ActivateAbilityEffect extends SpellAbilityEffect {
|
||||
continue;
|
||||
}
|
||||
|
||||
List<Card> list = CardLists.getType(p.getCardsIn(ZoneType.Battlefield), sa.getParamOrDefault("Type", "Card"));
|
||||
List<Card> list = CardLists.getType(p.getCardsIn(ZoneType.Battlefield), sa.getParamOrDefault("Type", "Card"));
|
||||
for (Card c : list) {
|
||||
List<SpellAbility> possibleAb = Lists.newArrayList(c.getAllPossibleAbilities(p, true));
|
||||
if (isManaAb) {
|
||||
|
||||
@@ -12,7 +12,7 @@ import forge.game.spellability.SpellAbility;
|
||||
import forge.game.trigger.Trigger;
|
||||
import forge.game.trigger.TriggerHandler;
|
||||
|
||||
/**
|
||||
/**
|
||||
* TODO: Write javadoc for this type.
|
||||
*
|
||||
*/
|
||||
|
||||
@@ -27,7 +27,7 @@ public class AssignGroupEffect extends SpellAbilityEffect {
|
||||
protected String getStackDescription(SpellAbility sa) {
|
||||
return sa.getDescription();
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see forge.game.ability.SpellAbilityEffect#resolve(forge.game.spellability.SpellAbility)
|
||||
|
||||
@@ -19,7 +19,7 @@ import forge.game.spellability.SpellAbility;
|
||||
import forge.game.zone.ZoneType;
|
||||
import forge.util.collect.FCollectionView;
|
||||
|
||||
/**
|
||||
/**
|
||||
* TODO: Write javadoc for this type.
|
||||
*
|
||||
*/
|
||||
@@ -62,7 +62,7 @@ public class BalanceEffect extends SpellAbilityEffect {
|
||||
discardedMap.put(p, p.getController().chooseCardsToDiscardFrom(p, sa, validCards.get(i), numToBalance, numToBalance));
|
||||
} else { // Battlefield
|
||||
for (Card card : p.getController().choosePermanentsToSacrifice(sa, numToBalance, numToBalance, validCards.get(i), valid)) {
|
||||
if (null == card) continue;
|
||||
if (null == card) continue;
|
||||
game.getAction().sacrifice(card, sa, true, table, params);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -80,7 +80,7 @@ public class ChangeTargetsEffect extends SpellAbilityEffect {
|
||||
GameObject newTarget = Iterables.getFirst(getDefinedCardsOrTargeted(sa, "DefinedMagnet"), null);
|
||||
|
||||
// CR 115.3. The same target can’t be chosen multiple times for
|
||||
// any one instance of the word “target” on a spell or ability.
|
||||
// any one instance of the word “target” on a spell or ability.
|
||||
if (!oldTargetBlock.contains(newTarget) && replaceIn.getSpellAbility(true).canTarget(newTarget)) {
|
||||
newTargetBlock.remove(oldTarget);
|
||||
newTargetBlock.add(newTarget);
|
||||
|
||||
@@ -585,7 +585,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
|
||||
moveParams.put(AbilityKey.CardLKI, sa.getReplacingObject(AbilityKey.CardLKI));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (sa.hasParam("Tapped") || sa.isNinjutsu()) {
|
||||
gameCard.setTapped(true);
|
||||
}
|
||||
@@ -604,14 +604,6 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (sa.hasParam("Converted")) {
|
||||
if (gameCard.isConvertable()) {
|
||||
gameCard.changeCardState("Convert", null, sa);
|
||||
} else {
|
||||
// If it can't convert, don't change zones.
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (sa.hasParam("WithCountersType")) {
|
||||
CounterType cType = CounterType.getType(sa.getParam("WithCountersType"));
|
||||
int cAmount = AbilityUtils.calculateAmount(hostCard, sa.getParamOrDefault("WithCountersAmount", "1"), sa);
|
||||
|
||||
@@ -105,13 +105,13 @@ public class ChooseCardEffect extends SpellAbilityEffect {
|
||||
}
|
||||
boolean dontRevealToOwner = true;
|
||||
if (sa.hasParam("EachBasicType")) {
|
||||
// Get all lands,
|
||||
// Get all lands,
|
||||
List<Card> land = CardLists.filter(game.getCardsIn(ZoneType.Battlefield), Presets.LANDS);
|
||||
String eachBasic = sa.getParam("EachBasicType");
|
||||
if (eachBasic.equals("Controlled")) {
|
||||
land = CardLists.filterControlledBy(land, p);
|
||||
}
|
||||
|
||||
|
||||
// Choose one of each BasicLand given special place
|
||||
for (final String type : CardType.getBasicTypes()) {
|
||||
final CardCollectionView cl = CardLists.getType(land, type);
|
||||
|
||||
@@ -47,7 +47,7 @@ public class ChooseGenericEffect extends SpellAbilityEffect {
|
||||
}
|
||||
// determine if any of the choices are not valid
|
||||
List<SpellAbility> saToRemove = Lists.newArrayList();
|
||||
|
||||
|
||||
for (SpellAbility saChoice : abilities) {
|
||||
if (saChoice.getRestrictions() != null && !saChoice.getRestrictions().checkOtherRestrictions(host, saChoice, sa.getActivatingPlayer())) {
|
||||
saToRemove.add(saChoice);
|
||||
@@ -103,7 +103,7 @@ public class ChooseGenericEffect extends SpellAbilityEffect {
|
||||
if (fallback != null) {
|
||||
p.getGame().fireEvent(new GameEventCardModeChosen(p, host.getName(), fallback.getDescription(),
|
||||
sa.hasParam("ShowChoice"), random));
|
||||
AbilityUtils.resolve(fallback);
|
||||
AbilityUtils.resolve(fallback);
|
||||
} else if (!random) {
|
||||
System.err.println("Warning: all Unless costs were unpayable for " + host.getName() +", but it had no FallbackAbility defined. Doing nothing (this is most likely incorrect behavior).");
|
||||
}
|
||||
|
||||
@@ -41,11 +41,11 @@ public class ChooseNumberEffect extends SpellAbilityEffect {
|
||||
final boolean secretlyChoose = sa.hasParam("SecretlyChoose");
|
||||
|
||||
final String sMin = sa.getParamOrDefault("Min", "0");
|
||||
final int min = AbilityUtils.calculateAmount(card, sMin, sa);
|
||||
final int min = AbilityUtils.calculateAmount(card, sMin, sa);
|
||||
final String sMax = sa.getParamOrDefault("Max", "99");
|
||||
final int max = AbilityUtils.calculateAmount(card, sMax, sa);
|
||||
final int max = AbilityUtils.calculateAmount(card, sMax, sa);
|
||||
|
||||
final Map<Player, Integer> chooseMap = Maps.newHashMap();
|
||||
final Map<Player, Integer> chooseMap = Maps.newHashMap();
|
||||
|
||||
for (final Player p : getTargetPlayers(sa)) {
|
||||
if (!p.isInGame()) {
|
||||
@@ -104,7 +104,7 @@ public class ChooseNumberEffect extends SpellAbilityEffect {
|
||||
card.getGame().getAction().notifyOfValue(sa, card, sb.toString(), null);
|
||||
if (sa.hasParam("ChooseNumberSubAbility")) {
|
||||
SpellAbility sub = sa.getAdditionalAbility("ChooseNumberSubAbility");
|
||||
|
||||
|
||||
for (Player p : chooseMap.keySet()) {
|
||||
card.addRemembered(p);
|
||||
card.setChosenNumber(chooseMap.get(p));
|
||||
@@ -112,7 +112,7 @@ public class ChooseNumberEffect extends SpellAbilityEffect {
|
||||
card.clearRemembered();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (sa.hasParam("Lowest")) {
|
||||
SpellAbility sub = sa.getAdditionalAbility("Lowest");
|
||||
|
||||
|
||||
@@ -46,7 +46,7 @@ public class ClashEffect extends SpellAbilityEffect {
|
||||
AbilityUtils.resolve(sub);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Run triggers
|
||||
final Map<AbilityKey, Object> runParams = AbilityKey.mapFromPlayer(player);
|
||||
runParams.put(AbilityKey.Won, player.equals(winner) ? "True" : "False");
|
||||
@@ -68,7 +68,7 @@ public class ClashEffect extends SpellAbilityEffect {
|
||||
* Each clashing player reveals the top card of his or her library, then
|
||||
* puts that card on the top or bottom. A player wins if his or her card
|
||||
* had a higher mana cost.
|
||||
*
|
||||
*
|
||||
* Clash you win or win you don't. There is no tie.
|
||||
*/
|
||||
final Card source = sa.getHostCard();
|
||||
|
||||
@@ -68,7 +68,7 @@ public class CloneEffect extends SpellAbilityEffect {
|
||||
|
||||
// find cloning source i.e. thing to be copied
|
||||
Card cardToCopy = null;
|
||||
|
||||
|
||||
if (sa.hasParam("Choices")) {
|
||||
ZoneType choiceZone = ZoneType.Battlefield;
|
||||
if (sa.hasParam("ChoiceZone")) {
|
||||
|
||||
@@ -279,7 +279,7 @@ public class ControlGainEffect extends SpellAbilityEffect {
|
||||
private static final long serialVersionUID = 878543373519872418L;
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
public void run() {
|
||||
doLoseControl(c, hostCard, tStamp);
|
||||
c.removeChangedSVars(tStamp, 0);
|
||||
}
|
||||
|
||||
@@ -277,7 +277,7 @@ public class CounterEffect extends SpellAbilityEffect {
|
||||
final Card c = tgtSA.getHostCard();
|
||||
final Zone originZone = c.getZone();
|
||||
|
||||
// Run any applicable replacement effects.
|
||||
// Run any applicable replacement effects.
|
||||
final Map<AbilityKey, Object> repParams = AbilityKey.mapFromAffected(tgtSA.getHostCard());
|
||||
repParams.put(AbilityKey.TgtSA, tgtSA);
|
||||
repParams.put(AbilityKey.Cause, srcSA.getHostCard());
|
||||
|
||||
@@ -28,7 +28,7 @@ public class CountersPutOrRemoveEffect extends SpellAbilityEffect {
|
||||
@Override
|
||||
protected String getStackDescription(SpellAbility sa) {
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
final Player pl = sa.hasParam("DefinedPlayer") ?
|
||||
final Player pl = sa.hasParam("DefinedPlayer") ?
|
||||
AbilityUtils.getDefinedPlayers(sa.getHostCard(), sa.getParam("DefinedPlayer"), sa).getFirst()
|
||||
: sa.getActivatingPlayer();
|
||||
sb.append(pl.getName());
|
||||
|
||||
@@ -97,7 +97,7 @@ public class DebuffEffect extends SpellAbilityEffect {
|
||||
}
|
||||
}
|
||||
|
||||
// special for Protection:Card.<color>:Protection from <color>:*
|
||||
// special for Protection:Card.<color>:Protection from <color>:*
|
||||
for (final KeywordInterface inst : tgtC.getUnhiddenKeywords()) {
|
||||
String keyword = inst.getOriginal();
|
||||
if (keyword.startsWith("Protection:")) {
|
||||
|
||||
@@ -110,7 +110,7 @@ public class DelayedTriggerEffect extends SpellAbilityEffect {
|
||||
@Override
|
||||
public void run() {
|
||||
trigHandler.registerDelayedTrigger(delTrig);
|
||||
|
||||
|
||||
}
|
||||
};
|
||||
game.getCleanup().addUntil(upcomingTurnTrig);
|
||||
|
||||
@@ -18,6 +18,7 @@ import forge.game.card.CardZoneTable;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.spellability.SpellAbility;
|
||||
import forge.game.zone.ZoneType;
|
||||
import forge.util.Localizer;
|
||||
import forge.util.TextUtil;
|
||||
|
||||
public class DestroyAllEffect extends SpellAbilityEffect {
|
||||
@@ -46,10 +47,11 @@ public class DestroyAllEffect extends SpellAbilityEffect {
|
||||
public void resolve(SpellAbility sa) {
|
||||
final boolean noRegen = sa.hasParam("NoRegen");
|
||||
final Card card = sa.getHostCard();
|
||||
final boolean isOptional = sa.hasParam("Optional");
|
||||
final Game game = sa.getActivatingPlayer().getGame();
|
||||
final String desc = sa.getParamOrDefault("ValidDescription", "");
|
||||
|
||||
Player targetPlayer = sa.getTargets().getFirstTargetedPlayer();
|
||||
|
||||
String valid = sa.getParamOrDefault("ValidCards", "");
|
||||
|
||||
// Ugh. If calculateAmount needs to be called with DestroyAll it _needs_
|
||||
@@ -76,7 +78,12 @@ public class DestroyAllEffect extends SpellAbilityEffect {
|
||||
if (sa.hasParam("RememberAllObjects")) {
|
||||
card.addRemembered(list);
|
||||
}
|
||||
|
||||
if (list.isEmpty() && isOptional) {
|
||||
return;
|
||||
}
|
||||
if (isOptional && !sa.getActivatingPlayer().getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblWouldYouLikeDestroy", desc), null)) {
|
||||
return;
|
||||
}
|
||||
// exclude cards that can't be destroyed at this moment
|
||||
list = CardLists.filter(list, CardPredicates.Presets.CAN_BE_DESTROYED);
|
||||
|
||||
|
||||
@@ -344,7 +344,7 @@ public class DigEffect extends SpellAbilityEffect {
|
||||
}
|
||||
} else {
|
||||
String prompt;
|
||||
|
||||
|
||||
if (sa.hasParam("PrimaryPrompt")) {
|
||||
prompt = sa.getParam("PrimaryPrompt");
|
||||
} else {
|
||||
|
||||
@@ -224,7 +224,7 @@ public class FlipCoinEffect extends SpellAbilityEffect {
|
||||
* <p>
|
||||
* flipCoinNoCall Flip a coin without any call.
|
||||
* </p>
|
||||
*
|
||||
*
|
||||
* @param sa the source card.
|
||||
* @param flipper the player flipping the coin.
|
||||
* @param multiplier
|
||||
@@ -246,7 +246,7 @@ public class FlipCoinEffect extends SpellAbilityEffect {
|
||||
}
|
||||
flipper.getGame().getAction().notifyOfValue(sa, flipper, result ? Localizer.getInstance().getMessage("lblHeads") : Localizer.getInstance().getMessage("lblTails"), null);
|
||||
} while (sa.hasParam("FlipUntilYouLose") && result != false);
|
||||
|
||||
|
||||
if (sa.hasParam("FlipUntilYouLose") && sa.hasAdditionalAbility("LoseSubAbility")) {
|
||||
sa.getAdditionalAbility("LoseSubAbility").setSVar(varName, "Number$" + numSuccesses);
|
||||
}
|
||||
@@ -258,7 +258,7 @@ public class FlipCoinEffect extends SpellAbilityEffect {
|
||||
* <p>
|
||||
* flipCoinCall.
|
||||
* </p>
|
||||
*
|
||||
*
|
||||
* @param caller
|
||||
* @param sa
|
||||
* @param multiplier
|
||||
@@ -297,7 +297,7 @@ public class FlipCoinEffect extends SpellAbilityEffect {
|
||||
runParams.put(AbilityKey.Result, wonFlip);
|
||||
caller.getGame().getTriggerHandler().runTrigger(TriggerType.FlippedCoin, runParams, false);
|
||||
} while (sa.hasParam("FlipUntilYouLose") && wonFlip);
|
||||
|
||||
|
||||
if (sa.hasParam("FlipUntilYouLose") && sa.hasAdditionalAbility("LoseSubAbility")) {
|
||||
sa.getAdditionalAbility("LoseSubAbility").setSVar(varName, "Number$" + numSuccesses);
|
||||
}
|
||||
|
||||
@@ -42,7 +42,7 @@ public class ManaReflectedEffect extends SpellAbilityEffect {
|
||||
* <p>
|
||||
* generatedReflectedMana.
|
||||
* </p>
|
||||
*
|
||||
*
|
||||
* @param sa
|
||||
* a {@link forge.game.spellability.SpellAbility} object.
|
||||
* @param colors
|
||||
|
||||
@@ -54,7 +54,7 @@ public class MeldEffect extends SpellAbilityEffect {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (sa.hasParam("Tapped")) {
|
||||
primary.setTapped(true);
|
||||
}
|
||||
|
||||
@@ -66,7 +66,7 @@ public class MultiplePilesEffect extends SpellAbilityEffect {
|
||||
if (!p.isInGame()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
CardCollection pool;
|
||||
if (sa.hasParam("DefinedCards")) {
|
||||
pool = AbilityUtils.getDefinedCards(source, sa.getParam("DefinedCards"), sa);
|
||||
|
||||
@@ -82,7 +82,7 @@ public class MustBlockEffect extends SpellAbilityEffect {
|
||||
}
|
||||
};
|
||||
addUntilCommand(sa, removeBlockingRequirements);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -20,12 +20,12 @@ import forge.util.CardTranslation;
|
||||
import forge.util.Lang;
|
||||
import forge.util.Localizer;
|
||||
|
||||
/**
|
||||
/**
|
||||
* PeekAndReveal is a simplified way of handling something that could be done with Dig and NoMove$.
|
||||
* Kinship cards use this, and many other cards could have simpler scripts by just using PeekAndReveal.
|
||||
*/
|
||||
public class PeekAndRevealEffect extends SpellAbilityEffect {
|
||||
|
||||
|
||||
@Override
|
||||
protected String getStackDescription(SpellAbility sa) {
|
||||
final Player peeker = sa.getActivatingPlayer();
|
||||
@@ -64,10 +64,10 @@ public class PeekAndRevealEffect extends SpellAbilityEffect {
|
||||
String revealValid = sa.getParamOrDefault("RevealValid", "Card");
|
||||
String peekAmount = sa.getParamOrDefault("PeekAmount", "1");
|
||||
int numPeek = AbilityUtils.calculateAmount(source, peekAmount, sa);
|
||||
|
||||
|
||||
List<Player> libraryPlayers = getDefinedPlayersOrTargeted(sa);
|
||||
Player peekingPlayer = sa.getActivatingPlayer();
|
||||
|
||||
|
||||
for (Player libraryToPeek : libraryPlayers) {
|
||||
final PlayerZone library = libraryToPeek.getZone(ZoneType.Library);
|
||||
numPeek = Math.min(numPeek, library.size());
|
||||
@@ -85,10 +85,10 @@ public class PeekAndRevealEffect extends SpellAbilityEffect {
|
||||
CardTranslation.getTranslatedName(source.getName()) + " - " +
|
||||
Localizer.getInstance().getMessage("lblLookingCardFrom"));
|
||||
}
|
||||
|
||||
|
||||
if (doReveal && sa.hasParam("RevealOptional"))
|
||||
doReveal = peekingPlayer.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblRevealCardToOtherPlayers"), null);
|
||||
|
||||
|
||||
if (doReveal) {
|
||||
peekingPlayer.getGame().getAction().reveal(revealableCards, ZoneType.Library, libraryToPeek, !noPeek,
|
||||
CardTranslation.getTranslatedName(source.getName()) + " - " +
|
||||
|
||||
@@ -5,7 +5,7 @@ import forge.game.spellability.SpellAbility;
|
||||
import forge.util.CardTranslation;
|
||||
import forge.util.Localizer;
|
||||
|
||||
/**
|
||||
/**
|
||||
* TODO: Write javadoc for this type.
|
||||
*
|
||||
*/
|
||||
|
||||
@@ -18,7 +18,7 @@ public class PermanentEffect extends SpellAbilityEffect {
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
*
|
||||
* @see
|
||||
* forge.card.abilityfactory.SpellEffect#resolve(forge.card.spellability.
|
||||
* SpellAbility)
|
||||
|
||||
@@ -4,7 +4,7 @@ import forge.game.card.Card;
|
||||
import forge.game.spellability.SpellAbility;
|
||||
import forge.util.CardTranslation;
|
||||
|
||||
/**
|
||||
/**
|
||||
* TODO: Write javadoc for this type.
|
||||
*
|
||||
*/
|
||||
|
||||
@@ -12,7 +12,7 @@ import forge.game.player.Player;
|
||||
import forge.game.spellability.SpellAbility;
|
||||
import forge.util.Lang;
|
||||
|
||||
/**
|
||||
/**
|
||||
* TODO: Write javadoc for this type.
|
||||
*
|
||||
*/
|
||||
|
||||
@@ -101,7 +101,7 @@ public class ProtectEffect extends SpellAbilityEffect {
|
||||
final List<String> choices = getProtectionList(sa);
|
||||
final List<String> gains = new ArrayList<>();
|
||||
final List<Card> tgtCards = getTargetCards(sa);
|
||||
|
||||
|
||||
if (isChoice && !choices.isEmpty()) {
|
||||
Player choser = sa.getActivatingPlayer();
|
||||
if (sa.hasParam("Choser") && sa.getParam("Choser").equals("Controller") && !tgtCards.isEmpty()) {
|
||||
@@ -182,7 +182,7 @@ public class ProtectEffect extends SpellAbilityEffect {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static List<String> getProtectionList(final SpellAbility sa) {
|
||||
final List<String> gains = new ArrayList<>();
|
||||
|
||||
|
||||
@@ -70,7 +70,7 @@ public class PumpAllEffect extends SpellAbilityEffect {
|
||||
if (sa.hasParam("RememberAllPumped")) {
|
||||
sa.getHostCard().addRemembered(tgtC);
|
||||
}
|
||||
|
||||
|
||||
if (!"Permanent".equals(sa.getParam("Duration"))) {
|
||||
// If not Permanent, remove Pumped at EOT
|
||||
final GameCommand untilEOT = new GameCommand() {
|
||||
|
||||
@@ -126,7 +126,7 @@ public class PumpEffect extends SpellAbilityEffect {
|
||||
final List<String> keywords, final long timestamp) {
|
||||
final Card host = sa.getHostCard();
|
||||
final String duration = sa.getParam("Duration");
|
||||
|
||||
|
||||
//if host is not on the battlefield don't apply
|
||||
// Suspend should does Affect the Stack
|
||||
if (((duration != null && duration.startsWith("UntilHostLeavesPlay")) || "UntilLoseControlOfHost".equals(duration))
|
||||
|
||||
@@ -84,7 +84,7 @@ public class RearrangeTopOfLibraryEffect extends SpellAbilityEffect {
|
||||
/**
|
||||
* use this when Human needs to rearrange the top X cards in a player's
|
||||
* library. You may also specify a shuffle when done
|
||||
*
|
||||
*
|
||||
* @param src
|
||||
* the source card
|
||||
* @param player
|
||||
|
||||
@@ -51,7 +51,7 @@ public abstract class RegenerateBaseEffect extends SpellAbilityEffect {
|
||||
}
|
||||
|
||||
if (sa.hasParam("RegenerationTrigger")) {
|
||||
final String str = sa.getSVar(sa.getParam("RegenerationTrigger"));
|
||||
final String str = sa.getSVar(sa.getParam("RegenerationTrigger"));
|
||||
|
||||
SpellAbility trigSA = AbilityFactory.getAbility(str, eff);
|
||||
|
||||
|
||||
@@ -37,7 +37,7 @@ public class RegenerationEffect extends SpellAbilityEffect {
|
||||
|
||||
// Play the Regen sound
|
||||
game.fireEvent(new GameEventCardRegenerated(c));
|
||||
|
||||
|
||||
if (host.isImmutable()) {
|
||||
c.subtractShield(host);
|
||||
host.removeRemembered(c);
|
||||
|
||||
@@ -84,7 +84,7 @@ public class RepeatEachEffect extends SpellAbilityEffect {
|
||||
if (sa.hasParam("ClearRemembered")) {
|
||||
source.clearRemembered();
|
||||
}
|
||||
|
||||
|
||||
if (sa.hasParam("DamageMap")) {
|
||||
sa.setDamageMap(new CardDamageMap());
|
||||
sa.setPreventMap(new CardDamageMap());
|
||||
@@ -210,7 +210,7 @@ public class RepeatEachEffect extends SpellAbilityEffect {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (sa.hasParam("DamageMap")) {
|
||||
game.getAction().dealDamage(false, sa.getDamageMap(), sa.getPreventMap(), sa.getCounterTable(), sa);
|
||||
}
|
||||
|
||||
@@ -33,10 +33,10 @@ public class ReplaceDamageEffect extends SpellAbilityEffect {
|
||||
@SuppressWarnings("unchecked")
|
||||
Map<AbilityKey, Object> originalParams = (Map<AbilityKey, Object>) sa.getReplacingObject(AbilityKey.OriginalParams);
|
||||
Integer dmg = (Integer) sa.getReplacingObject(AbilityKey.DamageAmount);
|
||||
|
||||
|
||||
String varValue = sa.getParamOrDefault("Amount", "1");
|
||||
int prevent = AbilityUtils.calculateAmount(card, varValue, sa);
|
||||
|
||||
|
||||
if (prevent > 0) {
|
||||
int n = Math.min(dmg, prevent);
|
||||
// if the effect has divided shield, use that
|
||||
|
||||
@@ -28,7 +28,7 @@ public class ReplaceManaEffect extends SpellAbilityEffect {
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
Map<AbilityKey, Object> params = (Map<AbilityKey, Object>) sa.getReplacingObject(AbilityKey.OriginalParams);
|
||||
|
||||
|
||||
String replaced = (String)sa.getReplacingObject(AbilityKey.Mana);
|
||||
if (sa.hasParam("ReplaceMana")) {
|
||||
// replace type and amount
|
||||
@@ -49,14 +49,14 @@ public class ReplaceManaEffect extends SpellAbilityEffect {
|
||||
for (byte c : MagicColor.WUBRGC) {
|
||||
String s = MagicColor.toShortString(c);
|
||||
replaced = replaced.replace(s, color);
|
||||
}
|
||||
}
|
||||
} else if (sa.hasParam("ReplaceColor")) {
|
||||
// replace color
|
||||
String color = sa.getParam("ReplaceColor");
|
||||
if ("Chosen".equals(color)) {
|
||||
if (card.hasChosenColor()) {
|
||||
color = MagicColor.toShortString(card.getChosenColor());
|
||||
}
|
||||
}
|
||||
}
|
||||
if (sa.hasParam("ReplaceOnly")) {
|
||||
replaced = replaced.replace(sa.getParam("ReplaceOnly"), color);
|
||||
|
||||
@@ -80,7 +80,7 @@ public class ReplaceTokenEffect extends SpellAbilityEffect {
|
||||
for (Map.Entry<Player, Integer> e : byController.entrySet()) {
|
||||
for (String script : sa.getParam("TokenScript").split(",")) {
|
||||
final Card token = TokenInfo.getProtoType(script, sa, p);
|
||||
|
||||
|
||||
if (token == null) {
|
||||
throw new RuntimeException("don't find Token for TokenScript: " + script);
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ import forge.game.player.Player;
|
||||
import forge.game.spellability.SpellAbility;
|
||||
import forge.util.Localizer;
|
||||
|
||||
/**
|
||||
/**
|
||||
* TODO: Write javadoc for this type.
|
||||
*
|
||||
*/
|
||||
|
||||
@@ -18,8 +18,8 @@ public class ShuffleEffect extends SpellAbilityEffect {
|
||||
if (!p.isInGame()) {
|
||||
continue;
|
||||
}
|
||||
boolean mustShuffle = !optional || sa.getActivatingPlayer().getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblHaveTargetShuffle", p.getName()), null);
|
||||
if (mustShuffle)
|
||||
boolean mustShuffle = !optional || sa.getActivatingPlayer().getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblHaveTargetShuffle", p.getName()), null);
|
||||
if (mustShuffle)
|
||||
p.shuffle(sa);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@ import forge.game.trigger.TriggerType;
|
||||
import forge.game.zone.ZoneType;
|
||||
|
||||
public class SkipPhaseEffect extends SpellAbilityEffect {
|
||||
|
||||
|
||||
@Override
|
||||
protected String getStackDescription(SpellAbility sa) {
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
|
||||
@@ -116,7 +116,7 @@ public class SwitchBlockEffect extends SpellAbilityEffect {
|
||||
} else { // For Sorrow's Path
|
||||
// If targeting blockers but only one remains, this fizzles.
|
||||
if (blockers.size() == 1) return;
|
||||
|
||||
|
||||
final Card blocker1 = blockers.get(0);
|
||||
final Card blocker2 = blockers.get(1);
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@ public class TapOrUntapAllEffect extends SpellAbilityEffect {
|
||||
} else {
|
||||
validCards = getTargetCards(sa);
|
||||
}
|
||||
|
||||
|
||||
if (sa.usesTargeting() || sa.hasParam("Defined")) {
|
||||
validCards = CardLists.filterControlledBy(validCards, getTargetPlayers(sa));
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@ public class TapOrUntapEffect extends SpellAbilityEffect {
|
||||
public void resolve(SpellAbility sa) {
|
||||
final List<Card> tgtCards = getTargetCards(sa);
|
||||
PlayerController pc = sa.getActivatingPlayer().getController();
|
||||
|
||||
|
||||
for (final Card tgtC : tgtCards) {
|
||||
if (!tgtC.isInPlay()) {
|
||||
continue;
|
||||
|
||||
@@ -6,12 +6,12 @@
|
||||
* 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/>.
|
||||
*/
|
||||
|
||||
@@ -21,7 +21,6 @@ import forge.game.ability.AbilityUtils;
|
||||
import forge.game.ability.SpellAbilityEffect;
|
||||
import forge.game.card.Card;
|
||||
import forge.game.card.CardCollection;
|
||||
import forge.game.card.CardCollectionView;
|
||||
import forge.game.card.CardFactory;
|
||||
import forge.game.card.CardUtil;
|
||||
import forge.game.card.CardZoneTable;
|
||||
@@ -104,12 +103,9 @@ public abstract class TokenEffectBase extends SpellAbilityEffect {
|
||||
}
|
||||
List<Card> allTokens = Lists.newArrayList();
|
||||
|
||||
CardCollectionView lastStateBattlefield = game.copyLastStateBattlefield();
|
||||
CardCollectionView lastStateGraveyard = game.copyLastStateGraveyard();
|
||||
|
||||
Map<AbilityKey, Object> moveParams = AbilityKey.newMap();
|
||||
moveParams.put(AbilityKey.LastStateBattlefield, lastStateBattlefield);
|
||||
moveParams.put(AbilityKey.LastStateGraveyard, lastStateGraveyard);
|
||||
moveParams.put(AbilityKey.LastStateBattlefield, game.copyLastStateBattlefield());
|
||||
moveParams.put(AbilityKey.LastStateGraveyard, game.copyLastStateGraveyard());
|
||||
|
||||
for (final Table.Cell<Player, Card, Integer> c : tokenTable.cellSet()) {
|
||||
Card prototype = c.getColumnKey();
|
||||
@@ -156,6 +152,9 @@ public abstract class TokenEffectBase extends SpellAbilityEffect {
|
||||
tok.setCopiedPermanent(prototype);
|
||||
}
|
||||
|
||||
Card lki = CardUtil.getLKICopy(tok);
|
||||
moveParams.put(AbilityKey.CardLKI, lki);
|
||||
|
||||
// Should this be catching the Card that's returned?
|
||||
Card moved = game.getAction().moveToPlay(tok, sa, moveParams);
|
||||
if (moved == null || moved.getZone() == null) {
|
||||
@@ -165,7 +164,8 @@ public abstract class TokenEffectBase extends SpellAbilityEffect {
|
||||
}
|
||||
triggerList.put(ZoneType.None, moved.getZone().getZoneType(), moved);
|
||||
|
||||
creator.addTokensCreatedThisTurn(tok);
|
||||
triggerList.addToken(lki, creator.getNumTokenCreatedThisTurn() == 0);
|
||||
creator.addTokensCreatedThisTurn(lki);
|
||||
|
||||
if (clone) {
|
||||
moved.setCloneOrigin(host);
|
||||
|
||||
@@ -72,7 +72,7 @@ public class TwoPilesEffect extends SpellAbilityEffect {
|
||||
if (!p.isInGame()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
CardCollectionView pool0;
|
||||
if (sa.hasParam("DefinedCards")) {
|
||||
pool0 = AbilityUtils.getDefinedCards(card, sa.getParam("DefinedCards"), sa);
|
||||
|
||||
@@ -72,7 +72,7 @@ public class UntapEffect extends SpellAbilityEffect {
|
||||
* <p>
|
||||
* Choose cards to untap.
|
||||
* </p>
|
||||
*
|
||||
*
|
||||
* @param sa
|
||||
* a {@link SpellAbility}.
|
||||
* @param mandatory
|
||||
@@ -93,7 +93,7 @@ public class UntapEffect extends SpellAbilityEffect {
|
||||
|
||||
final CardCollectionView selected = p.getController().chooseCardsForEffect(list, sa, Localizer.getInstance().getMessage("lblSelectCardToUntap"), mandatory ? num : 0, num, !mandatory, null);
|
||||
if (selected != null) {
|
||||
for (final Card c : selected) {
|
||||
for (final Card c : selected) {
|
||||
c.untap(true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -133,7 +133,7 @@ public class VentureEffect extends SpellAbilityEffect {
|
||||
|
||||
for (final Player p : getTargetPlayers(sa)) {
|
||||
if (!p.isInGame()) {
|
||||
continue;
|
||||
continue;
|
||||
}
|
||||
ventureIntoDungeon(sa, p, moveParams);
|
||||
}
|
||||
|
||||
@@ -636,29 +636,6 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
|
||||
|
||||
return retResult;
|
||||
|
||||
} else if (mode.equals("Convert") && (isConvertable() || hasMergedCard())) {
|
||||
// Need to remove mutated states, otherwise the changeToState() will fail
|
||||
if (hasMergedCard()) {
|
||||
removeMutatedStates();
|
||||
}
|
||||
CardCollectionView cards = hasMergedCard() ? getMergedCards() : new CardCollection(this);
|
||||
boolean retResult = false;
|
||||
for (final Card c : cards) {
|
||||
if (!c.isConvertable()) {
|
||||
continue;
|
||||
}
|
||||
c.backside = !c.backside;
|
||||
|
||||
boolean result = c.changeToState(c.backside ? CardStateName.Converted : CardStateName.Original);
|
||||
retResult = retResult || result;
|
||||
}
|
||||
if (hasMergedCard()) {
|
||||
rebuildMutatedStates(cause);
|
||||
game.getTriggerHandler().clearActiveTriggers(this, null);
|
||||
game.getTriggerHandler().registerActiveTrigger(this, false);
|
||||
}
|
||||
return retResult;
|
||||
|
||||
} else if (mode.equals("Flip")) {
|
||||
// 709.4. Flipping a permanent is a one-way process.
|
||||
if (isFlipped()) {
|
||||
@@ -963,16 +940,12 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
|
||||
return getRules() != null && getRules().getSplitType() == CardSplitType.Meld;
|
||||
}
|
||||
|
||||
public final boolean isConvertable() {
|
||||
return getRules() != null && getRules().getSplitType() == CardSplitType.Convert;
|
||||
}
|
||||
|
||||
public final boolean isModal() {
|
||||
return getRules() != null && getRules().getSplitType() == CardSplitType.Modal;
|
||||
}
|
||||
|
||||
public final boolean hasBackSide() {
|
||||
return isDoubleFaced() || isMeldable() || isModal() || isConvertable();
|
||||
return isDoubleFaced() || isMeldable() || isModal();
|
||||
}
|
||||
|
||||
public final boolean isFlipCard() {
|
||||
|
||||
@@ -67,6 +67,7 @@ import forge.game.spellability.OptionalCost;
|
||||
import forge.game.spellability.Spell;
|
||||
import forge.game.spellability.SpellAbility;
|
||||
import forge.game.spellability.SpellAbilityRestriction;
|
||||
import forge.game.spellability.SpellPermanent;
|
||||
import forge.game.staticability.StaticAbility;
|
||||
import forge.game.staticability.StaticAbilityCantBeCast;
|
||||
import forge.game.trigger.Trigger;
|
||||
@@ -3128,6 +3129,20 @@ public class CardFactoryUtil {
|
||||
|
||||
inst.addSpellAbility(abilityMorphDown(card));
|
||||
inst.addSpellAbility(abilityMorphUp(card, k[1], true));
|
||||
} else if (keyword.startsWith("More Than Meets the Eye")) {
|
||||
final String[] n = keyword.split(":");
|
||||
final Cost convertCost = new Cost(n[1], false);
|
||||
|
||||
final SpellAbility sa = new SpellPermanent(host, host.getAlternateState(), convertCost);
|
||||
sa.setDescription(host.getAlternateState().getName() + " (" + inst.getReminderText() + ")");
|
||||
sa.setCardState(host.getAlternateState());
|
||||
sa.setAlternativeCost(AlternativeCost.MTMtE);
|
||||
|
||||
sa.putParam("PrecostDesc", n[0] + " ");
|
||||
sa.putParam("CostDesc", convertCost.toString());
|
||||
sa.putParam("AfterDescription", "(Converted)");
|
||||
sa.setIntrinsic(intrinsic);
|
||||
inst.addSpellAbility(sa);
|
||||
} else if (keyword.startsWith("Multikicker")) {
|
||||
final String[] n = keyword.split(":");
|
||||
final SpellAbility sa = card.getFirstSpellAbility();
|
||||
|
||||
@@ -10,6 +10,7 @@ import com.google.common.collect.*;
|
||||
import forge.game.CardTraitBase;
|
||||
import forge.game.Game;
|
||||
import forge.game.ability.AbilityKey;
|
||||
import forge.game.player.PlayerCollection;
|
||||
import forge.game.spellability.SpellAbility;
|
||||
import forge.game.trigger.TriggerType;
|
||||
import forge.game.zone.ZoneType;
|
||||
@@ -18,6 +19,9 @@ public class CardZoneTable extends ForwardingTable<ZoneType, ZoneType, CardColle
|
||||
// TODO use EnumBasedTable if exist
|
||||
private Table<ZoneType, ZoneType, CardCollection> dataMap = HashBasedTable.create();
|
||||
|
||||
private CardCollection createdTokens = new CardCollection();
|
||||
private PlayerCollection firstTimeTokenCreators = new PlayerCollection();
|
||||
|
||||
public CardZoneTable(Table<ZoneType, ZoneType, CardCollection> cardZoneTable) {
|
||||
this.putAll(cardZoneTable);
|
||||
}
|
||||
@@ -52,6 +56,7 @@ public class CardZoneTable extends ForwardingTable<ZoneType, ZoneType, CardColle
|
||||
}
|
||||
|
||||
public void triggerChangesZoneAll(final Game game, final SpellAbility cause) {
|
||||
triggerTokenCreatedOnce(game);
|
||||
if (!isEmpty()) {
|
||||
final Map<AbilityKey, Object> runParams = AbilityKey.newMap();
|
||||
runParams.put(AbilityKey.Cards, new CardZoneTable(this));
|
||||
@@ -65,6 +70,15 @@ public class CardZoneTable extends ForwardingTable<ZoneType, ZoneType, CardColle
|
||||
}
|
||||
}
|
||||
|
||||
private void triggerTokenCreatedOnce(Game game) {
|
||||
if (!createdTokens.isEmpty()) {
|
||||
final Map<AbilityKey, Object> runParams = AbilityKey.newMap();
|
||||
runParams.put(AbilityKey.Cards, createdTokens);
|
||||
runParams.put(AbilityKey.FirstTime, firstTimeTokenCreators);
|
||||
game.getTriggerHandler().runTrigger(TriggerType.TokenCreatedOnce, runParams, false);
|
||||
}
|
||||
}
|
||||
|
||||
public CardCollection filterCards(Iterable<ZoneType> origin, ZoneType destination, String valid, Card host, CardTraitBase sa) {
|
||||
CardCollection allCards = new CardCollection();
|
||||
if (destination != null) {
|
||||
@@ -103,4 +117,11 @@ public class CardZoneTable extends ForwardingTable<ZoneType, ZoneType, CardColle
|
||||
public Iterable<Card> allCards() {
|
||||
return Iterables.concat(values());
|
||||
}
|
||||
|
||||
public void addToken(Card c, boolean firstTime) {
|
||||
createdTokens.add(c);
|
||||
if (firstTime) {
|
||||
firstTimeTokenCreators.add(c.getOwner());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1515,6 +1515,10 @@ public class Player extends GameEntity implements Comparable<Player> {
|
||||
game.getTriggerHandler().runTrigger(TriggerType.TokenCreated, runParams, false);
|
||||
}
|
||||
|
||||
public final int getNumTokenCreatedThisTurn() {
|
||||
return numTokenCreatedThisTurn;
|
||||
}
|
||||
|
||||
public final void resetNumTokenCreatedThisTurn() {
|
||||
numTokenCreatedThisTurn = 0;
|
||||
}
|
||||
|
||||
@@ -1010,4 +1010,8 @@ public class ReplacementHandler {
|
||||
});
|
||||
return !list.isEmpty();
|
||||
}
|
||||
|
||||
public boolean isReplacing() {
|
||||
return !hasRun.isEmpty();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,6 +24,7 @@ import com.google.common.collect.Maps;
|
||||
import forge.game.ability.ApiType;
|
||||
import forge.game.ability.SpellApiBased;
|
||||
import forge.game.card.Card;
|
||||
import forge.game.card.CardState;
|
||||
import forge.game.cost.Cost;
|
||||
|
||||
/**
|
||||
@@ -47,8 +48,14 @@ public class SpellPermanent extends SpellApiBased {
|
||||
* a {@link forge.game.card.Card} object.
|
||||
*/
|
||||
public SpellPermanent(final Card sourceCard) {
|
||||
super(sourceCard.isCreature() ? ApiType.PermanentCreature : ApiType.PermanentNoncreature, sourceCard,
|
||||
new Cost(sourceCard.getManaCost(), false), null, Maps.newHashMap());
|
||||
this(sourceCard, sourceCard.getCurrentState(), new Cost(sourceCard.getManaCost(), false));
|
||||
}
|
||||
public SpellPermanent(final Card sourceCard, final CardState cardstate) {
|
||||
this(sourceCard, cardstate, new Cost(cardstate.getManaCost(), false));
|
||||
}
|
||||
public SpellPermanent(final Card sourceCard, final CardState cardstate, final Cost cost) {
|
||||
super(cardstate.getType().isCreature() ? ApiType.PermanentCreature : ApiType.PermanentNoncreature, sourceCard,
|
||||
cost, null, Maps.newHashMap());
|
||||
|
||||
// reset StackDescription for something with Text
|
||||
this.setStackDescription("");
|
||||
|
||||
@@ -367,8 +367,8 @@ public class TriggerHandler {
|
||||
for (final Trigger deltrig : delayedTriggersWorkingCopy) {
|
||||
if (deltrig.getHostCard().getController().equals(player)) {
|
||||
if (isTriggerActive(deltrig) && canRunTrigger(deltrig, mode, runParams)) {
|
||||
runSingleTrigger(deltrig, runParams);
|
||||
delayedTriggers.remove(deltrig);
|
||||
runSingleTrigger(deltrig, runParams);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,6 +34,10 @@ public class TriggerImmediate extends Trigger {
|
||||
* @param runParams*/
|
||||
@Override
|
||||
public final boolean performTest(final Map<AbilityKey, Object> runParams) {
|
||||
if (hasParam("AfterReplacement") && hostCard.getGame().getReplacementHandler().isReplacing()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,70 @@
|
||||
/*
|
||||
* 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 java.util.Collections;
|
||||
import java.util.Map;
|
||||
|
||||
import com.google.common.collect.Iterables;
|
||||
|
||||
import forge.game.ability.AbilityKey;
|
||||
import forge.game.ability.AbilityUtils;
|
||||
import forge.game.card.Card;
|
||||
import forge.game.card.CardPredicates;
|
||||
import forge.game.player.PlayerCollection;
|
||||
import forge.game.spellability.SpellAbility;
|
||||
|
||||
public class TriggerTokenCreatedOnce extends Trigger {
|
||||
|
||||
public TriggerTokenCreatedOnce(final Map<String, String> params, final Card host, final boolean intrinsic) {
|
||||
super(params, host, intrinsic);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getImportantStackObjects(SpellAbility sa) {
|
||||
return "";
|
||||
}
|
||||
|
||||
/** {@inheritDoc} */
|
||||
@Override
|
||||
public final void setTriggeringObjects(final SpellAbility sa, Map<AbilityKey, Object> runParams) {
|
||||
Iterable<Card> tokens = (Iterable<Card>) runParams.get(AbilityKey.Cards);
|
||||
if (hasParam("ValidToken")) {
|
||||
tokens = Iterables.filter(tokens, CardPredicates.restriction(getParam("ValidToken").split(","), getHostCard().getController(), getHostCard(), this));
|
||||
}
|
||||
|
||||
sa.setTriggeringObject(AbilityKey.Cards, tokens);
|
||||
}
|
||||
|
||||
/** {@inheritDoc}
|
||||
* @param runParams*/
|
||||
@Override
|
||||
public final boolean performTest(final Map<AbilityKey, Object> runParams) {
|
||||
if (!matchesValidParam("ValidToken", runParams.get(AbilityKey.Cards))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (hasParam("OnlyFirst")) {
|
||||
if (Collections.disjoint(((PlayerCollection) runParams.get(AbilityKey.FirstTime)), AbilityUtils.getDefinedPlayers(getHostCard(), getParam("OnlyFirst"), this))) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -117,6 +117,7 @@ public enum TriggerType {
|
||||
Taps(TriggerTaps.class),
|
||||
TapsForMana(TriggerTapsForMana.class),
|
||||
TokenCreated(TriggerTokenCreated.class),
|
||||
TokenCreatedOnce(TriggerTokenCreatedOnce.class),
|
||||
Trains(TriggerTrains.class),
|
||||
Transformed(TriggerTransformed.class),
|
||||
TurnBegin(TriggerTurnBegin.class),
|
||||
|
||||
@@ -3,7 +3,7 @@ ManaCost:2 U R W
|
||||
Types:Legendary Creature Bird Dinosaur
|
||||
PT:3/4
|
||||
K:Flying
|
||||
T:Mode$ TokenCreated | ValidPlayer$ You | OnlyFirst$ True | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever you create one or more tokens for the first time each turn, create a 1/1 white Bird creature token with flying.
|
||||
T:Mode$ TokenCreatedOnce | OnlyFirst$ You | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever you create one or more tokens for the first time each turn, create a 1/1 white Bird creature token with flying.
|
||||
SVar:TrigToken:DB$ Token | TokenScript$ w_1_1_bird_flying
|
||||
A:AB$ PumpAll | Cost$ 3 U R W | ValidCards$ Creature.token+YouCtrl | KW$ Double Strike | SpellDescription$ Creature tokens you control gain double strike until end of turn.
|
||||
DeckHas:Ability$Token
|
||||
|
||||
@@ -5,9 +5,9 @@ PT:2/2
|
||||
K:More Than Meets the Eye:R W
|
||||
K:First Strike
|
||||
A:AB$ DealDamage | Cost$ 1 XCantBe0 SubCounter<X/P1P1/NICKNAME> | ValidTgts$ Creature | NumDmg$ X | SubAbility$ DBConvert | SpellDescription$ It deals that much damage to target creature.
|
||||
SVar:DBConvert:DB$ SetState | Mode$ Convert | StackDescription$ SpellDescription | SpellDescription$ Convert NICKNAME.
|
||||
SVar:DBConvert:DB$ SetState | Mode$ Transform | StackDescription$ SpellDescription | SpellDescription$ Convert NICKNAME.
|
||||
SVar:X:Count$xPaid
|
||||
AlternateMode:Convert
|
||||
AlternateMode:DoubleFaced
|
||||
DeckNeeds:Ability$Counters
|
||||
Oracle:More Than Meets the Eye {R}{W} (You may cast this card converted for {R}{W}.)\nFirst strike\n{1}, Remove one or more +1/+1 counters from Arcee: It deals that much damage to target creature. Convert Arcee.
|
||||
|
||||
@@ -21,7 +21,7 @@ PT:2/2
|
||||
K:Living metal
|
||||
T:Mode$ SpellCast | ValidActivatingPlayer$ You | TargetsValid$ Creature.YouCtrl,Vehicle.YouCtrl | Execute$ TrigPutCounters | TriggerDescription$ Whenever you cast a spell that targets one or more creatures or Vehicles you control, put that many +1/+1 counters on NICKNAME. Convert NICKNAME.
|
||||
SVar:TrigPutCounters:DB$ PutCounter | CounterType$ P1P1 | CounterNum$ X | SubAbility$ DBConvert
|
||||
SVar:DBConvert:DB$ SetState | Mode$ Convert
|
||||
SVar:DBConvert:DB$ SetState | Mode$ Transform
|
||||
SVar:X:TriggerObjectsSpellAbilityTargets$Valid Creature.YouCtrl,Vehicle.YouCtrl
|
||||
DeckHas:Ability$Counters
|
||||
Oracle:Living metal (As long as it's your turn, this Vehicle is also a creature.)\nWhenever you cast a spell that targets one or more creatures or Vehicles you control, put that many +1/+1 counters on Arcee. Convert Arcee.
|
||||
|
||||
@@ -5,8 +5,8 @@ PT:3/3
|
||||
K:More Than Meets the Eye:1 R G
|
||||
S:Mode$ Continuous | Affected$ Artifact.Creature+Other+YouCtrl+nonToken,Vehicle.Other+YouCtrl+nonToken | AddKeyword$ Modular:1 | Description$ Other nontoken artifact creatures and Vehicles you control have modular 1. (They enter the battlefield with an additional +1/+1 counter on them. When they die, you may put their +1/+1 counters on target artifact creature.)
|
||||
T:Mode$ CounterAddedOnce | CounterType$ P1P1 | ValidSource$ You | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigConvert | TriggerDescription$ Whenever you put one or more +1/+1 counters on NICKNAME, convert it.
|
||||
SVar:TrigConvert:DB$ SetState | Mode$ Convert
|
||||
AlternateMode:Convert
|
||||
SVar:TrigConvert:DB$ SetState | Mode$ Transform
|
||||
AlternateMode:DoubleFaced
|
||||
DeckHas:Ability$Counters & Keyword$Modular
|
||||
DeckHints:Type$Vehicle|Artifact
|
||||
Oracle:More Than Meets the Eye {1}{R}{G} (You may cast this card converted for {1}{R}{G}.)\nOther nontoken artifact creatures and Vehicles you control have modular 1. (They enter the battlefield with an additional +1/+1 counter on them. When they die, you may put their +1/+1 counters on target artifact creature.)\nWhenever you put one or more +1/+1 counters on Blaster, convert it.
|
||||
@@ -20,7 +20,7 @@ Types:Legendary Artifact
|
||||
K:Modular:3
|
||||
A:AB$ MoveCounter | Cost$ X T | Source$ Self | ValidTgts$ Artifact.Other | TgtPrompt$ Select another target artifact to get counters | CounterType$ P1P1 | CounterNum$ X | SorcerySpeed$ True | SubAbility$ DBPump | SpellDescription$ Move X +1/+1 counters from NICKNAME onto another target artifact. Activate only as a sorcery.
|
||||
SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ Haste | SubAbility$ DBConvert | SpellDescription$ That artifact gains haste until end of turn.
|
||||
SVar:DBConvert:DB$ SetState | Mode$ Convert | ConditionPresent$ Card.Self+counters_EQ0_P1P1 | StackDescription$ If NICKNAME has no +1/+1 counters on it, convert it.
|
||||
SVar:DBConvert:DB$ SetState | Mode$ Transform | ConditionPresent$ Card.Self+counters_EQ0_P1P1 | StackDescription$ If NICKNAME has no +1/+1 counters on it, convert it.
|
||||
SVar:X:Count$xPaid
|
||||
DeckHas:Ability$Counters
|
||||
Oracle:Modular 3\n{X}, {T}: Move X +1/+1 counters from Blaster onto another target artifact. That artifact gains haste until end of turn. If Blaster has no +1/+1 counters on it, convert it. Activate only as a sorcery.
|
||||
|
||||
@@ -5,11 +5,11 @@ PT:6/5
|
||||
K:More Than Meets the Eye:3 B
|
||||
T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ At the beginning of your end step, target opponent loses life equal to the life that player lost this turn. If no life is lost this way, convert NICKNAME.
|
||||
SVar:TrigLoseLife:DB$ LoseLife | ValidTgts$ Opponent | LifeAmount$ X | SubAbility$ DBConvert
|
||||
SVar:DBConvert:DB$ SetState | Mode$ Convert | ConditionCheckSVar$ AFLifeLost | ConditionSVarCompare$ EQ0
|
||||
SVar:DBConvert:DB$ SetState | Mode$ Transform | ConditionCheckSVar$ AFLifeLost | ConditionSVarCompare$ EQ0
|
||||
SVar:X:TargetedPlayer$LifeLostThisTurn
|
||||
SVar:AFLifeLost:Number$0
|
||||
#AFLifeLost will be set by LoseLife
|
||||
AlternateMode:Convert
|
||||
AlternateMode:DoubleFaced
|
||||
Oracle:More Than Meets the Eye {3}{B} (You may cast this card converted for {3}{B}.)\nAt the beginning of your end step, target opponent loses life equal to the life that player lost this turn. If no life is lost this way, convert Blitzwing.
|
||||
|
||||
ALTERNATE
|
||||
@@ -23,7 +23,7 @@ K:Living metal
|
||||
T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | Execute$ TrigRandomPump | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of combat on your turn, choose flying or indestructible at random. NICKNAME gains that ability until end of turn.
|
||||
SVar:TrigRandomPump:DB$ Pump | Defined$ Self | KW$ Flying & Indestructible | RandomKeyword$ True
|
||||
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigConvert | TriggerDescription$ Whenever NICKNAME deals combat damage to a player, convert it.
|
||||
SVar:TrigConvert:DB$ SetState | Mode$ Convert
|
||||
SVar:TrigConvert:DB$ SetState | Mode$ Transform
|
||||
DeckHas:Keyword$Flying|Indestructible
|
||||
SVar:HasAttackEffect:TRUE
|
||||
Oracle:Living metal (As long as it's your turn, this Vehicle is also a creature.)\nAt the beginning of combat on your turn, choose flying or indestructible at random. Blitzwing gains that ability until end of turn.\nWhenever Blitzwing deals combat damage to a player, convert it.
|
||||
|
||||
@@ -6,8 +6,8 @@ K:More Than Meets the Eye:5 U B
|
||||
K:Flying
|
||||
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigConnive | TriggerDescription$ Whenever NICKNAME deals combat damage to a player, it connives. Then if NICKNAME's power is 5 or greater, convert it. (To have a creature connive, draw a card, then discard a card. If you discarded a nonland card, put a +1/+1 counter on that creature.)
|
||||
SVar:TrigConnive:DB$ Connive | SubAbility$ DBConvert
|
||||
SVar:DBConvert:DB$ SetState | Mode$ Convert | ConditionPresent$ Card.Self+powerGE5
|
||||
AlternateMode:Convert
|
||||
SVar:DBConvert:DB$ SetState | Mode$ Transform | ConditionPresent$ Card.Self+powerGE5
|
||||
AlternateMode:DoubleFaced
|
||||
SVar:HasAttackEffect:TRUE
|
||||
DeckHas:Ability$Graveyard|Discard
|
||||
Oracle:More Than Meets the Eye {5}{U}{B} (You may cast this card converted for {5}{U}{B}.)\nFlying\nWhenever Cyclonus deals combat damage to a player, it connives. Then if Cyclonus's power is 5 or greater, convert it. (To have a creature connive, draw a card, then discard a card. If you discarded a nonland card, put a +1/+1 counter on that creature.)
|
||||
@@ -22,7 +22,7 @@ PT:5/5
|
||||
K:Living metal
|
||||
K:Flying
|
||||
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigConvert | TriggerDescription$ Whenever NICKNAME deals combat damage to a player, convert it. If you do, there is an additional beginning phase after this phase. (The beginning phase includes the untap, upkeep, and draw steps.)
|
||||
SVar:TrigConvert:DB$ SetState | Mode$ Convert | SubAbility$ ExtraBeginningPhase | RememberChanged$ True
|
||||
SVar:TrigConvert:DB$ SetState | Mode$ Transform | SubAbility$ ExtraBeginningPhase | RememberChanged$ True
|
||||
SVar:ExtraBeginningPhase:DB$ AddPhase | ExtraPhase$ Beginning | ConditionDefined$ Remembered | ConditionPresent$ Card.Self | ConditionCompare$ GE1 | SubAbility$ DBCleanup
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
SVar:HasAttackEffect:TRUE
|
||||
|
||||
@@ -4,11 +4,11 @@ Types:Legendary Artifact Creature Robot
|
||||
PT:3/2
|
||||
K:More Than Meets the Eye:B R
|
||||
A:AB$ PutCounter | Cost$ Sac<1/Artifact.Other/another artifact> | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | SorcerySpeed$ True | SubAbility$ DBConvert | AILogic$ AristocratCounters | SpellDescription$ Put a +1/+1 counter on NICKNAME and convert it. Activate only as a sorcery.
|
||||
SVar:DBConvert:DB$ SetState | Mode$ Convert | StackDescription$ Convert NICKNAME
|
||||
SVar:DBConvert:DB$ SetState | Mode$ Transform | StackDescription$ Convert NICKNAME
|
||||
A:AB$ ChangeZoneAll | Cost$ 1 Discard<1/Hand> | ChangeType$ Card.YouOwn+counters_GE1_INTEL | Origin$ Exile | Destination$ Hand | SpellDescription$ Put all exiled cards you own with intel counters on them into your hand.
|
||||
DeckHints:Ability$Counters
|
||||
DeckHas:Ability$Sacrifice|Discard|Counters
|
||||
AlternateMode:Convert
|
||||
AlternateMode:DoubleFaced
|
||||
Oracle:More Than Meets the Eye {B}{R} (You may cast this card converted for {B}{R}.)\nSacrifice another artifact: Put a +1/+1 counter on Flamewar and convert it. Activate only as a sorcery.\n{1}, Discard your hand: Put all exiled cards you own with intel counters on them into your hand.
|
||||
|
||||
ALTERNATE
|
||||
@@ -23,7 +23,7 @@ K:Menace
|
||||
K:Deathtouch
|
||||
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigDig | TriggerDescription$ Whenever NICKNAME deals combat damage to a player, exile that many cards from the top of your library face down. Put an intel counter on each of them. Convert NICKNAME.
|
||||
SVar:TrigDig:DB$ Dig | DigNum$ X | ChangeNum$ All | DestinationZone$ Exile | ExileFaceDown$ True | ExileWithCounter$ INTEL | SubAbility$ DBConvert
|
||||
SVar:DBConvert:DB$ SetState | Mode$ Convert
|
||||
SVar:DBConvert:DB$ SetState | Mode$ Transform
|
||||
SVar:X:TriggerCount$DamageAmount
|
||||
SVar:HasAttackEffect:TRUE
|
||||
Oracle:Living metal (As long as it's your turn, this Vehicle is also a creature.)\nMenace, deathtouch\nWhenever Flamewar deals combat damage to a player, exile that many cards from the top of your library face down. Put an intel counter on each of them. Convert Flamewar.
|
||||
|
||||
@@ -6,9 +6,9 @@ K:More Than Meets the Eye:W U
|
||||
R:Event$ DamageDone | ActiveZones$ Battlefield | Prevent$ True | ValidTarget$ Human.attacking+YouCtrl | IsCombat$ True | Description$ Prevent all combat damage that would be dealt to attacking Humans you control.
|
||||
SVar:NonStackingEffect:True
|
||||
T:Mode$ SpellCast | ValidCard$ Card.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigConvert | CheckSVar$ YouCastThisTurn | SVarCompare$ EQ2 | NoResolvingCheck$ True | TriggerDescription$ Whenever you cast your second spell each turn, convert NICKNAME.
|
||||
SVar:TrigConvert:DB$ SetState | Mode$ Convert
|
||||
SVar:TrigConvert:DB$ SetState | Mode$ Transform
|
||||
SVar:YouCastThisTurn:Count$ThisTurnCast_Card.YouCtrl
|
||||
AlternateMode:Convert
|
||||
AlternateMode:DoubleFaced
|
||||
DeckHints:Type$Human
|
||||
Oracle:More Than Meets the Eye {W}{U} (You may cast this card converted for {W}{U}.)\nPrevent all combat damage that would be dealt to attacking Humans you control.\nWhenever you cast your second spell each turn, convert Goldbug.
|
||||
|
||||
@@ -23,6 +23,6 @@ K:Living metal
|
||||
S:Mode$ Continuous | Affected$ Human.YouCtrl | AddHiddenKeyword$ This spell can't be countered. | AffectedZone$ Stack | Description$ Human spells you control can't be countered.
|
||||
T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | IsPresent$ Human.attacking+Other | Execute$ TrigDraw | TriggerDescription$ Whenever NICKNAME and at least one Human attack, draw a card and convert NICKNAME.
|
||||
SVar:TrigDraw:DB$ Draw | SubAbility$ DBConvert
|
||||
SVar:DBConvert:DB$ SetState | Mode$ Convert
|
||||
SVar:DBConvert:DB$ SetState | Mode$ Transform
|
||||
DeckNeeds:Type$Human
|
||||
Oracle:Living metal (As long as it's your turn, this Vehicle is also a creature.)\nHuman spells you control can't be countered\nWhenever Goldbug and at least one Human attack, draw a card and convert Goldbug.
|
||||
|
||||
@@ -5,9 +5,9 @@ PT:3/4
|
||||
K:More Than Meets the Eye:3 U
|
||||
K:Flying
|
||||
A:AB$ Mana | Cost$ RemoveAnyCounter<X1+/P1P1/Artifact.YouCtrl/among artifacts you control> | ValidTgts$ Player | Produced$ C | Amount$ X | AmountDesc$ for each counter removed | XCantBe0$ True | RestrictValid$ CantCastNonArtifactSpells | SpellDescription$ Target player adds that much {C}. This mana can't be spent to cast nonartifact spells.
|
||||
SVar:DBConvert:DB$ SetState | Mode$ Convert | StackDescription$ SpellDescription | SpellDescription$ Convert NICKNAME.
|
||||
SVar:DBConvert:DB$ SetState | Mode$ Transform | StackDescription$ SpellDescription | SpellDescription$ Convert NICKNAME.
|
||||
SVar:X:Count$xPaid
|
||||
AlternateMode:Convert
|
||||
AlternateMode:DoubleFaced
|
||||
AI:RemoveDeck:All
|
||||
DeckHints:Ability$Counters & Keyword$Adapt|Modular
|
||||
Oracle:More Than Meets the Eye {3}{U} (You may cast this card converted for {3}{U}.)\nFlying\nRemove one or more +1/+1 counters from among artifacts you control: Target player adds that much {C}. This mana can't be spent to cast nonartifact spells. Convert Jetfire.
|
||||
@@ -21,7 +21,7 @@ Types:Legendary Artifact Vehicle
|
||||
PT:3/4
|
||||
K:Living metal
|
||||
K:Flying
|
||||
A:AB$ SetState | Cost$ U U U | Mode$ Convert | SubAbility$ DBAdapt | StackDescription$ Convert NICKNAME, | SpellDescription$ Convert NICKNAME, then adapt 3. (If it has no +1/+1 counters on it, put three +1/+1 counters on it.)
|
||||
A:AB$ SetState | Cost$ U U U | Mode$ Transform | SubAbility$ DBAdapt | StackDescription$ Convert NICKNAME, | SpellDescription$ Convert NICKNAME, then adapt 3. (If it has no +1/+1 counters on it, put three +1/+1 counters on it.)
|
||||
SVar:DBAdapt:DB$ PutCounter | Adapt$ True | CounterNum$ 3 | CounterType$ P1P1 | StackDescription$ then adapt 3.
|
||||
DeckHas:Ability$Counters
|
||||
Oracle:Living metal (As long as it's your turn, this Vehicle is also a creature.)\nFlying\n{U}{U}{U}: Convert Jetfire, then adapt 3. (If it has no +1/+1 counters on it, put three +1/+1 counters on it.)
|
||||
|
||||
@@ -5,11 +5,11 @@ PT:7/5
|
||||
K:More Than Meets the Eye:1 R W B
|
||||
S:Mode$ CantBeCast | ValidCard$ Card | Caster$ Opponent | Phases$ BeginCombat->EndCombat | Description$ Your opponents can't cast spells during combat.
|
||||
T:Mode$ Phase | Phase$ Main2 | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigConvert | OptionalDecider$ You | TriggerDescription$ At the beginning of your postcombat main phase, you may convert NICKNAME. If you do, add {C} for each 1 life your opponents have lost this turn.
|
||||
SVar:TrigConvert:DB$ SetState | Mode$ Convert | RememberChanged$ True | SubAbility$ DBMana
|
||||
SVar:TrigConvert:DB$ SetState | Mode$ Transform | RememberChanged$ True | SubAbility$ DBMana
|
||||
SVar:DBMana:DB$ Mana | ConditionDefined$ Remembered | ConditionPresent$ Card | Produced$ C | Amount$ X | SubAbility$ DBCleanup
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
SVar:X:Count$LifeOppsLostThisTurn
|
||||
AlternateMode:Convert
|
||||
AlternateMode:DoubleFaced
|
||||
Oracle:More Than Meets the Eye {1}{R}{W}{B} (You may cast this card converted for {1}{R}{W}{B}.)\nYour opponents can't cast spells during combat.\nAt the beginning of your postcombat main phase, you may convert Megatron. If you do, add {C} for each 1 life your opponents have lost this turn.
|
||||
|
||||
ALTERNATE
|
||||
@@ -23,7 +23,7 @@ K:Living metal
|
||||
T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigImmediate | TriggerDescription$ Whenever NICKNAME attacks, you may sacrifice another artifact. When you do, NICKNAME deals damage equal to the sacrificed artifact's mana value to target creature. If excess damage would be dealt to that creature this way, instead that damage is dealt to that creature's controller and you convert NICKNAME.
|
||||
SVar:TrigImmediate:AB$ ImmediateTrigger | Cost$ Sac<1/Artifact.Other/another artifact> | RememberObjects$ Sacrificed | Execute$ TrigDamage | AILogic$ SacForDamage.cmc | TriggerDescription$ When you do, NICKNAME deals damage equal to the sacrificed artifact's mana value to target creature. If excess damage would be dealt to that creature this way, instead that damage is dealt to that creature's controller and you convert NICKNAME.
|
||||
SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature | NumDmg$ X | ExcessSVar$ Excess | ExcessDamage$ TargetedController | SubAbility$ DBConvert
|
||||
SVar:DBConvert:DB$ SetState | ConditionCheckSVar$ Excess | Mode$ Convert
|
||||
SVar:DBConvert:DB$ SetState | ConditionCheckSVar$ Excess | Mode$ Transform
|
||||
SVar:X:TriggerRemembered$CardManaCost
|
||||
SVar:HasAttackEffect:TRUE
|
||||
DeckHas:Ability$Sacrifice
|
||||
|
||||
@@ -7,7 +7,7 @@ T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | Execute$ TrigBo
|
||||
SVar:TrigBolster:DB$ PutCounter | Bolster$ True | CounterType$ P1P1
|
||||
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When NICKNAME dies, return it to the battlefield converted under its owner's control.
|
||||
SVar:TrigReturn:DB$ ChangeZone | Defined$ TriggeredNewCardLKICopy | Origin$ Graveyard | Destination$ Battlefield | Converted$ True
|
||||
AlternateMode:Convert
|
||||
AlternateMode:DoubleFaced
|
||||
DeckHas:Ability$Counters
|
||||
Oracle:More Than Meets the Eye {2}{U}{R}{W} (You may cast this card converted for {2}{U}{R}{W}.)\nAt the beginning of each end step, bolster 1. (Choose a creature with the least toughness among creatures you control and put a +1/+1 counter on it.)\nWhen Optimus Prime dies, return it to the battlefield converted under its owner's control.
|
||||
|
||||
@@ -24,6 +24,6 @@ T:Mode$ AttackersDeclared | AttackingPlayer$ You | TriggerZones$ Battlefield | E
|
||||
SVar:TrigBolster:DB$ PutCounter | Bolster$ True | CounterType$ P1P1 | CounterNum$ 2 | RememberPut$ True | SubAbility$ DBPump
|
||||
SVar:DBPump:DB$ Pump | Defined$ Remembered | KW$ Trample | SubAbility$ DBDelayedTrigger
|
||||
SVar:DBDelayedTrigger:DB$ DelayedTrigger | Mode$ DamageDone | RememberObjects$ Remembered | ValidSource$ Card.IsTriggerRemembered | ValidTarget$ Player | CombatDamage$ True | ThisTurn$ True | Execute$ TrigConvert | TriggerDescription$ When that creature deals combat damage to a player this turn, convert NICKNAME.
|
||||
SVar:TrigConvert:DB$ SetState | Mode$ Convert | SubAbility$ DBCleanup
|
||||
SVar:TrigConvert:DB$ SetState | Mode$ Transform | SubAbility$ DBCleanup
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
Oracle:Living metal (As long as it's your turn, this Vehicle is also a creature.)\nTrample\nWhenever you attack, bolster 2. The chosen creature gains trample until end of turn. When that creature deals combat damage to a player this turn, convert Optimus Prime.
|
||||
|
||||
@@ -4,13 +4,13 @@ Types:Legendary Artifact Creature Robot
|
||||
PT:2/4
|
||||
K:More Than Meets the Eye:1 W
|
||||
T:Mode$ LifeGained | TriggerZones$ Battlefield | ValidPlayer$ You | OptionalDecider$ You | NoResolvingCheck$ True | Execute$ TrigConvert | TriggerDescription$ Whenever you gain life, you may convert NICKNAME. When you do, return target artifact card with mana value less than or equal to the amount of life you gained this turn from your graveyard to the battlefield tapped.
|
||||
SVar:TrigConvert:DB$ SetState | Mode$ Convert | SubAbility$ DBImmediateTrig | RememberChanged$ True
|
||||
SVar:TrigConvert:DB$ SetState | Mode$ Transform | SubAbility$ DBImmediateTrig | RememberChanged$ True
|
||||
SVar:DBImmediateTrig:DB$ ImmediateTrigger | ConditionDefined$ Remembered | ConditionPresent$ Card.Self | ConditionCompare$ GE1 | Execute$ DBReturn | TriggerDescription$ When you do, return target artifact card with mana value less than or equal to the amount of life you gained this turn from your graveyard to the battlefield tapped.
|
||||
SVar:DBReturn:DB$ ChangeZone | ValidTgts$ Artifact.cmcLEX+YouOwn | TgtPrompt$ Select target artifact card with mana value equal or less than the amount of life you gained this turn from your graveyard | Origin$ Graveyard | Destination$ Battlefield | Tapped$ True | SubAbility$ DBCleanup
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
SVar:X:Count$LifeYouGainedThisTurn
|
||||
DeckHas:Ability$LifeGain|Graveyard
|
||||
AlternateMode:Convert
|
||||
AlternateMode:DoubleFaced
|
||||
Oracle:More Than Meets the Eye {1}{W} (You may cast this card converted for {1}{W}.)\nLifelink\nWhenever you gain life, you may convert Ratchet. When you do, return target artifact card with mana value less than or equal to the amount of life you gained this turn from your graveyard to the battlefield tapped.
|
||||
|
||||
ALTERNATE
|
||||
@@ -23,7 +23,7 @@ PT:1/4
|
||||
K:Living metal
|
||||
K:Lifelink
|
||||
T:Mode$ ChangesZoneAll | ValidCards$ Artifact.YouCtrl+nonToken | Origin$ Battlefield | Destination$ Graveyard | TriggerZones$ Battlefield | ActivationLimit$ 1 | Execute$ TrigConvert | TriggerDescription$ Whenever one or more nontoken artifacts you control are put into a graveyard from the battlefield, convert NICKNAME. This ability triggers only once each turn.
|
||||
SVar:TrigConvert:DB$ SetState | Mode$ Convert
|
||||
SVar:TrigConvert:DB$ SetState | Mode$ Transform
|
||||
DeckHas:Ability$LifeGain
|
||||
DeckHints:Type$Artifact
|
||||
Oracle:Living metal (As long as it's your turn, this Vehicle is also a creature.)\nLifelink\nWhenever one or more nontoken artifacts you control are put into a graveyard from the battlefield, convert Ratchet. This ability triggers only once each turn.
|
||||
@@ -10,9 +10,9 @@ SVar:TrigGainControl:DB$ GainControl | Optional$ True | NewController$ Triggered
|
||||
SVar:DBGoad:DB$ Goad | Defined$ Remembered | SubAbility$ DBEffect
|
||||
SVar:DBEffect:DB$ Effect | RememberObjects$ Remembered | ForgetOnMoved$ Battlefield | EffectOwner$ TriggeredPlayer | StaticAbilities$ CantSac | SubAbility$ DBConvert
|
||||
SVar:CantSac:Mode$ CantSacrifice | ValidCard$ Card.IsRemembered | Description$ EFFECTSOURCE can't be sacrificed this turn.
|
||||
SVar:DBConvert:DB$ SetState | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ EQ0 | Mode$ Convert | SubAbility$ DBCleanup
|
||||
SVar:DBConvert:DB$ SetState | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ EQ0 | Mode$ Transform | SubAbility$ DBCleanup
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
AlternateMode:Convert
|
||||
AlternateMode:DoubleFaced
|
||||
Oracle:More Than Meets the Eye {2}{R} (You may cast this card converted for {2}{R}.)\nDouble strike, haste\nAt the beginning of each opponent's upkeep, you may have that player gain control of Slicer until end of turn. If you do, untap Slicer, goad it, and it can't be sacrificed this turn. If you don't, convert it.
|
||||
|
||||
ALTERNATE
|
||||
@@ -27,5 +27,5 @@ K:First Strike
|
||||
K:Haste
|
||||
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | TriggerZones$ Battlefield | CombatDamage$ True | Execute$ TrigDelTrig | TriggerDescription$ Whenever NICKNAME deals combat damage to a player, convert it at end of combat.
|
||||
SVar:TrigDelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Player | Execute$ TrigConvert | TriggerDescription$ Convert NICKNAME at end of combat.
|
||||
SVar:TrigConvert:DB$ SetState | Mode$ Convert
|
||||
SVar:TrigConvert:DB$ SetState | Mode$ Transform
|
||||
Oracle:Living metal (As long as it's your turn, this Vehicle is also a creature.)\nFirst strike, haste\nWhenever Slicer deals combat damage to a player, convert it at end of combat.
|
||||
|
||||
@@ -6,10 +6,10 @@ K:More Than Meets the Eye:2 W U B
|
||||
T:Mode$ DamageDoneOnce | CombatDamage$ True | ValidSource$ Creature.token+YouCtrl | TriggerZones$ Battlefield | ValidTarget$ Player | Execute$ TrigCast | TriggerDescription$ Whenever one or more creature tokens you control deal combat damage to a player, exile target instant or sorcery card with mana value equal to the damage dealt from their graveyard. Copy it. You may cast the copy without paying its mana cost. If you do, convert NICKNAME.
|
||||
SVar:TrigCast:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target instant or sorcery card in that player's graveyard | ValidTgts$ Instant.cmcEQX+OwnedBy TriggeredTarget,Sorcery.cmcEQX+OwnedBy TriggeredTarget | RememberChanged$ True | SubAbility$ DBPlay
|
||||
SVar:DBPlay:DB$ Play | Valid$ Card.IsRemembered | ValidZone$ Exile | Controller$ You | CopyCard$ True | WithoutManaCost$ True | ValidSA$ Spell | Optional$ True | ImprintPlayed$ True | SubAbility$ DBConvert
|
||||
SVar:DBConvert:DB$ SetState | Mode$ Convert | ConditionDefined$ Imprinted | ConditionPresent$ Card | ConditionCompare$ EQ1 | SubAbility$ DBCleanup
|
||||
SVar:DBConvert:DB$ SetState | Mode$ Transform | ConditionDefined$ Imprinted | ConditionPresent$ Card | ConditionCompare$ EQ1 | SubAbility$ DBCleanup
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearImprinted$ True | ClearRemembered$ True
|
||||
SVar:X:TriggerCount$DamageAmount
|
||||
AlternateMode:Convert
|
||||
AlternateMode:DoubleFaced
|
||||
DeckHas:Ability$Graveyard
|
||||
DeckHints:Type$Instant|Sorcery
|
||||
DeckNeeds:Ability$Token
|
||||
@@ -22,10 +22,10 @@ ManaCost:no cost
|
||||
Colors:white,blue,black
|
||||
Types:Legendary Artifact
|
||||
T:Mode$ SpellCast | ValidCard$ Card.cmcOdd | ValidActivatingPlayer$ You | Execute$ TrigConvertRavage | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a spell with an odd mana value, convert NICKNAME. If you do, create Ravage, a legendary 3/3 black Robot artifact creature token with menace and deathtouch.
|
||||
SVar:TrigConvertRavage:DB$ SetState | Mode$ Convert | RememberChanged$ True | SubAbility$ DBTokenRavage
|
||||
SVar:TrigConvertRavage:DB$ SetState | Mode$ Transform | RememberChanged$ True | SubAbility$ DBTokenRavage
|
||||
SVar:DBTokenRavage:DB$ Token | TokenScript$ ravage | ConditionDefined$ Remembered | ConditionPresent$ Card.Self | ConditionCompare$ GE1 | SubAbility$ DBCleanup
|
||||
T:Mode$ SpellCast | ValidCard$ Card.cmcEven | ValidActivatingPlayer$ You | Execute$ TrigConvertLaserbeak | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a spell with an even mana value, convert NICKNAME. If you do, create Laserbeak, a legendary 2/2 blue Robot artifact creature token with flying and hexproof.
|
||||
SVar:TrigConvertLaserbeak:DB$ SetState | Mode$ Convert | RememberChanged$ True | SubAbility$ DBTokenLaserbeak
|
||||
SVar:TrigConvertLaserbeak:DB$ SetState | Mode$ Transform | RememberChanged$ True | SubAbility$ DBTokenLaserbeak
|
||||
SVar:DBTokenLaserbeak:DB$ Token | TokenScript$ laserbeak | ConditionDefined$ Remembered | ConditionPresent$ Card.Self | ConditionCompare$ GE1 | SubAbility$ DBCleanup
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
DeckHas:Ability$Token & Keyword$Flying|Hexproof|Menace|Deathtouch
|
||||
|
||||
@@ -7,8 +7,8 @@ K:Flying
|
||||
T:Mode$ Drawn | ValidCard$ Card.YouCtrl | Condition$ Monarch | TriggerZones$ Battlefield | Execute$ TrigDrain | TriggerDescription$ Whenever you draw a card, if you're the monarch, target opponent loses 2 life.
|
||||
SVar:TrigDrain:DB$ LoseLife | ValidTgts$ Opponent | LifeAmount$ 2
|
||||
T:Mode$ DamageDoneOnce | ValidSource$ Creature | TriggerZones$ Battlefield | ValidTarget$ You | CombatDamage$ True | Execute$ TrigConvert | TriggerDescription$ Whenever one or more creatures deal combat damage to you, convert NICKNAME.
|
||||
SVar:TrigConvert:DB$ SetState | Mode$ Convert
|
||||
AlternateMode:Convert
|
||||
SVar:TrigConvert:DB$ SetState | Mode$ Transform
|
||||
AlternateMode:DoubleFaced
|
||||
Oracle:More Than Meets the Eye {2}{B} (You may cast this card converted for {2}{B}.)\nFlying\nWhenever you draw a card, if you're the monarch, target opponent loses 2 life.\nWhenever one or more creatures deal combat damage to you, convert Starscream.
|
||||
|
||||
ALTERNATE
|
||||
@@ -25,6 +25,6 @@ K:Haste
|
||||
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CheckSVar$ Monarch | SVarCompare$ EQ0 | CombatDamage$ True | Execute$ TrigMonarch | TriggerZones$ Battlefield | TriggerDescription$ Whenever NICKNAME deals combat damage to a player, if there is no monarch, that player becomes the monarch.
|
||||
SVar:TrigMonarch:DB$ BecomeMonarch | Defined$ TriggeredTarget
|
||||
T:Mode$ BecomeMonarch | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigConvert | TriggerDescription$ Whenever you become the monarch, convert NICKNAME.
|
||||
SVar:TrigConvert:DB$ SetState | Mode$ Convert
|
||||
SVar:TrigConvert:DB$ SetState | Mode$ Transform
|
||||
SVar:Monarch:PlayerCountPlayers$HasPropertyisMonarch
|
||||
Oracle:Living metal (As long as it's your turn, this Vehicle is also a creature.)\nFlying, menace, haste\nWhenever Starscream deals combat damage to a player, if there is no monarch, that player becomes the monarch.\nWhenever you become the monarch, convert Starscream.
|
||||
|
||||
@@ -7,10 +7,10 @@ K:Ward:2
|
||||
T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigChange | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ Whenever NICKNAME attacks, you may put an artifact creature card from your hand onto the battlefield tapped and attacking. If you do, convert NICKNAME at end of combat.
|
||||
SVar:TrigChange:DB$ ChangeZone | Origin$ Hand | Destination$ Battlefield | ChangeType$ Artifact.Creature | Tapped$ True | Attacking$ True | RememberChanged$ True | SubAbility$ DBDelayedTrigger
|
||||
SVar:DBDelayedTrigger:DB$ DelayedTrigger | ConditionDefined$ Remembered | ConditionPresent$ Card | Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Player | Execute$ TrigConvert | SubAbility$ DBCleanup | TriggerDescription$ If you do, convert NICKNAME at end of combat.
|
||||
SVar:TrigConvert:DB$ SetState | Mode$ Convert
|
||||
SVar:TrigConvert:DB$ SetState | Mode$ Transform
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
SVar:HasAttackEffect:TRUE
|
||||
AlternateMode:Convert
|
||||
AlternateMode:DoubleFaced
|
||||
Oracle:More Than Meets the Eye {2}{R}{G}{W} (You may cast this card converted for {2}{R}{G}{W}.)\nWard {2}\nWhenever Ultra Magnus attacks, you may put an artifact creature card from your hand onto the battlefield tapped and attacking. If you do, convert Ultra Magnus at end of combat.
|
||||
|
||||
ALTERNATE
|
||||
@@ -24,7 +24,7 @@ K:Living metal
|
||||
K:Haste
|
||||
T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerZones$ Battlefield | TriggerDescription$ Formidable — Whenever NICKNAME attacks, attacking creatures you control gain indestructible until end of turn. If those creatures have total power 8 or greater, convert NICKNAME.
|
||||
SVar:TrigPump:DB$ PumpAll | ValidCards$ Creature.attacking+YouCtrl | KW$ Indestructible | SubAbility$ DBConvert
|
||||
SVar:DBConvert:DB$ SetState | Mode$ Convert | ConditionCheckSVar$ FormidableTest | ConditionSVarCompare$ GE8
|
||||
SVar:DBConvert:DB$ SetState | Mode$ Transform | ConditionCheckSVar$ FormidableTest | ConditionSVarCompare$ GE8
|
||||
SVar:FormidableTest:Count$SumPower_Creature.attacking+YouCtrl
|
||||
SVar:HasAttackEffect:TRUE
|
||||
Oracle:Living metal (As long as it's your turn, this Vehicle is also a creature.)\nHaste\nFormidable — Whenever Ultra Magnus attacks, attacking creatures you control gain indestructible until end of turn. If those creatures have total power 8 or greater, convert Ultra Magnus.
|
||||
|
||||
@@ -3,7 +3,7 @@ ManaCost:5 G
|
||||
Types:Legendary Artifact Creature Wizard
|
||||
PT:4/3
|
||||
K:Reach
|
||||
S:Mode$ Continuous | CharacteristicDefining$ True | SetPower$ 16 | SetToughness$ 9 | IsPresent$ Card.Self+attacking | Affected$ Creature.basePowerEQ4+baseToughnessEQ3+tapped+YouCtrl | Description$ As long as NICKNAME is attacking, tapped creatures you control with base power and toughness 4/3 have base power and toughness 16/9.
|
||||
S:Mode$ Continuous | CharacteristicDefining$ True | SetPower$ 16 | SetToughness$ 9 | IsPresent$ Card.Self+attacking | Affected$ Creature.basePowerEQ4+baseToughnessEQ3+tapped+YouCtrl | Description$ As long as NICKNAME is attacking, tapped creatures you control with base power and toughness 4/3 have base power and toughness 16/9.
|
||||
A:AB$ Mana | Cost$ T | Produced$ W U B R G | TriggersWhenSpent$ TrigChange | SpellDescription$ Add {W}{U}{B}{R}{G}. Creature spells you spend this mana to cast have their base power and toughness become 4/3.
|
||||
SVar:TrigChange:Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ You | Execute$ TrigAnimate | TriggerDescription$ Creature spells you spend this mana to cast have their base power and toughness become 4/3.
|
||||
SVar:TrigAnimate:DB$ Animate | Defined$ TriggeredCard | Duration$ Permanent | Power$ 4 | Toughness$ 3
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
Name:Anoint with Affliction
|
||||
ManaCost:1 B
|
||||
Types:Instant
|
||||
A:SP$ ChangeZone | Defined$ Targeted | ValidTgts$ Creature | ConditionCheckSVar$ X | CondtionSVarCompare$ GE3 | Origin$ Battlefield | Destination$ Exile | SubAbility$ NotPoisoned | SpellDescription$ Exile target creature if it has mana value 3 or less. Corrupted — Exile that creature instead if its controller has three or more poison counters.
|
||||
SVar:NotPoisoned:DB$ ChangeZone | Defined$ Targeted | Origin$ Battlefield | Destination$ Exile | ConditionDefined$ Targeted | ConditionPresent$ Permanent.nonLand+cmcLE3
|
||||
DeckHints:Ability$Proliferate & Keyword$Infect|Toxic
|
||||
SVar:X:TargetedController$PoisonCounters
|
||||
Oracle:Exile target creature if it has mana value 3 or less.\nCorrupted — Exile that creature instead if its controller has three or more poison counters.
|
||||
@@ -1,5 +1,5 @@
|
||||
Name:Archfiend of the Dross
|
||||
ManaCost:2 B
|
||||
ManaCost:2 B B
|
||||
Types:Creature Phyrexian Demon
|
||||
PT:6/6
|
||||
K:Flying
|
||||
@@ -11,4 +11,4 @@ T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$
|
||||
SVar:TrigLoseLife:DB$ LoseLife | LifeAmount$ 2 | Defined$ TriggeredCardController
|
||||
DeckHas:Ability$Counters
|
||||
AI:RemoveDeck:Random
|
||||
Oracle:Flying\nArchfiend of the Dross enters the battlefield with four oil counters on it.\nAt the beginning of your upkeep, remove an oil counter from Archfiend of the Dross. Then if it has no oil counters on it, you lose the game.\nWhenever a creature an opponent controls dies, its controller loses 2 life.
|
||||
Oracle:Flying\nArchfiend of the Dross enters the battlefield with four oil counters on it.\nAt the beginning of your upkeep, remove an oil counter from Archfiend of the Dross. Then if it has no oil counters on it, you lose the game.\nWhenever a creature an opponent controls dies, its controller loses 2 life.
|
||||
|
||||
@@ -4,10 +4,10 @@ Types:Artifact Creature Phyrexian Masticore
|
||||
PT:5/5
|
||||
K:First strike
|
||||
K:Protection:Card.MultiColor:Protection from multicolored
|
||||
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigSacrifice | TriggerDescription$ At the beginning of your upkeep, sacrifice CARDNAME unless you discard a card. When you discard a card this way, destroy target nonland permanent an opponent controls with mana value less than or equal to the mana value of the discarded card.
|
||||
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigSacrifice | TriggerDescription$ At the beginning of your upkeep, sacrifice CARDNAME unless you discard a card. When you discard a card this way, destroy target nonland permanent an opponent controls with mana value less than or equal to the mana value of the discarded card.
|
||||
SVar:TrigSacrifice:DB$ Sacrifice | UnlessCost$ Discard<1/Card> | UnlessPayer$ You | OrString$ Sacrifice it. | SubAbility$ TrigImmediateTrig
|
||||
SVar:TrigImmediateTrig:DB$ ImmediateTrigger | ConditionDefined$ Discarded | ConditionPresent$ Card | ConditionCompare$ GE1 | RememberObjects$ Discarded | Execute$ TrigDestroy | TriggerDescription$ When you discard a card this way, destroy target nonland permanent an opponent controls with mana value less than or equal to the mana value of the discarded card.
|
||||
SVar:TrigImmediateTrig:DB$ ImmediateTrigger | ConditionDefined$ Discarded | ConditionPresent$ Card | ConditionCompare$ GE1 | RememberObjects$ Discarded | Execute$ TrigDestroy | TriggerDescription$ When you discard a card this way, destroy target nonland permanent an opponent controls with mana value less than or equal to the mana value of the discarded card.
|
||||
SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Permanent.nonLand+cmcLEX+OppCtrl | TgtPrompt$ Select target nonland permanent an opponent controls with mana value less or equal to the discarded card
|
||||
SVar:X:TriggerRemembered$CardManaCost
|
||||
DeckHas:Ability$Discard|Sacrifice
|
||||
Oracle:First strike, protection from multicolored\nAt the beginning of your upkeep, sacrifice Argentum Masticore unless you discard a card. When you discard a card this way, destroy target nonland permanent an opponent controls with mana value less than or equal to the mana value of the discarded card.
|
||||
Oracle:First strike, protection from multicolored\nAt the beginning of your upkeep, sacrifice Argentum Masticore unless you discard a card. When you discard a card this way, destroy target nonland permanent an opponent controls with mana value less than or equal to the mana value of the discarded card.
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
Name:Awaken the Sleeper
|
||||
ManaCost:3 R
|
||||
Types:Sorcery
|
||||
A:SP$ GainControl | ValidTgts$ Creature | LoseControl$ EOT | Untap$ True | AddKWs$ Haste | SubAbility$ ChompEquip | SpellDescription$ Gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn.
|
||||
SVar:ChompEquip:DB$ DestroyAll | ValidCards$ Targeted.Equipment+Attached | ValidDescription$ each equipment equipped to target creature | Optional$ True | SpellDescription$ If it's equipped, you may destroy all Equipment attached to that creature.
|
||||
Oracle:Gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn. If it's equipped, you may destroy all Equipment attached to that creature.
|
||||
@@ -0,0 +1,9 @@
|
||||
Name:Basilica Skullbomb
|
||||
ManaCost:1
|
||||
Types:Artifact
|
||||
A:AB$ Draw | Cost$ 1 Sac<1/CARDNAME> | SpellDescription$ Draw a card.
|
||||
A:AB$ Pump | Cost$ 2 W Sac<1/CARDNAME> | ValidTgts$ Creature.YouCtrl | NumAtt$ 2 | NumDef$ 2 | SubAbility$ DBDraw | KW$ Flying | TgtPrompt$ Select target creature you control | SorcerySpeed$ True | SpellDescription$ Target creature you control gets +2/+2 and gains flying until end of turn. Draw a card. Activate only as a sorcery.
|
||||
SVar:DBDraw:DB$ Draw
|
||||
AI:RemoveDeck:Random
|
||||
DeckHas:Color$White & Ability$Sacrifice
|
||||
Oracle:{1}, Sacrifice Basilica Skullbomb: Draw a card.\n{2}{W}, Sacrifice Basilica Skullbomb: Target creature you control gets +2/+2 and gains flying until end of turn. Draw a card. Activate only as a sorcery.
|
||||
@@ -0,0 +1,7 @@
|
||||
Name:Bilious Skulldweller
|
||||
ManaCost:B
|
||||
Types:Creature Phyrexian Insect
|
||||
PT:1/1
|
||||
K:Deathtouch
|
||||
K:Toxic:1
|
||||
Oracle:Deathtouch\nToxic 1 (Players dealt combat damage by this creature also get a poison counter.)
|
||||
11
forge-gui/res/cardsfolder/upcoming/cacophony_scamp.txt
Normal file
11
forge-gui/res/cardsfolder/upcoming/cacophony_scamp.txt
Normal file
@@ -0,0 +1,11 @@
|
||||
Name:Cacophony Scamp
|
||||
ManaCost:R
|
||||
Types:Creature Phyrexian Goblin Warrior
|
||||
PT:1/1
|
||||
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigProliferate | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may sacrifice it. If you do, proliferate. (Choose any number of permanents and/or players, then give each another counter of each kind already there.)
|
||||
SVar:TrigProliferate:AB$ Proliferate | Cost$ Sac<1/CARDNAME>
|
||||
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDamage | TriggerDescription$ When CARDNAME dies, it deals damage equal to its power to any target.
|
||||
SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X
|
||||
SVar:X:TriggeredCard$CardPower
|
||||
DeckHas:Ability$Sacrifice
|
||||
Oracle:Whenever Cacophony Scamp deals combat damage to a player, you may sacrifice it. If you do, proliferate. (Choose any number of permanents and/or players, then give each another counter of each kind already there.)\nWhen Cacophony Scamp dies, it deals damage equal to its power to any target.
|
||||
@@ -0,0 +1,7 @@
|
||||
Name:Carnivorous Canopy
|
||||
ManaCost:2 G
|
||||
Types:Sorcery
|
||||
A:SP$ Destroy | ValidTgts$ Artifact,Enchantment,Creature.withFlying | TgtPrompt$ Select target artifact, enchantment, or creature with flying. | SubAbility$ DBProliferate | SpellDescription$ Destroy target artifact, enchantment, or creature with flying.
|
||||
SVar:DBProliferate:DB$ Proliferate | ConditionDefined$ Targeted | ConditionPresent$ Permanent.cmcLE3 | SpellDescription$ If that permanent's mana value was 3 or less, proliferate. (Choose any number of permanents and/or players, then give each another counter of each kind already there.)
|
||||
DeckHas:Ability$Proliferate
|
||||
Oracle:Destroy target artifact, enchantment, or creature with flying.\nIf that permanent's mana value was 3 or less, proliferate. (Choose any number of permanents and/or players, then give each another counter of each kind already there.)
|
||||
@@ -5,7 +5,7 @@ PT:5/5
|
||||
K:Vigilance
|
||||
S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ This spell costs {1} less to cast for each permanent you control with oil counters on it.
|
||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDamage | TriggerDescription$ When CARDNAME enters the battlefield, it deals 1 damage to each creature your opponents control.
|
||||
SVar:TrigDamage:DB$ DamageAll | ValidCards$ Creature.OppCtrl | NumDmg$ 1
|
||||
SVar:TrigDamage:DB$ DamageAll | ValidCards$ Creature.OppCtrl | NumDmg$ 1
|
||||
SVar:X:Count$Valid Permanent.YouCtrl+counters_GE1_OIL
|
||||
DeckHints:Ability$Counters
|
||||
Oracle:This spell costs {1} less to cast for each permanent you control with oil counters on it.\nVigilance\nWhen Cinderslash Ravager enters the battlefield, it deals 1 damage to each creature your opponents control.
|
||||
9
forge-gui/res/cardsfolder/upcoming/dross_skullbomb.txt
Normal file
9
forge-gui/res/cardsfolder/upcoming/dross_skullbomb.txt
Normal file
@@ -0,0 +1,9 @@
|
||||
Name:Dross Skullbomb
|
||||
ManaCost:1
|
||||
Types:Artifact
|
||||
A:AB$ Draw | Cost$ 1 Sac<1/CARDNAME> | SpellDescription$ Draw a card.
|
||||
A:AB$ ChangeZone | Cost$ 1 B Sac<1/CARDNAME> | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Select target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | SorcerySpeed$ True | SubAbility$ DBDraw | SpellDescription$ Return target creature card from your graveyard to your hand. Draw a card. Activate only as a sorcery.
|
||||
SVar:DBDraw:DB$ Draw
|
||||
DeckNeeds:Color$Black
|
||||
DeckHas:Ability$Sacrifice|Graveyard
|
||||
Oracle:{1}, Sacrifice Dross Skullbomb: Draw a card.\n{2}{B}, Sacrifice Dross Skullbomb: Return target creature card from your graveyard to your hand. Draw a card. Activate only as a sorcery.
|
||||
@@ -3,7 +3,7 @@ ManaCost:1 U
|
||||
Types:Artifact Creature Phyrexian Beast
|
||||
PT:2/1
|
||||
T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDebuff | TriggerDescription$ Whenever CARDNAME attacks, target creature an opponent controls gets -X/-0 until end of turn, where X is the number of artifacts you control.
|
||||
SVar:TrigDebuff:DB$ Pump | NumAtt$ -X | NumDef$ -0 | ValidTgts$ Creature.OppCtrl
|
||||
SVar:TrigDebuff:DB$ Pump | NumAtt$ -X | NumDef$ -0 | ValidTgts$ Creature.OppCtrl
|
||||
SVar:X:Count$Valid Artifact.YouCtrl
|
||||
SVar:HasAttackEffect:TRUE
|
||||
DeckHints:Type$Artifact
|
||||
|
||||
@@ -3,7 +3,7 @@ ManaCost:1 B B
|
||||
Types:Legendary Creature Phyrexian Zombie
|
||||
PT:3/4
|
||||
S:Mode$ Continuous | Affected$ Creature.Other+YouCtrl | AddPower$ -1 | AddToughness$ -1 | Description$ Other creatures you control get -1/-1.
|
||||
A:AB$ ChangeZone | Cost$ 1 B B T | Origin$ Graveyard | SorcerySpeed$ True | Destination$ Battlefield | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature in your graveyard | SubAbility$ DBAnimate | SpellDescription$ Return target creature card from your graveyard to the battlefield. It gains "If this creature would leave the battlefield, exile it instead of putting it anywhere else." Activate only as a sorcery.
|
||||
A:AB$ ChangeZone | Cost$ 1 B B T | Origin$ Graveyard | SorcerySpeed$ True | Destination$ Battlefield | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature in your graveyard | SubAbility$ DBAnimate | SpellDescription$ Return target creature card from your graveyard to the battlefield. It gains "If this creature would leave the battlefield, exile it instead of putting it anywhere else." Activate only as a sorcery.
|
||||
SVar:DBAnimate:DB$ Animate | Replacements$ ReplaceLeaves | Defined$ Targeted | Duration$ Permanent
|
||||
SVar:ReplaceLeaves:Event$ Moved | ActiveZones$ Battlefield | Origin$ Battlefield | ValidCard$ Card.Self | ReplaceWith$ Exile | Description$ If this creature would leave the battlefield, exile it instead.
|
||||
SVar:Exile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | Defined$ ReplacedCard
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
Name:Gleeful Demolition
|
||||
ManaCost:R
|
||||
Types:Sorcery
|
||||
K:For Mirrodin
|
||||
A:SP$ Destroy | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SubAbility$ DBToken | RememberLKI$ True | AlwaysRemember$ True | SpellDescription$ Destroy target artifact. If you controlled that artifact, creature three 1/1 red Phyrexian Goblin creature tokens.
|
||||
SVar:DBToken:DB$ Token | TokenAmount$ 3 | TokenScript$ r_1_1_phyrexian_goblin | TokenOwner$ You | ConditionDefined$ RememberedLKI | ConditionPresent$ Card.YouCtrl | SubAbility$ DBCleanup | SpellDescription$ If you controlled that artifact, creature three 1/1 red Phyrexian Goblin creature tokens.
|
||||
A:SP$ Destroy | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SubAbility$ DBToken | RememberLKI$ True | AlwaysRemember$ True | SpellDescription$ Destroy target artifact. If you controlled that artifact, creature three 1/1 red Phyrexian Goblin creature tokens.
|
||||
SVar:DBToken:DB$ Token | TokenAmount$ 3 | TokenScript$ r_1_1_phyrexian_goblin | TokenOwner$ You | ConditionDefined$ RememberedLKI | ConditionPresent$ Card.YouCtrl | SubAbility$ DBCleanup | SpellDescription$ If you controlled that artifact, creature three 1/1 red Phyrexian Goblin creature tokens.
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
DeckHas:Type$Goblin|Phryexian & Ability$Token
|
||||
Oracle:Destroy target artifact. If you controlled that artifact, creature three 1/1 red Phyrexian Goblin creature tokens.
|
||||
|
||||
8
forge-gui/res/cardsfolder/upcoming/glistener_seer.txt
Normal file
8
forge-gui/res/cardsfolder/upcoming/glistener_seer.txt
Normal file
@@ -0,0 +1,8 @@
|
||||
Name:Glistener Seer
|
||||
ManaCost:U
|
||||
Types:Creature Phyrexian Advisor
|
||||
PT:0/3
|
||||
K:etbCounter:OIL:3
|
||||
A:AB$ Scry | Cost$ T SubCounter<1/OIL/CARDNAME> | ScryNum$ 1 | SpellDescription$ Scry 1. (Look at the top card of your library. You may put that card on the bottom.)
|
||||
DeckHas:Ability$Counters
|
||||
Oracle:Glistener Seer enters the battlefield with three oil counters on it.\n{T}, Remove an oil counter from Glistener Seer: Scry 1. (Look at the top card of your library. You may put that card on the bottom.)
|
||||
@@ -5,7 +5,7 @@ K:Affinity:Equipment
|
||||
A:SP$ Token | TokenScript$ r_2_2_rebel | TokenOwner$ You | RememberTokens$ True | TokenAmount$ 5 | SubAbility$ DBRepeat | PumpKeywords$ Haste | PumpDuration$ EOT | SpellDescription$ Create five 2/2 red Rebel creature tokens. They gain haste until end of turn. For each of those tokens, you may attach an Equipment you control to it.
|
||||
SVar:DBRepeat:DB$ RepeatEach | UseImprinted$ True | DefinedCards$ DirectRemembered | RepeatSubAbility$ DBAttach | SubAbility$ DBCleanup
|
||||
SVar:DBAttach:DB$ Attach | Choices$ Equipment.YouCtrl+!IsRemembered | Defined$ Imprinted | RememberAttached$ True | ChoiceTitle$ Select an equipment to attach to this token | Optional$ True
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearImprinted$ True | ClearRemembered$ True
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearImprinted$ True | ClearRemembered$ True
|
||||
DeckHas:Ability$Token & Type$Rebel & Color$Red
|
||||
DeckNeeds:Type$Equipment
|
||||
Oracle:Affinity for Equipment (This spell costs {1} less to cast for each Equipment you control.)\nCreate five 2/2 red Rebel creature tokens. They gain haste until end of turn. For each of those tokens, you may attach an Equipment you control to it.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
Name:Gulping Scraptrap
|
||||
ManaCost:3 U
|
||||
ManaCost:4 B
|
||||
Types:Creature Phyrexian Horror
|
||||
PT:4/4
|
||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigProliferate | TriggerDescription$ When CARDNAME enters the battlefield or dies, proliferate. (Choose any number of permanents and/or players, then give each another counter of each kind already there.)
|
||||
|
||||
@@ -4,11 +4,11 @@ Types:Creature Human Soldier
|
||||
PT:1/4
|
||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a tapped Powerstone token.
|
||||
SVar:TrigToken:DB$ Token | TokenTapped$ True | TokenScript$ c_a_powerstone
|
||||
T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigUnblockable | TriggerDescription$ Whenever CARDNAME attacks, you may pay {3}. If you do, CARDNAME can't be blocked this turn and it perpetually gets +2/+0.
|
||||
T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigUnblockable | TriggerDescription$ Whenever CARDNAME attacks, you may pay {3}. If you do, CARDNAME can't be blocked this turn and it perpetually gets +2/+0.
|
||||
SVar:TrigUnblockable:AB$ Effect | Cost$ 3 | StaticAbilities$ Unblockable | SubAbility$ DBEffect
|
||||
SVar:DBEffect:DB$ Effect | StaticAbilities$ PerpetualPump | Duration$ Permanent | Name$ Hurkyl's Prodigy's Perpetual Effect
|
||||
SVar:Unblockable:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | Description$ This creature can't be blocked.
|
||||
SVar:PerpetualPump:Mode$ Continuous | Affected$ Card.EffectSource | AddPower$ 2 | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ EFFECTSOURCE perpetually gets +2/+0.
|
||||
SVar:HasAttackEffect:TRUE
|
||||
DeckHas:Ability$Token & Type$Artifact|Powerstone
|
||||
Oracle:When Hurkyl's Prodigy enter the battlefield, create a tapped Powerstone token.\nWhenever Hurkyl's Prodigy attacks, you may pay {3}. If you do, Hurkyl's Prodigy can't be blocked this turn and it perpetually gets +2/+0.
|
||||
Oracle:When Hurkyl's Prodigy enter the battlefield, create a tapped Powerstone token.\nWhenever Hurkyl's Prodigy attacks, you may pay {3}. If you do, Hurkyl's Prodigy can't be blocked this turn and it perpetually gets +2/+0.
|
||||
|
||||
9
forge-gui/res/cardsfolder/upcoming/ichorplate_golem.txt
Normal file
9
forge-gui/res/cardsfolder/upcoming/ichorplate_golem.txt
Normal file
@@ -0,0 +1,9 @@
|
||||
Name:Ichorplate Golem
|
||||
ManaCost:3
|
||||
Types:Artifact Creature Phyrexian Golem
|
||||
PT:2/3
|
||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | TriggerZones$ Battlefield | ValidCard$ Creature.YouCtrl+counters_GE1_OIL | Execute$ TrigPutCounter | TriggerDescription$ Whenever a creature enters the battlefield under your control, if it has one or more oil counters on it, put an oil counter on it.
|
||||
SVar:TrigPutCounter:DB$ PutCounter | Defined$ TriggeredCardLKICopy | ConditionDefined$ TriggeredCard | ConditionPresent$ Creature.counters_GE1_OIL | CounterNum$ 1 | CounterType$ OIL
|
||||
S:Mode$ Continuous | AddPower$ 1 | AddToughness$ 1 | Affected$ Creature.YouCtrl+counters_GE1_OIL | Description$ Creatures you control with oil counters on them get +1/+1.
|
||||
DeckHas:Ability$Counters
|
||||
Oracle:Whenever a creature enters the battlefield under your control, if it has one or more oil counters on it, put an oil counter on it.\nCreatures you control with oil counters on them get +1/+1.
|
||||
@@ -5,7 +5,7 @@ PT:3/3
|
||||
K:Starting intensity:1
|
||||
T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | Execute$ TrigChoose | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of combat on your turn, you may cast a spell with mana value equal to CARDNAME's intensity from your graveyard without paying its mana cost. If you do, perpetually increase NICKNAME's intensity by 1.
|
||||
SVar:TrigChoose:DB$ ChooseCard | ChoiceZone$ Graveyard | Choices$ Card.YouCtrl+cmcEQX | ChoiceTitle$ Choose a spell with mana value equal to Jarsyl, Dark Age Scion's intensity | MinAmount$ 1 | Amount$ 1 | SubAbility$ DBPlay
|
||||
SVar:DBPlay:DB$ Play | Defined$ ChosenCard | ValidSA$ Spell | WithoutManaCost$ True | Optional$ True | AILogic$ ReplaySpell | SubAbility$ DBIncrease | RememberPlayed$ True
|
||||
SVar:DBPlay:DB$ Play | Defined$ ChosenCard | ValidSA$ Spell | WithoutManaCost$ True | Optional$ True | AILogic$ ReplaySpell | SubAbility$ DBIncrease | RememberPlayed$ True
|
||||
SVar:DBIncrease:DB$ Intensify | ConditionDefined$ Remembered | ConditionPresent$ Card | SubAbility$ DBCleanup
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearChosenCard$ True
|
||||
SVar:X:Count$Intensity
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
Name:Kinzu of the Bleak Coven
|
||||
ManaCost:4 B
|
||||
Types:Legendary Creature Phyrexian Vampire
|
||||
PT:5/4
|
||||
K:Flying
|
||||
T:Mode$ ChangesZone | ValidCard$ Creature.nonToken+Other+YouCtrl | Origin$ Battlefield | Destination$ Graveyard | TriggerZones$ Battlefield | Execute$ TrigExile | OptionalDecider$ You | TriggerDescription$ Whenever another nontoken creature you control dies, you may pay 2 life and exile it. If you do, create a token that's a copy of that creature, except it's 1/1 and has toxic 1. (Players dealt combat damage by it also get a poison counter.)
|
||||
SVar:TrigExile:AB$ CopyPermanent | Cost$ PayLife<2> ExileFromGrave<1/Card.TriggeredCard/Exile nontoken creature that just died> | PumpKeywords$ Toxic:1 | Defined$ TriggeredCardLKICopy | SetPower$ 1 | SetToughness$ 1
|
||||
DeckHas:Ability$Token
|
||||
Oracle:Flying\nWhenever another nontoken creature you control dies, you may pay 2 life and exile it. If you do, create a token that's a copy of that creature, except it's 1/1 and has toxic 1. (Players dealt combat damage by it also get a poison counter.)
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user