Merge branch 'Card-Forge:master' into master

This commit is contained in:
TabletopGeneral
2023-02-06 07:44:55 -05:00
committed by GitHub
148 changed files with 1655 additions and 1388 deletions

View File

@@ -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) {

View File

@@ -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) {

View File

@@ -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),

View File

@@ -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

View File

@@ -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);
}
}

View File

@@ -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) {

View File

@@ -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.
*
*/

View File

@@ -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)

View File

@@ -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);
}
}

View File

@@ -80,7 +80,7 @@ public class ChangeTargetsEffect extends SpellAbilityEffect {
GameObject newTarget = Iterables.getFirst(getDefinedCardsOrTargeted(sa, "DefinedMagnet"), null);
// CR 115.3. The same target cant 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);

View File

@@ -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);

View File

@@ -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);

View File

@@ -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).");
}

View File

@@ -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");

View File

@@ -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();

View File

@@ -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")) {

View File

@@ -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);
}

View File

@@ -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());

View File

@@ -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());

View File

@@ -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:")) {

View File

@@ -110,7 +110,7 @@ public class DelayedTriggerEffect extends SpellAbilityEffect {
@Override
public void run() {
trigHandler.registerDelayedTrigger(delTrig);
}
};
game.getCleanup().addUntil(upcomingTurnTrig);

View File

@@ -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);

View File

@@ -344,7 +344,7 @@ public class DigEffect extends SpellAbilityEffect {
}
} else {
String prompt;
if (sa.hasParam("PrimaryPrompt")) {
prompt = sa.getParam("PrimaryPrompt");
} else {

View File

@@ -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);
}

View File

@@ -42,7 +42,7 @@ public class ManaReflectedEffect extends SpellAbilityEffect {
* <p>
* generatedReflectedMana.
* </p>
*
*
* @param sa
* a {@link forge.game.spellability.SpellAbility} object.
* @param colors

View File

@@ -54,7 +54,7 @@ public class MeldEffect extends SpellAbilityEffect {
return;
}
}
if (sa.hasParam("Tapped")) {
primary.setTapped(true);
}

View File

@@ -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);

View File

@@ -82,7 +82,7 @@ public class MustBlockEffect extends SpellAbilityEffect {
}
};
addUntilCommand(sa, removeBlockingRequirements);
}
}
}
@Override

View File

@@ -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()) + " - " +

View File

@@ -5,7 +5,7 @@ import forge.game.spellability.SpellAbility;
import forge.util.CardTranslation;
import forge.util.Localizer;
/**
/**
* TODO: Write javadoc for this type.
*
*/

View File

@@ -18,7 +18,7 @@ public class PermanentEffect extends SpellAbilityEffect {
/*
* (non-Javadoc)
*
*
* @see
* forge.card.abilityfactory.SpellEffect#resolve(forge.card.spellability.
* SpellAbility)

View File

@@ -4,7 +4,7 @@ import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
import forge.util.CardTranslation;
/**
/**
* TODO: Write javadoc for this type.
*
*/

View File

@@ -12,7 +12,7 @@ import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.util.Lang;
/**
/**
* TODO: Write javadoc for this type.
*
*/

View File

@@ -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<>();

View File

@@ -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() {

View File

@@ -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))

View File

@@ -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

View File

@@ -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);

View File

@@ -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);

View File

@@ -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);
}

View File

@@ -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

View File

@@ -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);

View File

@@ -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);
}

View File

@@ -8,7 +8,7 @@ import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.util.Localizer;
/**
/**
* TODO: Write javadoc for this type.
*
*/

View File

@@ -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);
}
}

View File

@@ -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();

View File

@@ -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);

View File

@@ -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));
}

View File

@@ -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;

View File

@@ -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/>.
*/

View File

@@ -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);

View File

@@ -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);

View File

@@ -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);
}
}

View File

@@ -133,7 +133,7 @@ public class VentureEffect extends SpellAbilityEffect {
for (final Player p : getTargetPlayers(sa)) {
if (!p.isInGame()) {
continue;
continue;
}
ventureIntoDungeon(sa, p, moveParams);
}

View File

@@ -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() {

View File

@@ -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();

View File

@@ -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());
}
}
}

View File

@@ -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;
}

View File

@@ -1010,4 +1010,8 @@ public class ReplacementHandler {
});
return !list.isEmpty();
}
public boolean isReplacing() {
return !hasRun.isEmpty();
}
}

View File

@@ -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("");

View File

@@ -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);
}
}
}

View File

@@ -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;
}

View File

@@ -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;
}
}

View File

@@ -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),

View File

@@ -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

View File

@@ -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.

View File

@@ -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.

View File

@@ -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.

View File

@@ -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

View File

@@ -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.

View File

@@ -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.

View File

@@ -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.)

View File

@@ -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

View File

@@ -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.

View File

@@ -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.

View File

@@ -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.

View File

@@ -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

View File

@@ -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.

View File

@@ -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.

View File

@@ -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

View File

@@ -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.

View File

@@ -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.

View File

@@ -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.

View File

@@ -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.

View File

@@ -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.

View File

@@ -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.)

View 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.

View File

@@ -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.)

View File

@@ -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.

View 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.

View File

@@ -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

View File

@@ -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

View File

@@ -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.

View 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.)

View File

@@ -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.

View File

@@ -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.)

View File

@@ -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.

View 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.

View File

@@ -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

View File

@@ -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