Merge branch 'Card-Forge:master' into master

This commit is contained in:
TabletopGeneral
2023-07-17 16:31:27 -04:00
committed by GitHub
57 changed files with 761 additions and 208 deletions

View File

@@ -2436,13 +2436,23 @@ public class GameAction {
damageMap.triggerExcessDamage(isCombat, lethalDamage, game, cause, lkiCache);
// lose life simultaneously
if (isCombat) {
Map<Player, Integer> lifeLostAllDamageMap = Maps.newHashMap();
for (Player p : game.getPlayers()) {
p.dealCombatDamage();
int lost = p.processDamage();
if (lost > 0) {
lifeLostAllDamageMap.put(p, lost);
}
}
if (isCombat) {
game.getTriggerHandler().runWaitingTriggers();
}
if (!lifeLostAllDamageMap.isEmpty()) { // Run triggers if any player actually lost life
final Map<AbilityKey, Object> runParams = AbilityKey.mapFromPIMap(lifeLostAllDamageMap);
game.getTriggerHandler().runTrigger(TriggerType.LifeLostAll, runParams, false);
}
if (cause != null) {
// Remember objects as needed
final Card sourceLKI = game.getChangeZoneLKIInfo(cause.getHostCard());

View File

@@ -1,13 +1,12 @@
package forge.game.ability;
import java.util.EnumMap;
import java.util.Map;
import forge.game.GameEntity;
import forge.game.card.Card;
import forge.game.player.Player;
import java.util.EnumMap;
import java.util.Map;
/**
* Keys for Ability parameter maps.
*/
@@ -84,6 +83,7 @@ public enum AbilityKey {
LastStateGraveyard("LastStateGraveyard"),
LifeAmount("LifeAmount"), //TODO confirm that this and LifeGained can be merged
LifeGained("LifeGained"),
Map("Map"),
Mana("Mana"),
MergedCards("MergedCards"),
Mode("Mode"),
@@ -193,4 +193,11 @@ public enum AbilityKey {
runParams.put(Affected, gameEntity);
return runParams;
}
public static Map<AbilityKey, Object> mapFromPIMap(Map<Player, Integer> map) {
final Map<AbilityKey, Object> runParams = newMap();
runParams.put(Map, map);
return runParams;
}
}

View File

@@ -125,9 +125,7 @@ public class ChooseCardEffect extends SpellAbilityEffect {
for (final String type : partyTypes) {
CardCollection valids = CardLists.filter(p.getCardsIn(ZoneType.Battlefield),
CardPredicates.isType(type));
for (Card alreadyChosen : chosen) {
valids.remove(alreadyChosen);
}
valids.removeAll(chosen);
if (!valids.isEmpty()) {
final String prompt = Localizer.getInstance().getMessage("lblChoose") + " " +
Lang.nounWithNumeralExceptOne(1, type);

View File

@@ -1,11 +1,15 @@
package forge.game.ability.effects;
import java.util.List;
import com.google.common.collect.Maps;
import forge.game.ability.AbilityKey;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.trigger.TriggerType;
import java.util.List;
import java.util.Map;
public class LifeExchangeEffect extends SpellAbilityEffect {
@@ -56,17 +60,27 @@ public class LifeExchangeEffect extends SpellAbilityEffect {
source.addRemembered(diff);
}
final Map<Player, Integer> lossMap = Maps.newHashMap();
if ((life1 > life2) && p1.canLoseLife() && p2.canGainLife()) {
final int diff = life1 - life2;
p1.loseLife(diff, false, false);
final int lost = p1.loseLife(diff, false, false);
p2.gainLife(diff, source, sa);
if (lost > 0) {
lossMap.put(p1, lost);
}
} else if ((life2 > life1) && p2.canLoseLife() && p1.canGainLife()) {
final int diff = life2 - life1;
p2.loseLife(diff, false, false);
final int lost = p2.loseLife(diff, false, false);
p1.gainLife(diff, source, sa);
if (lost > 0) {
lossMap.put(p2, lost);
}
} else {
// they are equal, so nothing to do
// they are equal or can't be exchanged, so nothing to do
}
if (!lossMap.isEmpty()) { // Run triggers if any player actually lost life
final Map<AbilityKey, Object> runParams = AbilityKey.mapFromPIMap(lossMap);
source.getGame().getTriggerHandler().runTrigger(TriggerType.LifeLostAll, runParams, false);
}
}
}

View File

@@ -1,13 +1,17 @@
package forge.game.ability.effects;
import java.util.List;
import com.google.common.collect.Maps;
import forge.game.Game;
import forge.game.ability.AbilityKey;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
import forge.game.event.GameEventCardStatsChanged;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.trigger.TriggerType;
import java.util.List;
import java.util.Map;
public class LifeExchangeVariantEffect extends SpellAbilityEffect {
@@ -68,9 +72,16 @@ public class LifeExchangeVariantEffect extends SpellAbilityEffect {
if ((pLife > num) && p.canLoseLife()) {
final int diff = pLife - num;
p.loseLife(diff, false, false);
final int lost = p.loseLife(diff, false, false);
source.addNewPT(power, toughness, timestamp, 0);
game.fireEvent(new GameEventCardStatsChanged(source));
if (lost > 0) { // Run triggers if player actually lost life
final Map<Player, Integer> lossMap = Maps.newHashMap();
lossMap.put(p, lost);
final Map<AbilityKey, Object> runParams = AbilityKey.mapFromPIMap(lossMap);
source.getGame().getTriggerHandler().runTrigger(TriggerType.LifeLostAll, runParams, false);
}
} else if ((num > pLife) && p.canGainLife()) {
final int diff = num - pLife;
p.gainLife(diff, source, sa);

View File

@@ -1,12 +1,17 @@
package forge.game.ability.effects;
import com.google.common.collect.Maps;
import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.trigger.TriggerType;
import forge.util.Lang;
import org.apache.commons.lang3.StringUtils;
import java.util.Map;
public class LifeLoseEffect extends SpellAbilityEffect {
/* (non-Javadoc)
@@ -41,13 +46,23 @@ public class LifeLoseEffect extends SpellAbilityEffect {
final int lifeAmount = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("LifeAmount"), sa);
final Map<Player, Integer> lossMap = Maps.newHashMap();
for (final Player p : getTargetPlayers(sa)) {
if (!p.isInGame()) {
continue;
}
lifeLost += p.loseLife(lifeAmount, false, false);
final int lost = p.loseLife(lifeAmount, false, false);
if (lost > 0) {
lossMap.put(p, lost);
}
lifeLost += lost;
}
sa.setSVar("AFLifeLost", "Number$" + lifeLost);
if (!lossMap.isEmpty()) { // Run triggers if any player actually lost life
final Map<AbilityKey, Object> runParams = AbilityKey.mapFromPIMap(lossMap);
sa.getHostCard().getGame().getTriggerHandler().runTrigger(TriggerType.LifeLostAll, runParams, false);
}
}
}

View File

@@ -1,16 +1,22 @@
package forge.game.ability.effects;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
import forge.game.player.Player;
import forge.game.player.PlayerCollection;
import forge.game.player.PlayerController;
import forge.game.spellability.SpellAbility;
import forge.game.trigger.TriggerType;
import forge.util.Lang;
import forge.util.Localizer;
import java.util.ArrayList;
import java.util.List;
import com.google.common.collect.Lists;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
import forge.game.player.Player;
import forge.game.player.PlayerCollection;
import forge.game.spellability.SpellAbility;
import forge.util.Localizer;
import java.util.Map;
public class LifeSetEffect extends SpellAbilityEffect {
@@ -19,10 +25,38 @@ public class LifeSetEffect extends SpellAbilityEffect {
*/
@Override
public void resolve(SpellAbility sa) {
final Card source = sa.getHostCard();
final boolean redistribute = sa.hasParam("Redistribute");
final int lifeAmount = redistribute ? 0 : AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("LifeAmount"), sa);
final int lifeAmount = redistribute ? 0 : AbilityUtils.calculateAmount(source, sa.getParam("LifeAmount"), sa);
final List<Integer> lifetotals = new ArrayList<>();
final PlayerCollection players = getTargetPlayers(sa);
final PlayerController pc = sa.getActivatingPlayer().getController();
PlayerCollection players = new PlayerCollection();
if (sa.hasParam("PlayerChoices")) {
PlayerCollection choices = AbilityUtils.getDefinedPlayers(source, sa.getParam("PlayerChoices"), sa);
int n = 1;
int min = 1;
if (sa.hasParam("ChoiceAmount")) {
if (sa.getParam("ChoiceAmount").equals("Any")) {
n = choices.size();
min = 0;
} else {
n = AbilityUtils.calculateAmount(source, sa.getParam("ChoiceAmount"), sa);
min = n;
}
}
final String prompt = sa.hasParam("ChoicePrompt") ? sa.getParam("ChoicePrompt") :
Localizer.getInstance().getMessage("lblChoosePlayer");
List<Player> chosen = pc.chooseEntitiesForEffect(choices, min, n, null, sa, prompt, null,
null);
players.addAll(chosen);
} else {
players = getTargetPlayers(sa);
}
if (players.isEmpty()) {
return;
}
if (redistribute) {
for (final Player p : players) {
@@ -33,23 +67,33 @@ public class LifeSetEffect extends SpellAbilityEffect {
}
}
final Map<Player, Integer> lossMap = Maps.newHashMap();
for (final Player p : players.threadSafeIterable()) {
if (!p.isInGame()) {
continue;
}
final int preLife = p.getLife();
if (!redistribute) {
p.setLife(lifeAmount, sa);
} else {
List<Integer> validChoices = getDistribution(players, true, lifetotals);
int life = sa.getActivatingPlayer().getController().chooseNumber(sa, Localizer.getInstance().getMessage("lblLifeTotal") + ": " + p, validChoices, p);
int life = pc.chooseNumber(sa, Localizer.getInstance().getMessage("lblLifeTotal") + ": " + p, validChoices, p);
p.setLife(life, sa);
lifetotals.remove((Integer) life);
players.remove(p);
}
final int diff = preLife - p.getLife();
if (diff > 0) {
lossMap.put(p, diff);
}
}
if (!lossMap.isEmpty()) { // Run triggers if any player actually lost life
final Map<AbilityKey, Object> runParams = AbilityKey.mapFromPIMap(lossMap);
source.getGame().getTriggerHandler().runTrigger(TriggerType.LifeLostAll, runParams, false);
}
}
private static List<Integer> getDistribution(PlayerCollection players, boolean top, List<Integer> remainingChoices) {
private static List<Integer> getDistribution(List<Player> players, boolean top, List<Integer> remainingChoices) {
// distribution was successful
if (players.isEmpty()) {
// carry signal back
@@ -95,23 +139,18 @@ public class LifeSetEffect extends SpellAbilityEffect {
*/
@Override
protected String getStackDescription(SpellAbility sa) {
if (sa.hasParam("Redistribute")) {
if (sa.hasParam("SpellDescription")) {
return sa.getParam("SpellDescription");
} else {
return ("Please add StackDescription or SpellDescription for Redistribute in LifeSetEffect.");
}
}
final StringBuilder sb = new StringBuilder();
final int amount = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("LifeAmount"), sa);
final boolean redistribute = sa.hasParam("Redistribute");
List<Player> tgtPlayers = getTargetPlayers(sa);
if (!redistribute) {
for (final Player player : tgtPlayers) {
sb.append(player).append(" ");
}
sb.append(Lang.joinHomogenous(getTargetPlayers(sa)));
sb.append(" life total becomes ").append(amount).append(".");
} else {
sb.append("Redistribute ");
for (final Player player : tgtPlayers) {
sb.append(player).append(" ");
}
sb.append("life totals.");
}
return sb.toString();
}

View File

@@ -4,18 +4,21 @@ import java.util.*;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import forge.GameCommand;
import forge.card.CardType;
import forge.game.Game;
import forge.game.GameEntityCounterTable;
import forge.game.GameObject;
import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.*;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.spellability.SpellAbilityStackInstance;
import forge.game.trigger.TriggerType;
import forge.game.zone.ZoneType;
import forge.util.collect.FCollection;
@@ -81,9 +84,12 @@ public class RepeatEachEffect extends SpellAbilityEffect {
if (sa.hasParam("ChangeZoneTable")) {
sa.setChangeZoneTable(new CardZoneTable());
}
if (sa.hasParam("LoseLifeMap")) {
sa.setLoseLifeMap(Maps.newHashMap());
}
if (loopOverCards) {
if (sa.hasParam("ChooseOrder") && repeatCards.size() >= 2) {
if (sa.hasParam("ChooseOrder") && repeatCards.size() > 1) {
final Player chooser = sa.getParam("ChooseOrder").equals("True") ? player :
AbilityUtils.getDefinedPlayers(source, sa.getParam("ChooseOrder"), sa).get(0);
repeatCards = chooser.getController().orderMoveToZoneList(repeatCards, ZoneType.None, sa);
@@ -207,5 +213,13 @@ public class RepeatEachEffect extends SpellAbilityEffect {
sa.getChangeZoneTable().triggerChangesZoneAll(game, sa);
sa.setChangeZoneTable(null);
}
if (sa.hasParam("LoseLifeMap")) {
Map<Player, Integer> lossMap = sa.getLoseLifeMap();
if (!lossMap.isEmpty()) {
final Map<AbilityKey, Object> runParams2 = AbilityKey.mapFromPIMap(lossMap);
game.getTriggerHandler().runTrigger(TriggerType.LifeLostAll, runParams2, false);
}
sa.setLoseLifeMap(null);
}
}
}

View File

@@ -680,7 +680,7 @@ public class CardFactory {
List<String> creatureTypes = null;
final CardCloneStates result = new CardCloneStates(in, sa);
final String newName = sa.getParamOrDefault("NewName", null);
final String newName = sa.getParam("NewName");
ColorSet colors = null;
if (sa.hasParam("AddTypes")) {

View File

@@ -1274,8 +1274,13 @@ public class CardView extends GameEntityView {
String rulesText = null;
if (type.isVanguard() && rules != null) {
rulesText = "Hand Modifier: " + rules.getHand() +
"\r\nLife Modifier: " + rules.getLife();
boolean decHand = rules.getHand() < 0;
boolean decLife = rules.getLife() < 0;
String handSize = Localizer.getInstance().getMessageorUseDefault("lblHandSize", "Hand Size")
+ (!decHand ? ": +" : ": ") + rules.getHand();
String startingLife = Localizer.getInstance().getMessageorUseDefault("lblStartingLife", "Starting Life")
+ (!decLife ? ": +" : ": ") + rules.getLife();
rulesText = handSize + "\r\n" + startingLife;
}
set(TrackableProperty.RulesText, rulesText);
}

View File

@@ -465,13 +465,21 @@ public class PhaseHandler implements java.io.Serializable {
throw new IllegalStateException("Phase.nextPhase() is called, but Stack isn't empty.");
}
final Map<Player, Integer> lossMap = Maps.newHashMap();
for (Player p : game.getPlayers()) {
int burn = p.getManaPool().clearPool(true).size();
if (p.getManaPool().hasBurn()) {
p.loseLife(burn, false, true);
final int lost = p.loseLife(burn, false, true);
if (lost > 0) {
lossMap.put(p, lost);
}
}
}
if (!lossMap.isEmpty()) { // Run triggers if any player actually lost life
final Map<AbilityKey, Object> runLifeLostParams = AbilityKey.mapFromPIMap(lossMap);
game.getTriggerHandler().runTrigger(TriggerType.LifeLostAll, runLifeLostParams, false);
}
switch (phase) {
case UPKEEP:

View File

@@ -620,13 +620,26 @@ public class Player extends GameEntity implements Comparable<Player> {
return false;
}
loseLife(lifePayment, false, false);
final int lost = loseLife(lifePayment, false, false);
cause.setPaidLife(lifePayment);
// Run triggers
final Map<AbilityKey, Object> runParams = AbilityKey.mapFromPlayer(this);
runParams.put(AbilityKey.LifeAmount, lifePayment);
game.getTriggerHandler().runTrigger(TriggerType.PayLife, runParams, false);
if (lost > 0) { // Run triggers if player actually lost life
boolean runAll = false;
Map<Player, Integer> lossMap = cause.getLoseLifeMap();
if (lossMap == null) {
lossMap = Maps.newHashMap();
runAll = true;
}
lossMap.put(this, lost);
if (runAll) {
final Map<AbilityKey, Object> runParams2 = AbilityKey.mapFromPIMap(lossMap);
game.getTriggerHandler().runTrigger(TriggerType.LifeLostAll, runParams2, false);
}
}
return true;
}
@@ -691,12 +704,7 @@ public class Player extends GameEntity implements Comparable<Player> {
}
else if (!hasKeyword("Damage doesn't cause you to lose life.")) {
// rule 118.2. Damage dealt to a player normally causes that player to lose that much life.
if (isCombat) {
// currently all abilities treat is as single event
simultaneousDamage += amount;
} else {
loseLife(amount, true, false);
}
}
if (isCombat) {
@@ -829,9 +837,10 @@ public class Player extends GameEntity implements Comparable<Player> {
return restDamage;
}
public final void dealCombatDamage() {
loseLife(simultaneousDamage, true, false);
public final int processDamage() {
int lost = loseLife(simultaneousDamage, true, false);
simultaneousDamage = 0;
return lost;
}
/**

View File

@@ -39,12 +39,6 @@ public class ReplaceToken extends ReplacementEffect {
return false;
}
/*/
if (!matchesValidParam("ValidToken", runParams.get(AbilityKey.Token))) {
return false;
}
//*/
if (filterAmount((TokenCreateTable) runParams.get(AbilityKey.Token)) <= 0) {
return false;
}

View File

@@ -66,7 +66,6 @@ import forge.game.staticability.StaticAbilityCastWithFlash;
import forge.game.staticability.StaticAbilityMustTarget;
import forge.game.trigger.Trigger;
import forge.game.trigger.TriggerType;
import forge.game.trigger.WrappedAbility;
import forge.game.zone.ZoneType;
import forge.util.Aggregates;
import forge.util.CardTranslation;
@@ -186,6 +185,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
private CardDamageMap preventMap;
private GameEntityCounterTable counterTable;
private CardZoneTable changeZoneTable;
private Map<Player, Integer> loseLifeMap;
public CardCollection getLastStateBattlefield() {
return lastStateBattlefield;
@@ -1843,14 +1843,14 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
*/
public CardCollectionView findTargetedCards() {
// First search for targeted cards associated with current ability
if (targetChosen.isTargetingAnyCard()) {
return targetChosen.getTargetCards();
if (getTargets().isTargetingAnyCard()) {
return getTargets().getTargetCards();
}
// Next search for source cards of targeted SAs associated with current ability
if (targetChosen.isTargetingAnySpell()) {
if (getTargets().isTargetingAnySpell()) {
CardCollection res = new CardCollection();
for (final SpellAbility ability : targetChosen.getTargetSpells()) {
for (final SpellAbility ability : getTargets().getTargetSpells()) {
res.add(ability.getHostCard());
}
return res;
@@ -1872,16 +1872,13 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
}
public SpellAbility getSATargetingCard() {
return targetChosen.isTargetingAnyCard() ? this : getParentTargetingCard();
return getTargets().isTargetingAnyCard() ? this : getParentTargetingCard();
}
public SpellAbility getParentTargetingCard() {
SpellAbility parent = getParent();
if (parent instanceof WrappedAbility) {
parent = ((WrappedAbility) parent).getWrappedAbility();
}
while (parent != null) {
if (parent.targetChosen.isTargetingAnyCard()) {
if (parent.getTargets().isTargetingAnyCard()) {
return parent;
}
parent = parent.getParent();
@@ -1890,13 +1887,13 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
}
public SpellAbility getSATargetingSA() {
return targetChosen.isTargetingAnySpell() ? this : getParentTargetingSA();
return getTargets().isTargetingAnySpell() ? this : getParentTargetingSA();
}
public SpellAbility getParentTargetingSA() {
SpellAbility parent = getParent();
while (parent != null) {
if (parent.targetChosen.isTargetingAnySpell())
if (parent.getTargets().isTargetingAnySpell())
return parent;
parent = parent.getParent();
}
@@ -1904,7 +1901,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
}
public SpellAbility getSATargetingPlayer() {
return targetChosen.isTargetingAnyPlayer() ? this : getParentTargetingPlayer();
return getTargets().isTargetingAnyPlayer() ? this : getParentTargetingPlayer();
}
public SpellAbility getParentTargetingPlayer() {
@@ -2357,6 +2354,15 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
return null;
}
public Map<Player, Integer> getLoseLifeMap() {
if (loseLifeMap != null) {
return loseLifeMap;
} else if (getParent() != null) {
return getParent().getLoseLifeMap();
}
return null;
}
public void setDamageMap(final CardDamageMap map) {
damageMap = map;
}
@@ -2369,6 +2375,9 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
public void setChangeZoneTable(final CardZoneTable table) {
changeZoneTable = table;
}
public void setLoseLifeMap(final Map<Player, Integer> map) {
loseLifeMap = map;
}
public SpellAbility getOriginalAbility() {
return grantorOriginal;

View File

@@ -0,0 +1,117 @@
/*
* 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 com.google.common.collect.Maps;
import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils;
import forge.game.card.Card;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.util.Expressions;
import java.util.Map;
/**
* <p>
* Trigger_LifeLostAll class.
* </p>
*
* 4/27/2023 - this trigger is written for only Ob Nixilis, Captive Kingpin any future uses will probably need
* additional logic
*
* @author Forge (Northmoc)
* @version $Id$
*/
public class TriggerLifeLostAll extends Trigger {
/**
* <p>
* Constructor for Trigger_LifeLost.
* </p>
*
* @param params
* a {@link java.util.HashMap} object.
* @param host
* a {@link forge.game.card.Card} object.
* @param intrinsic
* the intrinsic
*/
public TriggerLifeLostAll(final Map<String, String> params, final Card host, final boolean intrinsic) {
super(params, host, intrinsic);
}
/** {@inheritDoc}
* @param runParams*/
@Override
public final boolean performTest(final Map<AbilityKey, Object> runParams) {
final Map<Player, Integer> testMap = filteredMap((Map<Player, Integer>) runParams.get(AbilityKey.Map));
if (testMap.isEmpty()) {
return false;
}
return true;
}
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa, Map<AbilityKey, Object> runParams) {
final Map<Player, Integer> map = (Map<Player, Integer>) runParams.get(AbilityKey.Map);
sa.setTriggeringObject(AbilityKey.Map, filteredMap(map));
sa.setTriggeringObject(AbilityKey.Player, map.keySet());
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
final Map<Player, Integer> map = (Map<Player, Integer>) sa.getTriggeringObject(AbilityKey.Map);
int n = 0;
for (final Map.Entry<Player, Integer> e : map.entrySet()) {
sb.append(e.getKey()).append(": ").append(e.getValue());
n++;
if (map.size() > n) {
sb.append(", ");
}
}
return sb.toString();
}
private Map<Player, Integer> filteredMap(Map<Player, Integer> map) {
Map<Player, Integer> passMap = Maps.newHashMap();
if (hasParam("ValidPlayer")) {
for (final Map.Entry<Player, Integer> e : map.entrySet()) {
if (matchesValidParam("ValidPlayer", e.getKey())) {
passMap.put(e.getKey(), e.getValue());
}
}
if (passMap.isEmpty()) {
return passMap;
}
}
if (hasParam("ValidAmountEach")) {
final String comp = getParam("ValidAmountEach");
final int value = AbilityUtils.calculateAmount(getHostCard(), comp.substring(2), this);
for (final Map.Entry<Player, Integer> e : passMap.entrySet()) {
if (!Expressions.compare(e.getValue(), comp.substring(0, 2), value)) {
return Maps.newHashMap();
}
}
}
return passMap;
}
}

View File

@@ -83,6 +83,7 @@ public enum TriggerType {
LandPlayed(TriggerLandPlayed.class),
LifeGained(TriggerLifeGained.class),
LifeLost(TriggerLifeLost.class),
LifeLostAll(TriggerLifeLostAll.class),
LosesGame(TriggerLosesGame.class),
ManaAdded(TriggerManaAdded.class),
MilledAll(TriggerMilledAll.class),

View File

@@ -42,3 +42,18 @@ MageTower
Skep
xy: 110,281
size: 37, 33
MageTowerBlue
xy: 2,327
size: 32, 32
MageTowerRed
xy: 36,328
size: 32, 32
MageTowerBlack
xy: 63,328
size: 32, 32
MageTowerGreen
xy: 92,328
size: 32, 32
MageTowerWhite
xy: 121,328
size: 32, 32

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 KiB

After

Width:  |  Height:  |  Size: 86 KiB

View File

@@ -2068,7 +2068,7 @@
"type": "dungeon",
"count": 3,
"spriteAtlas": "../common/maps/tileset/buildingsbosses.atlas",
"sprite": "MageTower",
"sprite": "MageTowerRed",
"map": "../common/maps/map/magetower/magetower_1.tmx",
"radiusFactor": 0.8,
"questTags": [
@@ -2084,7 +2084,7 @@
"type": "dungeon",
"count": 3,
"spriteAtlas": "../common/maps/tileset/buildingsbosses.atlas",
"sprite": "MageTower",
"sprite": "MageTowerBlack",
"map": "../common/maps/map/magetower/magetower_2.tmx",
"radiusFactor": 0.8,
"questTags": [
@@ -2100,7 +2100,7 @@
"type": "dungeon",
"count": 3,
"spriteAtlas": "../common/maps/tileset/buildingsbosses.atlas",
"sprite": "MageTower",
"sprite": "MageTowerRed",
"map": "../common/maps/map/magetower/magetower_3.tmx",
"radiusFactor": 0.8,
"questTags": [
@@ -2116,7 +2116,7 @@
"type": "dungeon",
"count": 3,
"spriteAtlas": "../common/maps/tileset/buildingsbosses.atlas",
"sprite": "MageTower",
"sprite": "MageTowerWhite",
"map": "../common/maps/map/magetower/magetower_4.tmx",
"radiusFactor": 0.8,
"questTags": [
@@ -2132,7 +2132,7 @@
"type": "dungeon",
"count": 3,
"spriteAtlas": "../common/maps/tileset/buildingsbosses.atlas",
"sprite": "MageTower",
"sprite": "MageTowerGreen",
"map": "../common/maps/map/magetower/magetower_5.tmx",
"radiusFactor": 0.8,
"questTags": [
@@ -2148,7 +2148,7 @@
"type": "dungeon",
"count": 3,
"spriteAtlas": "../common/maps/tileset/buildingsbosses.atlas",
"sprite": "MageTower",
"sprite": "MageTowerBlack",
"map": "../common/maps/map/magetower/magetower_6.tmx",
"radiusFactor": 0.8,
"questTags": [
@@ -2163,8 +2163,8 @@
"name": "MageTowerC8",
"type": "dungeon",
"count": 3,
"spriteAtlas": "../common/maps/tileset/buildingsbosses.atlas",
"sprite": "MageTower",
"spriteAtlas": "../common/maps/tileset/buildings.atlas",
"sprite": "MageTowerBlue",
"map": "../common/maps/map/magetower/magetower_8.tmx",
"radiusFactor": 0.8,
"questTags": [
@@ -2180,7 +2180,7 @@
"type": "dungeon",
"count": 1,
"spriteAtlas": "../common/maps/tileset/buildingsbosses.atlas",
"sprite": "MageTower",
"sprite": "MageTowerBlue",
"map": "../common/maps/map/magetower/magetower_13.tmx",
"radiusFactor": 0.2,
"questTags": [
@@ -2196,7 +2196,7 @@
"type": "dungeon",
"count": 3,
"spriteAtlas": "../common/maps/tileset/buildingsbosses.atlas",
"sprite": "MageTower",
"sprite": "MageTowerBlue",
"map": "../common/maps/map/magetower/magetower_14.tmx",
"radiusFactor": 0.8,
"questTags": [
@@ -2212,7 +2212,7 @@
"type": "dungeon",
"count": 2,
"spriteAtlas": "../common/maps/tileset/buildingsbosses.atlas",
"sprite": "MageTower",
"sprite": "MageTowerBlue",
"map": "../common/maps/map/magetower/magetower_1.tmx",
"radiusFactor": 0.8,
"questTags": [
@@ -2228,7 +2228,7 @@
"type": "dungeon",
"count": 2,
"spriteAtlas": "../common/maps/tileset/buildingsbosses.atlas",
"sprite": "MageTower",
"sprite": "MageTowerBlack",
"map": "../common/maps/map/magetower/magetower_2.tmx",
"radiusFactor": 0.8,
"questTags": [
@@ -2244,7 +2244,7 @@
"type": "dungeon",
"count": 2,
"spriteAtlas": "../common/maps/tileset/buildingsbosses.atlas",
"sprite": "MageTower",
"sprite": "MageTowerRed",
"map": "../common/maps/map/magetower/magetower_3.tmx",
"radiusFactor": 0.8,
"questTags": [
@@ -2260,7 +2260,7 @@
"type": "dungeon",
"count": 2,
"spriteAtlas": "../common/maps/tileset/buildingsbosses.atlas",
"sprite": "MageTower",
"sprite": "MageTowerWhite",
"map": "../common/maps/map/magetower/magetower_4.tmx",
"radiusFactor": 0.8,
"questTags": [
@@ -2276,7 +2276,7 @@
"type": "dungeon",
"count": 2,
"spriteAtlas": "../common/maps/tileset/buildingsbosses.atlas",
"sprite": "MageTower",
"sprite": "MageTowerGreen",
"map": "../common/maps/map/magetower/magetower_5.tmx",
"radiusFactor": 0.8,
"questTags": [
@@ -2292,7 +2292,7 @@
"type": "dungeon",
"count": 2,
"spriteAtlas": "../common/maps/tileset/buildingsbosses.atlas",
"sprite": "MageTower",
"sprite": "MageTowerBlack",
"map": "../common/maps/map/magetower/magetower_6.tmx",
"radiusFactor": 0.8,
"questTags": [
@@ -2308,7 +2308,7 @@
"type": "dungeon",
"count": 2,
"spriteAtlas": "../common/maps/tileset/buildingsbosses.atlas",
"sprite": "MageTower",
"sprite": "MageTowerBlue",
"map": "../common/maps/map/magetower/magetower_8.tmx",
"radiusFactor": 0.8,
"questTags": [
@@ -2324,7 +2324,7 @@
"type": "dungeon",
"count": 2,
"spriteAtlas": "../common/maps/tileset/buildingsbosses.atlas",
"sprite": "MageTower",
"sprite": "MageTowerBlue",
"map": "../common/maps/map/magetower/magetower_14.tmx",
"radiusFactor": 0.8,
"questTags": [

View File

@@ -4,7 +4,6 @@ Types:Creature Zombie Wizard
PT:2/2
K:Unearth:5 B R
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDamage | TriggerDescription$ When CARDNAME enters the battlefield, it deals damage to target player equal to the number of nonbasic lands that player controls.
SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Player | TgtPrompt$ Select target player | NumDmg$ X | RememberTargets$ True | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:X:Count$Valid Land.nonBasic+RememberedPlayerCtrl
SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Player | TgtPrompt$ Select target player | NumDmg$ X
SVar:X:Count$Valid Land.nonBasic+TargetedPlayerCtrl
Oracle:When Anathemancer enters the battlefield, it deals damage to target player equal to the number of nonbasic lands that player controls.\nUnearth {5}{B}{R} ({5}{B}{R}: Return this card from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step or if it would leave the battlefield. Unearth only as a sorcery.)

View File

@@ -5,9 +5,8 @@ PT:2/5
K:Flying
K:Mentor
T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ DBPump | TriggerDescription$ At the beginning of combat on your turn, choose up to one target creature you control. Until end of turn, that creature gets +2/+0, gains trample if it's red, and gains vigilance if it's white.
SVar:DBPump:DB$ Pump | ValidTgts$ Creature.YouCtrl | NumAtt$ 2 | RememberTargets$ True | SubAbility$ DBPump1
SVar:DBPump1:DB$ Pump | Defined$ Remembered | KW$ Trample | ConditionDefined$ Remembered | ConditionPresent$ Card.Red | SubAbility$ DBPump2
SVar:DBPump2:DB$ Pump | Defined$ Remembered | KW$ Vigilance | ConditionDefined$ Remembered | ConditionPresent$ Card.White | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:DBPump:DB$ Pump | ValidTgts$ Creature.YouCtrl | NumAtt$ 2 | SubAbility$ DBPump1
SVar:DBPump1:DB$ Pump | Defined$ Targeted | KW$ Trample | ConditionDefined$ Targeted | ConditionPresent$ Card.Red | SubAbility$ DBPump2
SVar:DBPump2:DB$ Pump | Defined$ Targeted | KW$ Vigilance | ConditionDefined$ Targeted | ConditionPresent$ Card.White
DeckHas:Ability$Counters
Oracle:Flying\nMentor (Whenever this creature attacks, put a +1/+1 counter on target attacking creature with lesser power.)\nAt the beginning of combat on your turn, choose up to one target creature you control. Until end of turn, that creature gets +2/+0, gains trample if it's red, and gains vigilance if it's white.

View File

@@ -1,7 +1,6 @@
Name:Echoing Courage
ManaCost:1 G
Types:Instant
A:SP$ Pump | Cost$ 1 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +2 | SubAbility$ DBPumpAll | RememberTargets$ True | ForgetOtherTargets$ True | SpellDescription$ Target creature and all other creatures with the same name as that creature get +2/+2 until end of turn.
SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Remembered.Creature+Other+sameName | NumAtt$ +2 | NumDef$ +2 | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
A:SP$ Pump | Cost$ 1 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +2 | SubAbility$ DBPumpAll | SpellDescription$ Target creature and all other creatures with the same name as that creature get +2/+2 until end of turn.
SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Targeted.Creature+Other+sameName | NumAtt$ +2 | NumDef$ +2
Oracle:Target creature and all other creatures with the same name as that creature get +2/+2 until end of turn.

View File

@@ -1,8 +1,7 @@
Name:Echoing Decay
ManaCost:1 B
Types:Instant
A:SP$ Pump | Cost$ 1 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | RememberTargets$ True | NumAtt$ -2 | NumDef$ -2 | SubAbility$ DBPumpAll | SpellDescription$ Target creature and all other creatures with the same name as that creature get -2/-2 until end of turn.
SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Remembered.sameName+Other | NumAtt$ -2 | NumDef$ -2 | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
A:SP$ Pump | Cost$ 1 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -2 | NumDef$ -2 | SubAbility$ DBPumpAll | SpellDescription$ Target creature and all other creatures with the same name as that creature get -2/-2 until end of turn.
SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Targeted.sameName+Other | NumAtt$ -2 | NumDef$ -2
AI:RemoveDeck:All
Oracle:Target creature and all other creatures with the same name as that creature get -2/-2 until end of turn.

View File

@@ -2,9 +2,8 @@ Name:Elvish Healer
ManaCost:2 W
Types:Creature Elf Cleric
PT:1/2
A:AB$ PreventDamage | Cost$ T | ValidTgts$ Any | Amount$ X | RememberTargets$ True | SubAbility$ DBCleanup | SpellDescription$ Prevent the next 1 damage that would be dealt to any target this turn. If it's a green creature, prevent the next 2 damage instead.
SVar:X:Remembered$Valid Creature.Green/Plus.1
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
A:AB$ PreventDamage | Cost$ T | ValidTgts$ Any | Amount$ X | SpellDescription$ Prevent the next 1 damage that would be dealt to any target this turn. If it's a green creature, prevent the next 2 damage instead.
SVar:X:Targeted$Valid Creature.Green/Plus.1
AI:RemoveDeck:Random
DeckHints:Color$Green
Oracle:{T}: Prevent the next 1 damage that would be dealt to any target this turn. If it's a green creature, prevent the next 2 damage instead.

View File

@@ -4,6 +4,6 @@ Types:Sorcery
A:SP$ Charm | Cost$ 2 B B | Chooser$ Opponent | Choices$ DrawThree,DestroyAndDraw
SVar:DrawThree:DB$ Draw | NumCards$ 3 | Defined$ You | SpellDescription$ You draw three cards.
SVar:DestroyAndDraw:DB$ Destroy | ValidTgts$ Creature.ChosenCtrl | TgtPrompt$ Select target creature | TargetMin$ 0 | TargetMax$ 2 | NoRegen$ True | SpellDescription$ You destroy up to two target creatures that opponent controls and that player draws up to three cards. Those creatures can't be regenerated. | SubAbility$ ChooserDraws
SVar:ChooserDraws:DB$ Draw | NumCards$ 3 | Defined$ ChosenPlayer
SVar:ChooserDraws:DB$ Draw | NumCards$ 3 | Defined$ ChosenPlayer | UpTo$ True
AI:RemoveDeck:All
Oracle:An opponent chooses one —\n• You draw three cards.\n• You destroy up to two target creatures that player controls. They can't be regenerated. That player draws up to three cards.

View File

@@ -3,6 +3,7 @@ ManaCost:R
Types:Creature Devil
PT:1/1
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerDescription$ When CARDNAME enters the battlefield, it deals 1 damage to target creature and 1 damage to you.
SVar:TrigDealDamage:DB$ DealDamage | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 1 | SubAbility$ DBDamageYou
SVar:DBDamageYou:DB$ DealDamage | Defined$ You | NumDmg$ 1
SVar:TrigDealDamage:DB$ DealDamage | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 1 | DamageMap$ True | SubAbility$ DBDamageYou
SVar:DBDamageYou:DB$ DealDamage | Defined$ You | NumDmg$ 1 | SubAbility$ DBDamageResolve
SVar:DBDamageResolve:DB$ DamageResolve
Oracle:When Forge Devil enters the battlefield, it deals 1 damage to target creature and 1 damage to you.

View File

@@ -4,7 +4,7 @@ Types:Creature Zombie Horror
PT:3/3
K:Flying
S:Mode$ Continuous | Affected$ Zombie.YouCtrl+Other | AddKeyword$ Flying | Description$ Other Zombies you control have flying.
T:Mode$ DamageAll | ValidSource$ Creature.Zombie+YouCtrl | ValidTarget$ Player.Opponent | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigDraw | OptionalDecider$ You | TriggerDescription$ Whenever one or more Zombies you control deal combat damage to one or more of your opponents, you may draw cards equal to the number of opponents dealt damage this way. If you do, discard that many cards.
T:Mode$ DamageAll | ValidSource$ Creature.Zombie+YouCtrl | ValidTarget$ Opponent | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigDraw | OptionalDecider$ You | TriggerDescription$ Whenever one or more Zombies you control deal combat damage to one or more of your opponents, you may draw cards equal to the number of opponents dealt damage this way. If you do, discard that many cards.
SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ X | RememberDrawn$ True | SubAbility$ DBDiscard
SVar:DBDiscard:DB$ Discard | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GEX | Defined$ You | Mode$ TgtChoose | NumCards$ X | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True

View File

@@ -2,8 +2,7 @@ Name:Ill-Gotten Gains
ManaCost:2 B B
Types:Sorcery
A:SP$ Discard | Cost$ 2 B B | Mode$ Hand | Defined$ Player | SubAbility$ DBExile | SpellDescription$ Exile CARDNAME. Each player discards their hand, then returns up to three cards from their graveyard to their hand.
SVar:DBExile:DB$ ChangeZone | Origin$ Stack | Destination$ Exile | SubAbility$ DBChangeZoneChoose
SVar:DBChangeZoneChoose:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBChangeZone
SVar:DBChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | ChangeNum$ 3 | ChangeType$ Card | DefinedPlayer$ Remembered | Hidden$ True
SVar:DBExile:DB$ ChangeZone | Origin$ Stack | Destination$ Exile | SubAbility$ DBChangeZone
SVar:DBChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | ChangeNum$ 3 | ChangeType$ Card | DefinedPlayer$ Player | Hidden$ True
AI:RemoveDeck:All
Oracle:Exile Ill-Gotten Gains. Each player discards their hand, then returns up to three cards from their graveyard to their hand.

View File

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

View File

@@ -3,15 +3,11 @@ ManaCost:3 U R G
Types:Legendary Creature Dragon
PT:6/6
K:Flying
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | OptionalDecider$ You | Execute$ TrigExile | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may pay {2}{U}. If you do, exile the top card of your library face down. You may look at that card for as long as it remains exiled. You may play that card without paying its mana cost for as long as CARDNAME remains on the battlefield.
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | OptionalDecider$ You | Execute$ TrigExile | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may pay {2}{U}. If you do, exile the top card of your library face down. You may look at that card for as long as it remains exiled. You may play that card without paying its mana cost for as long as NICKNAME remains on the battlefield.
SVar:TrigExile:AB$ ChangeZone | Cost$ 2 U | Defined$ TopOfLibrary | Origin$ Library | Destination$ Exile | ExileFaceDown$ True | RememberChanged$ True | SubAbility$ DBEffect
SVar:DBEffect:DB$ Effect | RememberObjects$ Remembered | StaticAbilities$ STMayLookAt | Triggers$ LeavesExile | Duration$ Permanent | SubAbility$ DBEffect2
SVar:DBEffect:DB$ Effect | RememberObjects$ Remembered | StaticAbilities$ STMayLookAt | ForgetOnMoved$ Exile | Duration$ Permanent | SubAbility$ DBEffect2
SVar:STMayLookAt:Mode$ Continuous | EffectZone$ Command | Affected$ Card.IsRemembered | MayLookAt$ You | AffectedZone$ Exile | Description$ You may look at that card for as long as it remains exiled.
SVar:LeavesExile:Mode$ ChangesZone | TriggerZones$ Command | Origin$ Exile | Destination$ Any | ValidCard$ Card.IsRemembered | Static$ True | Execute$ ExileSelf
SVar:ExileSelf:DB$ ChangeZone | Origin$ Command | Destination$ Exile
SVar:DBEffect2:DB$ Effect | Name$ Intet, the Dreamer Effect | StaticAbilities$ STMayPlay | Triggers$ PlayedExiled,ExiledLandPlayed | RememberObjects$ Remembered | Duration$ UntilHostLeavesPlay | SubAbility$ DBCleanup
SVar:DBEffect2:DB$ Effect | Name$ Intet, the Dreamer Effect | StaticAbilities$ STMayPlay | ForgetOnMoved$ Exile | RememberObjects$ Remembered | Duration$ UntilHostLeavesPlay | SubAbility$ DBCleanup
SVar:STMayPlay:Mode$ Continuous | EffectZone$ Command | Affected$ Card.IsRemembered | MayPlay$ True | MayPlayWithoutManaCost$ True | AffectedZone$ Exile | Description$ You may play that card without paying its mana cost for as long as Intet remains on the battlefield.
SVar:PlayedExiled:Mode$ SpellCast | TriggerZones$ Command | ValidCard$ Card.IsRemembered | Static$ True | Execute$ ExileSelf
SVar:ExiledLandPlayed:Mode$ LandPlayed | TriggerZones$ Command | ValidCard$ Card.IsRemembered | Static$ True | Execute$ ExileSelf
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
Oracle:Flying\nWhenever Intet, the Dreamer deals combat damage to a player, you may pay {2}{U}. If you do, exile the top card of your library face down. You may look at that card for as long as it remains exiled. You may play that card without paying its mana cost for as long as Intet remains on the battlefield.

View File

@@ -1,8 +1,7 @@
Name:Intimidation Bolt
ManaCost:1 R W
Types:Instant
A:SP$ DealDamage | Cost$ 1 R W | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 3 | RememberTargets$ True | SubAbility$ DBPumpAll | SpellDescription$ CARDNAME deals 3 damage to target creature. Other creatures can't attack this turn.
SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Remembered.Creature+Other | KW$ HIDDEN CARDNAME can't attack. | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
A:SP$ DealDamage | Cost$ 1 R W | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 3 | SubAbility$ DBPumpAll | SpellDescription$ CARDNAME deals 3 damage to target creature. Other creatures can't attack this turn.
SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Targeted.Creature+Other | KW$ HIDDEN CARDNAME can't attack.
AI:RemoveDeck:All
Oracle:Intimidation Bolt deals 3 damage to target creature. Other creatures can't attack this turn.

View File

@@ -1,8 +1,14 @@
Name:Killing Wave
ManaCost:X B
Types:Sorcery
A:SP$ RepeatEach | Cost$ X B | RepeatCards$ Creature | Zone$ Battlefield | RepeatSubAbility$ DBSacUnless | SpellDescription$ For each creature, its controller sacrifices it unless they pay X life.
SVar:DBSacUnless:DB$ Sacrifice | Defined$ Player | SacValid$ Remembered.Self | UnlessCost$ PayLife<X> | UnlessPayer$ RememberedController | Random$ True | StackDescription$ Sacrifice {c:Remembered}
A:SP$ RepeatEach | Cost$ X B | RepeatPlayers$ Player | RepeatSubAbility$ DBChooseKeep | SubAbility$ DBRepeatPay | SpellDescription$ For each creature, its controller sacrifices it unless they pay X life.
SVar:DBChooseKeep:DB$ ChooseCard | Defined$ Remembered | Choices$ Creature.RememberedPlayerCtrl | MinAmount$ 0 | Amount$ Count$Valid Creature.RememberedPlayerCtrl | RememberChosen$ True
SVar:DBRepeatPay:DB$ RepeatEach | RepeatPlayers$ Player | LoseLifeMap$ True | RepeatSubAbility$ DBPay | SubAbility$ DBSacAll
SVar:DBPay:DB$ Pump | ForgetObjects$ Valid Creature.RememberedPlayerCtrl | UnlessCost$ PayLife<Y> | UnlessPayer$ Remembered
SVar:DBSacAll:DB$ SacrificeAll | ValidCards$ Creature.IsNotRemembered | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:X:Count$xPaid
SVar:Y:SVar$X/Times.Z
SVar:Z:Count$Valid Creature.RememberedPlayerCtrl+IsRemembered
AI:RemoveDeck:All
Oracle:For each creature, its controller sacrifices it unless they pay X life.

View File

@@ -3,7 +3,6 @@ ManaCost:4 R
Types:Creature Viashino Shaman
PT:2/2
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigReveal | TriggerDescription$ When CARDNAME enters the battlefield, target opponent reveals their hand. You may cast an instant or sorcery spell from among those cards without paying its mana cost.
SVar:TrigReveal:DB$ RevealHand | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | RememberTargets$ True | SubAbility$ TrigPlay
SVar:TrigPlay:DB$ Play | Valid$ Card.RememberedPlayerCtrl | ValidSA$ Instant,Sorcery | ValidZone$ Hand | WithoutManaCost$ True | Optional$ True | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:TrigReveal:DB$ RevealHand | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | SubAbility$ TrigPlay
SVar:TrigPlay:DB$ Play | Valid$ Card.TargetedPlayerCtrl | ValidSA$ Instant,Sorcery | ValidZone$ Hand | WithoutManaCost$ True | Optional$ True
Oracle:When Mindclaw Shaman enters the battlefield, target opponent reveals their hand. You may cast an instant or sorcery spell from among those cards without paying its mana cost.

View File

@@ -3,7 +3,7 @@ ManaCost:B
Types:Creature Human Rogue
PT:1/1
T:Mode$ Taps | ValidCard$ Card.Self | Execute$ TrigDrain | TriggerDescription$ Whenever CARDNAME becomes tapped, each opponent loses 1 life and you gain 1 life.
SVar:TrigDrain:DB$ LoseLife | Defined$ Player.Opponent | LifeAmount$ 1 | SubAbility$ DBGainLife
SVar:TrigDrain:DB$ LoseLife | Defined$ Opponent | LifeAmount$ 1 | SubAbility$ DBGainLife
SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1
DeckHas:Ability$LifeGain
Oracle:Whenever Night Market Lookout becomes tapped, each opponent loses 1 life and you gain 1 life.

View File

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

View File

@@ -5,8 +5,7 @@ Loyalty:X
SVar:X:Count$xPaid
A:AB$ Scry | Cost$ AddCounter<2/LOYALTY> | Planeswalker$ True | ScryNum$ 2 | SpellDescription$ Scry 2.
A:AB$ Dig | Cost$ AddCounter<0/LOYALTY> | Planeswalker$ True | DigNum$ 1 | ChangeNum$ 1 | Optional$ True | ChangeValid$ Land,Creature.cmcLEY | ForceRevealToController$ True | PromptToSkipOptionalAbility$ True | AILogic$ AlwaysConfirm | OptionalAbilityPrompt$ Would you like to put the permanent onto the battlefield? | DestinationZone$ Battlefield | LibraryPosition2$ 0 | SpellDescription$ Look at the top card of your library. If it's a land card or a creature card with mana value less than or equal to the number of loyalty counters on Nissa, Steward of Elements, you may put that card onto the battlefield.
A:AB$ Untap | Cost$ SubCounter<6/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidTgts$ Land.YouCtrl | TargetMin$ 0 | TargetMax$ 2 | RememberTargets$ True | SubAbility$ Animate | SpellDescription$ Untap up to two target lands you control. They become 5/5 Elemental creatures with flying and haste until end of turn. They're still lands.
SVar:Animate:DB$ Animate | Defined$ Remembered | Power$ 5 | Toughness$ 5 | Types$ Creature,Elemental | Keywords$ Flying & Haste | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
A:AB$ Untap | Cost$ SubCounter<6/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidTgts$ Land.YouCtrl | TargetMin$ 0 | TargetMax$ 2 | SubAbility$ Animate | SpellDescription$ Untap up to two target lands you control. They become 5/5 Elemental creatures with flying and haste until end of turn. They're still lands.
SVar:Animate:DB$ Animate | Defined$ Targeted | Power$ 5 | Toughness$ 5 | Types$ Creature,Elemental | Keywords$ Flying & Haste
SVar:Y:Count$CardCounters.LOYALTY
Oracle:[+2]: Scry 2.\n[0]: Look at the top card of your library. If it's a land card or a creature card with mana value less than or equal to the number of loyalty counters on Nissa, Steward of Elements, you may put that card onto the battlefield.\n[-6]: Untap up to two target lands you control. They become 5/5 Elemental creatures with flying and haste until end of turn. They're still lands.

View File

@@ -4,7 +4,7 @@ Types:Legendary Creature Elf Scout
PT:2/2
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library for a basic Forest card, reveal it, put it into your hand, then shuffle.
SVar:TrigChange:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Forest.Basic | ChangeNum$ 1 | ShuffleNonMandatory$ True
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | IsPresent$ Land.YouCtrl | PresentCompare$ GE7 | Execute$ TrigExile | TriggerDescription$ Whenever a land enters the battlefield under your control, if you control seven or more lands, exile CARDNAME, then return her to the battlefield transformed under her owner's control.
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | IsPresent$ Land.YouCtrl | PresentCompare$ GE7 | Execute$ TrigExile | TriggerDescription$ Whenever a land enters the battlefield under your control, if you control seven or more lands, exile NICKNAME, then return her to the battlefield transformed under her owner's control.
SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | SubAbility$ DBReturn
SVar:DBReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield | Transformed$ True | ForgetOtherRemembered$ True | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
@@ -20,7 +20,6 @@ Types:Legendary Planeswalker Nissa
Loyalty:3
A:AB$ Dig | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | DigNum$ 1 | Reveal$ True | ChangeNum$ All | ChangeValid$ Land | DestinationZone$ Battlefield | DestinationZone2$ Hand | SpellDescription$ Reveal the top card of your library. If it's a land card, put it onto the battlefield. Otherwise, put it into your hand.
A:AB$ Token | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | TokenAmount$ 1 | TokenScript$ ashaya_the_awoken_world | TokenOwner$ You | SpellDescription$ Create Ashaya, the Awoken World, a legendary 4/4 green Elemental creature token.
A:AB$ Untap | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidTgts$ Land | TgtPrompt$ Choose target land | TargetMin$ 0 | TargetMax$ 6 | RememberTargets$ True | SubAbility$ DBAnimate | SpellDescription$ Untap up to six target lands. They become 6/6 Elemental creatures. They're still lands.
SVar:DBAnimate:DB$ Animate | Defined$ Remembered | Power$ 6 | Toughness$ 6 | Types$ Creature,Elemental | Duration$ Permanent | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
A:AB$ Untap | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidTgts$ Land | TgtPrompt$ Choose target land | TargetMin$ 0 | TargetMax$ 6 | SubAbility$ DBAnimate | SpellDescription$ Untap up to six target lands. They become 6/6 Elemental creatures. They're still lands.
SVar:DBAnimate:DB$ Animate | Defined$ Targeted | Power$ 6 | Toughness$ 6 | Types$ Creature,Elemental | Duration$ Permanent
Oracle:[+1]: Reveal the top card of your library. If it's a land card, put it onto the battlefield. Otherwise, put it into your hand.\n[-2]: Create Ashaya, the Awoken World, a legendary 4/4 green Elemental creature token.\n[-7]: Untap up to six target lands. They become 6/6 Elemental creatures. They're still lands.

View File

@@ -1,6 +1,6 @@
Name:Reverse the Sands
ManaCost:6 W W
Types:Sorcery
A:SP$ SetLife | Cost$ 6 W W | Defined$ Player | Redistribute$ True | SpellDescription$ Redistribute any number of players' life totals. (Each of those players gets one life total back.)
A:SP$ SetLife | PlayerChoices$ Player | ChoiceAmount$ Any | ChoicePrompt$ Choose any number of players | Redistribute$ True | SpellDescription$ Redistribute any number of players' life totals. (Each of those players gets one life total back.)
AI:RemoveDeck:All
Oracle:Redistribute any number of players' life totals. (Each of those players gets one life total back.)

View File

@@ -7,7 +7,7 @@ SVar:DBExile:DB$ Dig | Defined$ ChosenPlayer | DigNum$ 1 | DestinationZone$ Exil
SVar:DBEffect:DB$ Effect | StaticAbilities$ STPlay | Triggers$ TriggerCastDoM | ForgetOnMoved$ Exile | ForgetOnCast$ False | RememberObjects$ Remembered | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearChosenPlayer$ True | ClearRemembered$ True
SVar:STPlay:Mode$ Continuous | MayPlay$ True | MayPlayIgnoreColor$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ Until end of turn, you may play that card and you may spend mana as though it were mana of any color to cast it.
SVar:TriggerCastDoM:Mode$ SpellCast | ValidCard$ Card.IsRemembered | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigLoseLife | OneOff$ True | Secondary$ True | TriggerDescription$ When you cast a spell this way, its owner loses life equal to its mana value.
SVar:TriggerCastDoM:Mode$ SpellCast | ValidCard$ Card.IsRemembered | ValidSA$ Spell.MayPlaySource | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigLoseLife | OneOff$ True | Secondary$ True | TriggerDescription$ When you cast a spell this way, its owner loses life equal to its mana value.
SVar:TrigLoseLife:DB$ LoseLife | Defined$ TriggeredCardOwner | LifeAmount$ X
SVar:X:TriggeredStackInstance$CardManaCostLKI
Oracle:At the beginning of your upkeep, choose an opponent at random. Exile the top card of that player's library. Until end of turn, you may play that card and you may spend mana as though it were mana of any color to cast it. When you cast a spell this way, its owner loses life equal to its mana value.

View File

@@ -2,12 +2,8 @@ Name:Theater of Horrors
ManaCost:1 B R
Types:Enchantment
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigExile | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, exile the top card of your library.
SVar:TrigExile:DB$ Dig | Defined$ You | DestinationZone$ Exile | DigNum$ 1 | ChangeNum$ All | RememberChanged$ True
S:Mode$ Continuous | Affected$ Card.IsRemembered | AffectedZone$ Exile | MayPlay$ True | Condition$ PlayerTurn | CheckSVar$ X | Description$ During your turn, if an opponent lost life this turn, you may play lands and cast spells from among cards exiled with CARDNAME.
SVar:TrigExile:DB$ Dig | Defined$ You | DestinationZone$ Exile | DigNum$ 1 | ChangeNum$ All
S:Mode$ Continuous | Affected$ Card.ExiledWithSource | AffectedZone$ Exile | MayPlay$ True | Condition$ PlayerTurn | CheckSVar$ X | Description$ During your turn, if an opponent lost life this turn, you may play lands and cast spells from among cards exiled with CARDNAME.
SVar:X:Count$LifeOppsLostThisTurn
T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered | Execute$ DBForget
SVar:DBForget:DB$ Pump | ForgetObjects$ TriggeredCard
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
A:AB$ DealDamage | Cost$ 3 R | ValidTgts$ Opponent,Planeswalker | TgtPrompt$ Select target opponent or planeswalker | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target opponent or planeswalker.
Oracle:At the beginning of your upkeep, exile the top card of your library.\nDuring your turn, if an opponent lost life this turn, you may play lands and cast spells from among cards exiled with Theater of Horrors.\n{3}{R}: Theater of Horrors deals 1 damage to target opponent or planeswalker.

View File

@@ -3,5 +3,5 @@ ManaCost:3 B
Types:Creature Plant
PT:0/13
K:Defender
A:AB$ ExchangeLifeVariant | Cost$ T | ConditionPresent$ Creature.StrictlySelf | ValidTgts$ Opponent | Mode$ Toughness | SpellDescription$ Exchange target opponent's life total with CARDNAME's toughness. | StackDescription$ SpellDescription
A:AB$ ExchangeLifeVariant | Cost$ T | ConditionPresent$ Creature.StrictlySelf | ValidTgts$ Opponent | Mode$ Toughness | SpellDescription$ Exchange target opponent's life total with CARDNAME's toughness. | StackDescription$ REP target opponent_{p:Targeted}
Oracle:Defender\n{T}: Exchange target opponent's life total with Tree of Perdition's toughness.

View File

@@ -5,10 +5,10 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S
SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | NumDmg$ 2 | SubAbility$ ChompEquip
SVar:ChompEquip:DB$ DestroyAll | ValidCards$ Targeted.Equipment+Attached
A:AB$ Dig | Cost$ 2 R | DigNum$ 1 | DestinationZone$ Exile | RememberChanged$ True | SubAbility$ DBEffect | SpellDescription$ Exile the top card of your library. You may play that card this turn. When you play a card this way, CARDNAME deals 2 damage to each player.
SVar:DBEffect:DB$ Effect | StaticAbilities$ STPlay | Triggers$ TriggerCastDoM,TriggerLandPlayed | ForgetOnMoved$ Exile | ForgetOnCast$ False | RememberObjects$ Remembered | SubAbility$ DBCleanup
SVar:DBEffect:DB$ Effect | StaticAbilities$ STPlay | Triggers$ TriggerCastDoM,TriggerLandPlayed | RememberObjects$ Remembered | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:STPlay:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ You may play that card this turn. When you play a card this way, CARDNAME deals 2 damage to each player.
SVar:TriggerCastDoM:Mode$ SpellCast | ValidCard$ Card.IsRemembered | OneOff$ True | ValidActivatingPlayer$ You | Execute$ TrigDealDamage | TriggerDescription$ When you play a card this way, CARDNAME deals 2 damage to each player.
SVar:TriggerCastDoM:Mode$ SpellCast | ValidCard$ Card.IsRemembered | ValidSA$ Spell.MayPlaySource | OneOff$ True | ValidActivatingPlayer$ You | Execute$ TrigDealDamage | TriggerDescription$ When you play a card this way, CARDNAME deals 2 damage to each player.
SVar:TriggerLandPlayed:Mode$ LandPlayed | ValidCard$ Land.IsRemembered | OneOff$ True | Execute$ TrigDealDamage | Secondary$ True | TriggerDescription$ When you play a card this way, CARDNAME deals 2 damage to each player.
SVar:TrigDealDamage:DB$ DealDamage | Defined$ Player | NumDmg$ 2
Oracle:When Fires of Mount Doom enters the battlefield, it deals 2 damage to target creature an opponent controls. Destroy all Equipment attached to that creature.\n{2}{R}: Exile the top card of your library. You may play that card this turn. When you play a card this way, Fires of Mount Doom deals 2 damage to each player.

View File

@@ -0,0 +1,14 @@
Name:Ob Nixilis, Captive Kingpin
ManaCost:2 B R
Types:Legendary Creature Demon
PT:4/3
KFlying
K:Trample
T:Mode$ LifeLostAll | ValidPlayer$ Opponent | ValidAmountEach$ EQ1 | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever one or more opponents each lose exactly 1 life, put a +1/+1 counter on CARDNAME. Exile the top card of your library. Until your next end step, you may play that card.
SVar:TrigPutCounter:DB$ PutCounter | CounterType$ P1P1 | SubAbility$ DBExileTop
SVar:DBExileTop:DB$ Dig | DigNum$ 1 | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | SubAbility$ DBEffect
SVar:DBEffect:DB$ Effect | StaticAbilities$ STPlay | RememberObjects$ Remembered | Duration$ UntilYourNextEndStep | SubAbility$ DBCleanup | ForgetOnMoved$ Exile
SVar:STPlay:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ Until your next end step, you may play that card.
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
DeckHas:Ability$Counters
Oracle:Flying, trample\nWhenever one or more opponents each lose exactly 1 life, put a +1/+1 counter on Ob Nixilis, Captive Kingpin. Exile the top card of your library. Until your next end step, you may play that card.

View File

@@ -4,10 +4,9 @@ Types:Enchantment Saga
K:Saga:3:DBDestroy,DBChangeZone,DBPump
SVar:DBDestroy:DB$ Destroy | ValidTgts$ Land | TgtPrompt$ Choose target land. | SpellDescription$ Destroy target land.
SVar:DBChangeZone:DB$ ChangeZone | ValidTgts$ Land | TgtPrompt$ Choose target land card. | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | SpellDescription$ Put target land card from a graveyard onto the battlefield under your control.
SVar:DBPump:DB$ Pump | ValidTgts$ Player.Opponent | RememberTargets$ True | IsCurse$ True | TgtPrompt$ Choose target player. | SubAbility$ DBToken | SpellDescription$ Choose target player. If they control fewer lands than you, create a number of 4/4 green Troll Warrior creature tokens with trample equal to the difference.
SVar:DBToken:DB$ Token | TokenAmount$ X | TokenScript$ g_4_4_troll_warrior_trample | TokenOwner$ You | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:DBPump:DB$ Pump | ValidTgts$ Opponent | IsCurse$ True | SubAbility$ DBToken | SpellDescription$ Choose target player. If they control fewer lands than you, create a number of 4/4 green Troll Warrior creature tokens with trample equal to the difference.
SVar:DBToken:DB$ Token | TokenAmount$ X | TokenScript$ g_4_4_troll_warrior_trample | TokenOwner$ You
SVar:X:Count$Valid Land.YouCtrl/Minus.Y
SVar:Y:Count$Valid Land.RememberedPlayerCtrl
SVar:Y:Count$Valid Land.TargetedPlayerCtrl
DeckHas:Ability$Token
Oracle:(As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)\nI — Destroy target land.\nII — Put target land card from a graveyard onto the battlefield under your control.\nIII — Choose target opponent. If they control fewer lands than you, create a number of 4/4 green Troll Warrior creature tokens with trample equal to the difference.

View File

@@ -1,10 +1,9 @@
Name:Winnow
ManaCost:1 W
Types:Instant
A:SP$ Destroy | Cost$ 1 W | ValidTgts$ Permanent.nonLand | RememberTargets$ True | ConditionCheckSVar$ WinnowCheck | ConditionSVarCompare$ GE2 | SubAbility$ DBDraw | SpellDescription$ Destroy target nonland permanent if another permanent with the same name is on the battlefield. Draw a card.
SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:WinnowCheck:Count$Valid Permanent.sharesNameWith Remembered
A:SP$ Destroy | Cost$ 1 W | ValidTgts$ Permanent.nonLand | ConditionCheckSVar$ WinnowCheck | ConditionSVarCompare$ GE2 | SubAbility$ DBDraw | SpellDescription$ Destroy target nonland permanent if another permanent with the same name is on the battlefield. Draw a card.
SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1
SVar:WinnowCheck:Count$Valid Permanent.sharesNameWith Targeted
AI:RemoveDeck:All
AI:RemoveDeck:Random
Oracle:Destroy target nonland permanent if another permanent with the same name is on the battlefield.\nDraw a card.

View File

@@ -5,7 +5,7 @@ PT:3/3
K:Flying
K:Haste
T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigEggCounter | TriggerDescription$ Whenever CARDNAME attacks, put an egg counter on another target creature without an egg counter on it. When that creature dies, if it has an egg counter on it, draw a card and create a 1/1 black Insect creature token with flying.
SVar:TrigEggCounter:DB$ PutCounter | CounterType$ EGG | CounterNum$ 1 | ValidTgts$ Creature.Other+counters_EQ0_EGG | RememberTargets$ True | TgtPrompt$ Put an egg counter on another target creature without an egg counter on it. | SubAbility$ DelayedTrigger
SVar:TrigEggCounter:DB$ PutCounter | CounterType$ EGG | CounterNum$ 1 | ValidTgts$ Creature.Other+counters_EQ0_EGG | TgtPrompt$ Put an egg counter on another target creature without an egg counter on it. | SubAbility$ DelayedTrigger
SVar:DelayedTrigger:DB$ DelayedTrigger | Mode$ ChangesZone | RememberObjects$ Targeted | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.IsTriggerRemembered+counters_GE1_EGG | Execute$ TrigDraw | TriggerDescription$ When this creature dies, if it has an egg counter on it, draw a card and create a 1/1 black Insect creature token with flying.
SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 | SubAbility$ DBToken
SVar:DBToken:DB$ Token | TokenScript$ b_1_1_insect_flying

View File

@@ -9,100 +9,191 @@ ScryfallCode=CMM
1 S The Prismatic Piper @Seb McKinnon
2 M Kozilek, the Great Distortion @Aleksi Briclot
3 M Morophon, the Boundless @Victor Adame Minguez
5 M Ulamog, the Ceaseless Hunger @Michael Komarck
6 C Ulamog's Crusher @Todd Lockwood
10 R Alms Collector @Bram Sels
11 R Anafenza, Kin-Tree Spirit @Ryan Yee
11 U Anafenza, Kin-Tree Spirit @Ryan Yee
13 R Angelic Field Marshal @Scott Murphy
14 M Avacyn, Angel of Hope @Jason Chan
16 R Balan, Wandering Knight @Svetlin Velinov
17 U Battle Screech @Anastasia Ovchinnikova
17 C Battle Screech @Anastasia Ovchinnikova
18 U Cartographer's Hawk @Donato Giancola
21 U Darksteel Mutation @Daniel Ljunggren
22 U Elite Scaleguard @Steve Prescott
24 R Flawless Maneuver @Zoltan Boros
27 R Grand Abolisher @Eric Deschamps
28 R Heavenly Blademaster @Zack Stella
29 M Heliod, Sun-Crowned @Lius Lasahido
32 R Jazal Goldmane @Aaron Miller
34 U Kemba, Kha Regent @Ernanda Souza
35 U Kirtar's Wrath @Kev Walker
37 M Land Tax @Chuck Lukacs
39 M Loyal Retainers @Kieran Yanner
42 R Mangara, the Diplomat @Howard Lyon
45 R Nahiri, the Lithomancer @Eric Deschamps
50 U Pianna, Nomad Captain @D. Alexander Gregory
51 R Puresteel Paladin @Jason Chan
53 R Righteous Confluence @Kieran Yanner
54 R Sephara, Sky's Blade @Livia Prima
55 R Sevinne's Reclamation @Zoltan Boros
56 C Shelter @Alayna Danner
57 M Smothering Tithe @Mark Behm
59 R Steelshaper's Gift @Greg Hildebrandt
60 R Sublime Exhalation @Lake Hurwitz
68 R Wakening Sun's Avatar @Tyler Jacobson
71 R Zetalpa, Primal Dawn @Chris Rallis
73 R Aminatou's Augury @Seb McKinnon
74 R Azami, Lady of Scrolls @Ittoku
75 R Braids, Conjurer Adept @Zoltan Boros & Gabor Szikszai
79 R Capture of Jingzhou @Jack Wei
76 R Braids, Conjurer Adept @Zoltan Boros & Gabor Szikszai
77 M Bribery @Kai Carpenter
79 M Capture of Jingzhou @Jack Wei
80 R Commandeer @John Matson
84 R Cyclonic Rift @Chris Rahn
85 R Day's Undoing @Jonas De Ro
89 R Evacuation @Franz Vohwinkel
92 R Faerie Artisans @Tony Foti
94 R Fierce Guardianship @Randy Vargas
103 R Lorthos, the Tidemaker @Kekai Kotaki
105 R Minds Aglow @Yeong-Hao Han
108 R Mystic Confluence @Kieran Yanner
110 R Personal Tutor @Julie Dillon
113 U Reality Shift @Howard Lyon
118 R Sai, Master Thopterist @Adam Paquette
120 M Spellseeker @Igor Kieryluk
122 R Stormsurge Kraken @Svetlin Velinov
123 M Sun Quan, Lord of Wu @Xu Xiaoming
125 R Teferi, Temporal Archmage @Tyler Jacobson
128 R Torrential Gearhulk @Svetlin Velinov
130 M Urza, Lord High Artificer @Grzegorz Rutkowski
134 C Windrider Wizard @Slawomir Maniak
137 M Archfiend of Despair @Josh Hass
139 R Bloodchief Ascension @Adi Granov
144 R Chainer, Dementia Master @Mark Zug
146 R Curtains' Call @James Ryman
147 R Deadly Rollick @Izzy
148 R Decree of Pain @Carl Critchlow
150 M Demonic Tutor @Zack Stella
151 R Demonlord Belzenlok @Tyler Jacobson
155 R Endrek Sahr, Master Breeder @Lucas Graciano
156 U Exsanguinate @Marie Magny
157 U Extinguish All Hope @Aaron J. Riley
161 R Ghoulcaller Gisa @Karla Ortiz
165 M Grave Pact @Billy Christian
167 R Imp's Mischief @Thomas M. Baxa
169 R Kindred Dominance @Bram Sels
176 M Ob Nixilis of the Black Oath @Daarken
173 M Mikaeus, the Unhallowed @Chris Rahn
176 R Ob Nixilis of the Black Oath @Daarken
177 R Ogre Slumlord @Trevor Claxton
180 R Rankle, Master of Pranks @Dmitry Burmak
181 M Razaketh, the Foulblooded @Chris Rallis
184 R Rune-Scarred Demon @Michael Komarck
187 R Sower of Discord @Wisnu Tan
191 R Toxic Deluge @Svetlin Velinov
193 M Twilight Prophet @Seb McKinnon
196 R Vindictive Lich @Toma Feizo Gas
197 R Wake the Dead @Christopher Moeller
200 R Wretched Confluence @Kieran Yanner
202 U Yargle, Glutton of Urborg @Jehan Choo
205 R Ashling the Pilgrim @Wayne Reynolds
206 R Avatar of Slaughter @Jason A. Engle
207 M Balefire Dragon @Eric Deschamps
208 C Blood Aspirant @Tyler Walpole
213 R Daretti, Scrap Savant @Dan Scott
214 R Deflecting Swat @Izzy
218 R Drakuseth, Maw of Flames @Grzegorz Rutkowski
222 R Fiery Confluence @Kieran Yanner
227 R Godo, Bandit Warlord @Paolo Parente
228 R Grenzo, Havoc Raiser @Svetlin Velinov
231 R Heartless Hidetsugu @Carl Critchlow
232 R Hellkite Charger @Jaime Jones
236 M Insurrection @Mark Zug
238 R Krenko, Mob Boss @Karl Kopinski
241 R Magus of the Wheel @Carl Frank
244 M Neheb, the Eternal @Chris Rahn
245 R Nesting Dragon @Jehan Choo
259 M Star of Extinction @Chris Rahn
246 M Purphoros, God of the Forge @Eric Deschamps
247 U Rakka Mar @Jason Chan
252 M Savage Beating @Matt Thompson
253 R Scourge of the Throne @Michael Komarck
259 R Star of Extinction @Chris Rahn
260 U Storm-Kiln Artist @Manuel Castañón
263 R Tempt with Vengeance @Ryan Barger
265 R Treasure Nabber @Alex Konstad
267 U Vandalblast @Seb McKinnon
272 R Arachnogenesis @Johannes Voss
274 R Azusa, Lost but Seeking @Winona Nelson
276 R Bloodspore Thrinax @Ralph Horsley
280 M Craterhoof Behemoth @Chris Rahn
283 M Doubling Season @Chuck Lukacs
289 M Finale of Devastation @Bayard Wu
290 R Freyalise, Llanowar's Fury @Adam Paquette
292 R Ghalta, Primal Hunger @Chase Stone
294 M The Great Henge @Adam Paquette
295 R Heroic Intervention @James Ryman
297 C Ilysian Caryatid @Winona Nelson
299 R Jolrael, Mwonvuli Recluse @Izzy
300 C Kodama's Reach @John Avon
303 R Lifeblood Hydra @Alex Horley-Orlandelli
308 R Obscuring Haze @Campbell White
309 R Ohran Frostfang @Torstein Nordstrand
310 M Omnath, Locus of Mana @Mike Bierek
316 R Regal Behemoth @Jakub Kasper
317 R Rishkar, Peema Renegade @Todd Lockwood
317 U Rishkar, Peema Renegade @Todd Lockwood
319 R Sakiko, Mother of Summer @Livia Prima
320 M Selvala, Heart of the Wilds @Tyler Jacobson
321 C Skyshroud Claim @Anna Steinbauer
324 R Song of the Dryads @Lars Grant-West
325 R Stonehoof Chieftain @Camille Alquier
327 R Tooth and Nail @Greg Hildebrandt
329 R Verdant Confluence @Kieran Yanner
331 R Wayward Swordtooth @Chris Rahn
334 R Yisan, the Wanderer Bard @Chase Stone
337 R Experiment Kraj @Mark Tedin
338 R Gisela, Blade of Goldnight @Jason Chan
339 U Hamza, Guardian of Arashin @Wisnu Tan
340 R Hanna, Ship's Navigator @Chris Rallis
342 R Karador, Ghost Chieftain @Todd Lockwood
343 R Kykar, Wind's Fury @G-host Lee
344 R Maelstrom Wanderer @Victor Adame Minguez
348 M Mizzix of the Izmagnus @Cliff Childs
347 R Mirri, Weatherlight Duelist @Magali Villeneuve
348 R Mizzix of the Izmagnus @Cliff Childs
349 R Nekusar, the Mindrazer @Mark Winters
350 R Queen Marchesa @Kieran Yanner
353 M The Scarab God @Lius Lasahido
354 R Sek'Kuar, Deathkeeper @Jesper Ejsing
355 R Sidisi, Brood Tyrant @Karl Kopinski
361 M The Ur-Dragon @Jaime Jones
367 C Arcane Signet @Dan Scott
362 R Xantcha, Sleeper Agent @Mark Winters
363 R Yennett, Cryptic Sovereign @Chris Rahn
364 R Yuriko, the Tiger's Shadow @Yongjae Choi
365 R Zacama, Primal Calamity @Jaime Jones
366 R Zilortha, Strength Incarnate @Chase Stone
367 U Arcane Signet @Dan Scott
368 U Ashnod's Altar @Greg Staples
371 R Boompile @Filip Burburan
372 C Brass Knuckles @Yeong-Hao Han
375 R Champion's Helm @Alan Pollack
376 R Chromatic Lantern @Jung Park
379 R Emerald Medallion @Daniel Ljunggren
381 M Extraplanar Lens @Lars Grant-West
382 U Fellwar Stone @John Avon
387 R Gilded Lotus @Volkan Baǵa
388 R Hammer of Nazahn @Victor Adame Minguez
392 R Idol of Oblivion @Piotr Dura
393 M The Immortal Sun @Kieran Yanner
394 R Inspiring Statuary @Kirsten Zirngibl
395 R Jet Medallion @Daniel Ljunggren
396 M Jeweled Lotus @Alayna Danner
401 R Pearl Medallion @Daniel Ljunggren
405 R Ruby Medallion @Daniel Ljunggren
407 R Sapphire Medallion @Daniel Ljunggren
408 R Scytheclaw @James Paick
410 U Sol Ring @Mike Bierek
413 R Sword of the Animist @Daniel Ljunggren
415 U Thran Dynamo @Ron Spears
420 C Command Tower @Ryan Yee
423 C Path of Ancestry @Alayna Danner
425 U Reliquary Tower @Jesper Ejsing
426 U Rogue's Passage @Christine Choi
429 C Thriving Bluff @Johannes Voss
430 C Thriving Grove @Ravenna Tran
@@ -125,99 +216,207 @@ ScryfallCode=CMM
450 L Forest @Rebecca Guay
451 L Forest @Mark Poole
452 M Kozilek, the Great Distortion @Aleksi Briclot
453 M Morophon, the Boundless @Victor Adame Minguez
454 M Ulamog, the Ceaseless Hunger @Michael Komarck
455 R Alms Collector @Bram Sels
456 R Angelic Field Marshal @Scott Murphy
457 M Avacyn, Angel of Hope @Jason Chan
458 R Balan, Wandering Knight @Svetlin Velinov
459 R Flawless Maneuver @Zoltan Boros
460 R Grand Abolisher @Eric Deschamps
461 R Heavenly Blademaster @Zack Stella
462 M Heliod, Sun-Crowned @Lius Lasahido
463 R Jazal Goldmane @Aaron Miller
464 M Land Tax @Chuck Lukacs
465 M Loyal Retainers @Kieran Yanner
466 R Mangara, the Diplomat @Howard Lyon
467 R Nahiri, the Lithomancer @Eric Deschamps
468 R Odric, Master Tactician @Michael Komarck
469 R Puresteel Paladin @Jason Chan
470 R Righteous Confluence @Kieran Yanner
471 R Sephara, Sky's Blade @Livia Prima
472 R Sevinne's Reclamation @Zoltan Boros
473 M Smothering Tithe @Mark Behm
475 R Sublime Exhalation @Lake Hurwitz
476 R Wakening Sun's Avatar @Tyler Jacobson
478 R Zetalpa, Primal Dawn @Chris Rallis
479 R Aminatou's Augury @Seb McKinnon
480 R Azami, Lady of Scrolls @Ittoku
481 R Braids, Conjurer Adept @Zoltan Boros & Gabor Szikszai
483 R Capture of Jingzhou @Jack Wei
482 M Bribery @Kai Carpenter
483 M Capture of Jingzhou @Jack Wei
484 R Commandeer @John Matson
485 R Cyclonic Rift @Chris Rahn
487 R Evacuation @Franz Vohwinkel
488 R Faerie Artisans @Tony Foti
490 R Lorthos, the Tidemaker @Kekai Kotaki
491 R Minds Aglow @Yeong-Hao Han
492 R Mystic Confluence @Kieran Yanner
493 R Personal Tutor @Julie Dillon
494 R Sai, Master Thopterist @Adam Paquette
495 M Spellseeker @Igor Kieryluk
497 R Stormsurge Kraken @Svetlin Velinov
498 M Sun Quan, Lord of Wu @Xu Xiaoming
500 R Teferi, Temporal Archmage @Tyler Jacobson
501 R Torrential Gearhulk @Svetlin Velinov
502 M Urza, Lord High Artificer @Grzegorz Rutkowski
503 M Archfiend of Despair @Josh Hass
504 R Bloodchief Ascension @Adi Granov
505 R Chainer, Dementia Master @Mark Zug
506 R Curtains' Call @James Ryman
507 R Deadly Rollick @Izzy
517 M Ob Nixilis of the Black Oath @Daarken
509 M Demonic Tutor @Zack Stella
510 R Demonlord Belzenlok @Tyler Jacobson
511 R Endrek Sahr, Master Breeder @Lucas Graciano
512 R Ghoulcaller Gisa @Karla Ortiz
513 M Grave Pact @Billy Christian
514 R Imp's Mischief @Thomas M. Baxa
515 R Kindred Dominance @Bram Sels
516 M Mikaeus, the Unhallowed @Chris Rahn
517 R Ob Nixilis of the Black Oath @Daarken
518 R Ogre Slumlord @Trevor Claxton
519 R Rankle, Master of Pranks @Dmitry Burmak
520 M Razaketh, the Foulblooded @Chris Rallis
522 R Sower of Discord @Wisnu Tan
523 R Toxic Deluge @Svetlin Velinov
524 M Twilight Prophet @Seb McKinnon
525 R Vindictive Lich @Toma Feizo Gas
526 R Wake the Dead @Christopher Moeller
527 R Wretched Confluence @Kieran Yanner
528 R Ashling the Pilgrim @Wayne Reynolds
529 R Avatar of Slaughter @Jason A. Engle
530 M Balefire Dragon @Eric Deschamps
531 R Daretti, Scrap Savant @Dan Scott
532 R Deflecting Swat @Izzy
534 R Divergent Transformations @Kev Walker
535 R Drakuseth, Maw of Flames @Grzegorz Rutkowski
536 R Fiery Confluence @Kieran Yanner
537 R Godo, Bandit Warlord @Paolo Parente
538 R Grenzo, Havoc Raiser @Svetlin Velinov
539 R Heartless Hidetsugu @Carl Critchlow
540 R Hellkite Charger @Jaime Jones
541 R Inferno Titan @Kev Walker
542 M Insurrection @Mark Zug
543 R Krenko, Mob Boss @Karl Kopinski
544 R Magus of the Wheel @Carl Frank
545 M Neheb, the Eternal @Chris Rahn
546 R Nesting Dragon @Jehan Choo
548 R Savage Beating @Matt Thompson
550 M Star of Extinction @Chris Rahn
547 M Purphoros, God of the Forge @Eric Deschamps
548 M Savage Beating @Matt Thompson
549 R Scourge of the Throne @Michael Komarck
550 R Star of Extinction @Chris Rahn
551 R Tempt with Vengeance @Ryan Barger
552 R Treasure Nabber @Alex Konstad
554 R Azusa, Lost but Seeking @Winona Nelson
555 R Bloodspore Thrinax @Ralph Horsley
556 M Craterhoof Behemoth @Chris Rahn
557 M Doubling Season @Chuck Lukacs
558 R Ezuri's Predation @Uriah Voth
559 M Finale of Devastation @Bayard Wu
560 R Freyalise, Llanowar's Fury @Adam Paquette
561 R Ghalta, Primal Hunger @Chase Stone
562 M The Great Henge @Adam Paquette
563 R Heroic Intervention @James Ryman
564 R Jolrael, Mwonvuli Recluse @Izzy
565 R Lifeblood Hydra @Alex Horley-Orlandelli
566 R Obscuring Haze @Campbell White
567 R Ohran Frostfang @Torstein Nordstrand
568 M Omnath, Locus of Mana @Mike Bierek
569 R Regal Behemoth @Jakub Kasper
571 M Selvala, Heart of the Wilds @Tyler Jacobson
572 R Song of the Dryads @Lars Grant-West
573 R Stonehoof Chieftain @Camille Alquier
574 R Tooth and Nail @Greg Hildebrandt
575 R Verdant Confluence @Kieran Yanner
576 R Wayward Swordtooth @Chris Rahn
577 R Yisan, the Wanderer Bard @Chase Stone
578 R Experiment Kraj @Mark Tedin
579 R Gisela, Blade of Goldnight @Jason Chan
580 R Hanna, Ship's Navigator @Chris Rallis
581 R Karador, Ghost Chieftain @Todd Lockwood
582 R Kykar, Wind's Fury @G-host Lee
583 R Maelstrom Wanderer @Victor Adame Minguez
586 M Mizzix of the Izmagnus @Cliff Childs
587 M Nekusar, the Mindrazer @Mark Winters
584 R Meren of Clan Nel Toth @Mark Winters
585 R Mirri, Weatherlight Duelist @Magali Villeneuve
586 R Mizzix of the Izmagnus @Cliff Childs
587 R Nekusar, the Mindrazer @Mark Winters
588 R Queen Marchesa @Kieran Yanner
589 R Rafiq of the Many @Michael Komarck
590 M The Scarab God @Lius Lasahido
591 R Sek'Kuar, Deathkeeper @Jesper Ejsing
592 R Sidisi, Brood Tyrant @Karl Kopinski
593 R Teysa Karlov @Magali Villeneuve
594 M The Ur-Dragon @Jaime Jones
595 R Xantcha, Sleeper Agent @Mark Winters
599 R Zilortha, Strength Incarnate @Chase Stone
600 R Boompile @Filip Burburan
601 R Champion's Helm @Alan Pollack
602 R Chromatic Lantern @Jung Park
603 R Emerald Medallion @Daniel Ljunggren
604 M Extraplanar Lens @Lars Grant-West
606 R Hammer of Nazahn @Victor Adame Minguez
607 R Idol of Oblivion @Piotr Dura
608 M The Immortal Sun @Kieran Yanner
609 R Inspiring Statuary @Kirsten Zirngibl
610 R Jet Medallion @Daniel Ljunggren
611 M Jeweled Lotus @Alayna Danner
612 R Pearl Medallion @Daniel Ljunggren
613 R Ruby Medallion @Daniel Ljunggren
614 R Sapphire Medallion @Daniel Ljunggren
625 R Grand Abolisher @
616 R Sword of the Animist @Daniel Ljunggren
623 U Darksteel Mutation @Richard Kane Ferguson
625 R Grand Abolisher @Richard Kane Ferguson
627 R Puresteel Paladin @Richard Kane Ferguson
629 R Steelshaper's Gift @Paolo Parente
633 R Personal Tutor @Jeff Miracola
635 M Spellseeker @
634 U Reality Shift @Warren Mahy
635 M Spellseeker @Douglas Shuler
636 R Bloodchief Ascension @Warren Mahy
639 M Grave Pact @Kev Walker
640 R Kindred Dominance @Thomas M. Baxa
643 R Magus of the Wheel @Scott M. Fischer
644 U Storm-Kiln Artist @Chuck Lukacs
645 R Treasure Nabber @Pete Venters
646 U Vandalblast @
651 R Regal Behemoth @
646 U Vandalblast @Dermot Power
649 C Kodama's Reach @Ron Spencer
650 R Ohran Frostfang @Ron Spears
651 R Regal Behemoth @Kev Walker
652 R Tooth and Nail @Eric Velhagen
653 U Arcane Signet @Drew Tucker
654 R Champion's Helm @Paolo Parente
656 R Extraplanar Lens @Ron Spears
656 M Extraplanar Lens @Ron Spears
657 U Fellwar Stone @Randy Gallegos
658 U Thran Dynamo @
661 C Path of Ancestry @
658 U Thran Dynamo @Chuck Lukacs
659 C Command Tower @Donato Giancola
661 C Path of Ancestry @Mark Poole
663 U Reliquary Tower @Mark Poole
668 M Kozilek, the Great Distortion @Grant Griffin
669 M Morophon, the Boundless @Jack Hughes
670 M Ulamog, the Ceaseless Hunger @Cosmin Podar
671 U Kemba, Kha Regent @Peter Diamond
672 R Azami, Lady of Scrolls @Grant Griffin
673 R Talrand, Sky Summoner @Tyler Walpole
674 M Urza, Lord High Artificer @Grant Griffin
675 M Mikaeus, the Unhallowed @Benjamin Ee
677 R Grenzo, Havoc Raiser @Tyler Walpole
678 M Neheb, the Eternal @Alex Stone
679 R Azusa, Lost but Seeking @Benjamin Ee
680 M Omnath, Locus of Mana @
680 M Omnath, Locus of Mana @Alex Dos Diaz
681 M Selvala, Heart of the Wilds @Jack Hughes
682 R Gisela, Blade of Goldnight @Alex Dos Diaz
683 R Kykar, Wind's Fury @April Prime
684 R Maelstrom Wanderer @
684 R Maelstrom Wanderer @Benjamin Ee
685 R Meren of Clan Nel Toth @Vance Kelly
688 R Teysa Karlov @Jack Hughes
689 M The Ur-Dragon @Tyler Walpole
692 R Flawless Maneuver @Warren Mahy
693 M Smothering Tithe @Jeff Miracola
695 R Deadly Rollick @Izzy
699 M Insurrection @
694 R Fierce Guardianship @
695 R Deadly Rollick @Ron Spencer
696 M Demonic Tutor @Donato Giancola
697 M Balefire Dragon @Scott M. Fischer
698 R Deflecting Swat @Greg Staples
699 M Insurrection @Jeff Miracola
700 M Finale of Devastation @Daren Bader
701 R Obscuring Haze @Daren Bader
702 M Jeweled Lotus @Olena Richards
@@ -234,8 +433,12 @@ ScryfallCode=CMM
781 M Commodore Guff @Matt Stewart
782 M Sliver Gravemother @Chris Rahn
1057 M Kozilek, the Great Distortion @Grant Griffin
1060 M Urza, Lord High Artificer @
1063 M Omnath, Locus of Mana @
1058 M Morophon, the Boundless @Jack Hughes
1059 M Ulamog, the Ceaseless Hunger @Cosmin Podar
1060 M Urza, Lord High Artificer @Grant Griffin
1061 M Mikaeus, the Unhallowed @Benjamin Ee
1062 M Neheb, the Eternal @Alex Stone
1063 M Omnath, Locus of Mana @Alex Dos Diaz
1064 M Selvala, Heart of the Wilds @Jack Hughes
1065 M The Ur-Dragon @Tyler Walpole
1066 M Jeweled Lotus @Olena Richards

View File

@@ -781,14 +781,14 @@ F567 R Puresteel Angel @Lukas Litzsinger
773 R Repay in Kind @Vance Kovacs
774 R Volrath's Dungeon @Stephen Daniele
775 C Dragon's Approach @Andrew Mar
776 U Dragon's Rage Channeler @Martina Fackova
776 U Dragon's Rage Channeler @Martina Fačková
777 M Goldspan Dragon @Andrew Mar
778 R Lathliss, Dragon Queen @Alex Konstad
779 U Magic Missile @PINDURSKI
780 U Thundering Sparkmage @Billy Christian
781 R Worldgorger Dragon @Wayne England
782 U Devoted Druid @Kimonas Theodossiou
783 U Druid's Call @Greg Hildebrandt
783 U Druid's Call @Greg Hildebrandt & Tim Hildebrandt
784 U Edgewall Innkeeper @Matt Stewart
785 R Gilt-Leaf Archdruid @Steve Prescott
786 M Old Gnawbone @Filip Burburan
@@ -1095,3 +1095,78 @@ F567 R Puresteel Angel @Lukas Litzsinger
1087 R Sea of Clouds @Florian de Gesincourt
1088 R The World Tree @Anastasia Ovchinnikova
1089 U Zhalfirin Void @Chase Stone
1090 U All That Glitters @Iain McCaig
1091 U Baird, Steward of Argive @Christine Choi
1092 C Battleflight Eagle @Kev Walker
1093 R Court of Grace @Denman Rooke
1094 R Darien, King of Kjeldor @Michael Phillippi
1095 C Doomed Traveler @Lars Grant-West
1096 R Earnest Fellowship @Heather Hudson
1097 U Far Traveler @Alix Branwyn
1098 C Fortifying Provisions @Scott Murphy
1099 U Generous Gift @Kev Walker
1100 M Kenrith, the Returned King @Kieran Yanner
1101 R Knight-Captain of Eos @Chris Rahn
1102 R Knight Exemplar @Jason Chan
1103 C Oaken Brawler @Jim Murray
1104 R Ancestral Memories @Dan Frazier
1105 R Arcane Melee @Jaime Jones
1106 R Commandeer @John Matson
1107 R Counterlash @Austin Hsu
1108 R Denying Wind @Tony Szczudlo
1109 R Exhaustion @DiTerlizzi
1110 R Mindlock Orb @rk post
1111 R Oath of Scholars @Michael Sutfin
1112 R Rayne, Academy Chancellor @Matthew D. Wilson
1113 C Stormwatch Eagle @Aaron Boyd
1114 R Stroke of Genius @Stephen Daniele
1115 C Traveler's Cloak @Rebecca Guay
1116 C Barrow Ghoul @Bryan Talbot
1117 C Barrow Witches @Alex Brock
1118 U Bog Wraith @Daarken
1119 U Evil Eye of Urborg @Clint Langley
1120 U Grim Strider @Christine Choi
1121 U Orc Sureshot @Kev Walker
1122 R Pitiless Horde @Viktor Titov
1123 U Crush the Weak @Lucas Graciano
1124 R Dwarven Bloodboiler @Arnie Swekel
1125 C Dwarven Grunt @Mike Ploog
1126 U Dwarven Miner @Jock
1127 U Glittering Stockpile @Brock Grossman
1128 U Hoarding Dragon @Matt Cavotta
1129 C Miner's Bane @Adam Paquette
1130 U Orcish Artillery @Jeff Miracola
1131 R Reforge the Soul @Jaime Jones
1132 C Battlewand Oak @Steve Prescott
1133 U Blossom Prancer @Ryan Yee
1134 R Budoka Gardener @Kev Walker
1135 C Courage in Crisis @Micah Epstein
1136 R Dauntless Dourbark @Jeremy Jarvis
1137 U Elven Palisade @Mark Zug
1138 R Elven Warhounds @Kev Walker
1139 U Gather Courage @Brian Despain
1140 R Leaf-Crowned Elder @Wayne Reynolds
1141 U Murasa Ranger @Eric Deschamps
1142 R Nemata, Grove Guardian @John Avon
1143 R Unstoppable Ash @Brian Snõddy
1144 R Ancient Spider @Greg Staples
1145 R Doomsday Specter @Donato Giancola
1146 U Empyrean Eagle @Jason A. Engle
1147 R Ghastlord of Fugue @Mike Dringenberg
1148 R Gluttonous Troll @Joe Slucher
1149 R Jared Carthalion, True Heir @Lius Lasahido
1150 C Old Ghastbark @Thomas M. Baxa
1151 R Tolsimir, Friend to Wolves @Ryan Pancoast
1152 R Angelheart Vial @Chippy
1153 R Dolmen Gate @Richard Sardinha
1154 R Doom Cannon @Matthew Mitchell
1155 R Eye of Doom @Yeong-Hao Han
1156 R Forebear's Blade @Scott Murphy
1157 R Jinxed Ring @M. W. Kaluta
1158 R Rakdos Riteknife @Jim Nelson
1159 M Ring of Three Wishes @Mark Winters
1160 R Sword of Vengeance @Dan Scott
1161 R Tower of Calamities @Aleksi Briclot
1162 R Tower of Fortunes @Matt Cavotta
1163 R Wheel of Torture @Henry Van Der Linde
1164 U Forbidding Watchtower @Aleksi Briclot

View File

@@ -3,4 +3,4 @@ Name:Premodern
Order:106
Type:Casual
Sets:4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG
Banned:Amulet of Quoz; Balance; Brainstorm; Bronze Tablet; Channel; Demonic Consultation; Earthcraft; Entomb; Flash; Force of Will; Goblin Recruiter; Grim Monolith; Jeweled Bird; Mana Vault; Memory Jar; Mind Twist; Mind's Desire; Mystical Tutor; Necropotence; Rebirth; Strip Mine; Tempest Efreet; Tendrils of Agony; Time Spiral; Timmerian Fiends; Tolarian Academy; Vampiric Tutor; Windfall; Worldgorger Dragon; Yawgmoth's Bargain; Yawgmoth's Will
Banned:Amulet of Quoz; Balance; Brainstorm; Bronze Tablet; Channel; Demonic Consultation; Earthcraft; Entomb; Flash; Force of Will; Goblin Recruiter; Grim Monolith; Jeweled Bird; Land Tax; Mana Vault; Memory Jar; Mind Twist; Mind's Desire; Mystical Tutor; Necropotence; Rebirth; Strip Mine; Tempest Efreet; Tendrils of Agony; Time Spiral; Timmerian Fiends; Tolarian Academy; Vampiric Tutor; Windfall; Worldgorger Dragon; Yawgmoth's Bargain; Yawgmoth's Will

View File

@@ -2237,6 +2237,8 @@ lblSelectThisCardConfirm=Wähle diese Karte?
#CardView.java
lblMainGame=Hauptspiel
lblSubgame=Unterspiel (Auslöser {0})
lblHandSize=Handgröße
lblStartingLife=Leben beginnen
#PlayerView.java
lblCommanderCastCard=Wurde bereits {0} mal aus der Kommandozone gespielt
lblCommanderCastPlayer={0} spielte {1} mal aus der Kommandozone

View File

@@ -2242,6 +2242,8 @@ lblSelectThisCardConfirm=Select this card?
#CardView.java
lblMainGame=Main game
lblSubgame=Subgame ({0} parent)
lblHandSize=Hand Size
lblStartingLife=Starting Life
#PlayerView.java
lblCommanderCastCard=Cast from command zone {0} times
lblCommanderCastPlayer={0} cast from command zone {1} times

View File

@@ -2238,6 +2238,8 @@ lblSelectThisCardConfirm=¿Selecciona esta carta?
#CardView.java
lblMainGame=Juego principal
lblSubgame=Subjuego (padre {0})
lblHandSize=Tamaño de la mano
lblStartingLife=La vida inicial
#PlayerView.java
lblCommanderCastCard=Lanzado desde la zona de comandante {0} veces
lblCommanderCastPlayer={0} lanzado desde la zona de comandante {1} veces

View File

@@ -2240,6 +2240,8 @@ lblSelectThisCardConfirm=Sélectionner cette carte ?
#CardView.java
lblMainGame=Jeu principal
lblSubgame=Sous-jeu ({0} parent)
lblHandSize=Taille de la main
lblStartingLife=Début de la vie
#PlayerView.java
lblCommanderCastCard=Lancer depuis la zone de commande {0} fois
lblCommanderCastPlayer={0} lancer de la zone de commande {1} fois

View File

@@ -2237,6 +2237,8 @@ lblSelectThisCardConfirm=Vuoi scegliere questa carta?
#CardView.java
lblMainGame=Gioco principale
lblSubgame=Sottopartita (da {0})
lblHandSize=Dimensione delle mani
lblStartingLife=La vita iniziale
#PlayerView.java
lblCommanderCastCard=Lanciato dalla zona di comando {0} volte
lblCommanderCastPlayer={0} è stato lanciato dalla zona di comando {1} volte

View File

@@ -2237,6 +2237,8 @@ lblSelectThisCardConfirm=このカードを選択しますか?
#CardView.java
lblMainGame=メインゲーム
lblSubgame={0}つ上のサブゲーム
lblHandSize=ハンドサイズ
lblStartingLife=人生を始める
#PlayerView.java
lblCommanderCastCard=コマンド領域からキャスト:{0}回
lblCommanderCastPlayer={0}が {1}回コマンド領域からキャストした

View File

@@ -2304,6 +2304,8 @@ lblSelectThisCardConfirm=Escolher este cartão?
#CardView.java
lblMainGame=Jogo Principal
lblSubgame=Subjogo ({0} pai)
lblHandSize=Tamanho da mão
lblStartingLife=Começando a vida
#PlayerView.java
lblCommanderCastCard=Conjurado da zona de comando {0} vezes
lblCommanderCastPlayer={0} conjurou da zona de comando {1} vezes

View File

@@ -2242,6 +2242,8 @@ lblSelectThisCardConfirm=选择这张牌?
#CardView.java
lblMainGame=主游戏
lblSubgame=子游戏({0}个父游戏)
lblHandSize=手尺寸
lblStartingLife=开始生活
#PlayerView.java
lblCommanderCastCard=从指挥官区域释放过{0}次
lblCommanderCastPlayer={0}从指挥官区域释放过{1}次