This commit is contained in:
Chris H
2019-01-28 15:15:06 -05:00
90 changed files with 819 additions and 180 deletions

View File

@@ -102,6 +102,7 @@ public class DeckRecognizer {
// Pattern.compile("(.*)[^A-Za-wyz]*\\s+([\\d]{1,2})"); // Pattern.compile("(.*)[^A-Za-wyz]*\\s+([\\d]{1,2})");
private static final Pattern SEARCH_NUMBERS_IN_FRONT = Pattern.compile("([\\d]{1,2})[^A-Za-wyz]*\\s+(.*)"); private static final Pattern SEARCH_NUMBERS_IN_FRONT = Pattern.compile("([\\d]{1,2})[^A-Za-wyz]*\\s+(.*)");
//private static final Pattern READ_SEPARATED_EDITION = Pattern.compile("[[\\(\\{]([a-zA-Z0-9]){1,3})[]*\\s+(.*)"); //private static final Pattern READ_SEPARATED_EDITION = Pattern.compile("[[\\(\\{]([a-zA-Z0-9]){1,3})[]*\\s+(.*)");
private static final Pattern SEARCH_SINGLE_SLASH = Pattern.compile("(?<=[^/])\\s*/\\s*(?=[^/])");
private final SetPreference useLastSet; private final SetPreference useLastSet;
private final ICardDatabase db; private final ICardDatabase db;
@@ -125,7 +126,10 @@ public class DeckRecognizer {
return new Token(TokenType.Comment, 0, rawLine); return new Token(TokenType.Comment, 0, rawLine);
} }
final char smartQuote = (char) 8217; final char smartQuote = (char) 8217;
final String line = rawLine.trim().replace(smartQuote, '\''); String line = rawLine.trim().replace(smartQuote, '\'');
// Some websites export split card names with a single slash. Replace with double slash.
line = SEARCH_SINGLE_SLASH.matcher(line).replaceFirst(" // ");
Token result = null; Token result = null;
final Matcher foundNumbersInFront = DeckRecognizer.SEARCH_NUMBERS_IN_FRONT.matcher(line); final Matcher foundNumbersInFront = DeckRecognizer.SEARCH_NUMBERS_IN_FRONT.matcher(line);

View File

@@ -29,6 +29,7 @@ import forge.game.ability.effects.AttachEffect;
import forge.game.card.*; import forge.game.card.*;
import forge.game.event.*; import forge.game.event.*;
import forge.game.keyword.KeywordInterface; import forge.game.keyword.KeywordInterface;
import forge.game.keyword.KeywordsChange;
import forge.game.player.GameLossReason; import forge.game.player.GameLossReason;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.replacement.ReplacementEffect; import forge.game.replacement.ReplacementEffect;
@@ -292,6 +293,33 @@ public class GameAction {
copied.getOwner().addInboundToken(copied); copied.getOwner().addInboundToken(copied);
} }
if (toBattlefield) {
// HACK for making the RIOT enchantment look into the Future
// need to check the Keywords what it would have on the Battlefield
Card riotLKI = CardUtil.getLKICopy(copied);
riotLKI.setLastKnownZone(zoneTo);
CardCollection preList = new CardCollection(riotLKI);
checkStaticAbilities(false, Sets.newHashSet(riotLKI), preList);
List<Long> changedTimeStamps = Lists.newArrayList();
for(Map.Entry<Long, KeywordsChange> e : riotLKI.getChangedCardKeywords().entrySet()) {
if (!copied.hasChangedCardKeywords(e.getKey())) {
KeywordsChange o = e.getValue();
o.setHostCard(copied);
for (KeywordInterface k : o.getKeywords()) {
for (ReplacementEffect re : k.getReplacements()) {
// this param need to be set, otherwise in ReplaceMoved it fails
re.getMapParams().put("BypassEtbCheck", "True");
}
}
copied.addChangedCardKeywordsInternal(o, e.getKey());
changedTimeStamps.add(e.getKey());
}
}
checkStaticAbilities(false);
}
Map<String, Object> repParams = Maps.newHashMap(); Map<String, Object> repParams = Maps.newHashMap();
repParams.put("Event", "Moved"); repParams.put("Event", "Moved");
repParams.put("Affected", copied); repParams.put("Affected", copied);

View File

@@ -150,14 +150,14 @@ public class CharmEffect extends SpellAbilityEffect {
return ""; return "";
} }
public static void makeChoices(SpellAbility sa) { public static boolean makeChoices(SpellAbility sa) {
//this resets all previous choices //this resets all previous choices
sa.setSubAbility(null); sa.setSubAbility(null);
// Entwine does use all Choices // Entwine does use all Choices
if (sa.isEntwine()) { if (sa.isEntwine()) {
chainAbilities(sa, makePossibleOptions(sa)); chainAbilities(sa, makePossibleOptions(sa));
return; return true;
} }
final int num = sa.hasParam("CharmNumOnResolve") ? final int num = sa.hasParam("CharmNumOnResolve") ?
@@ -181,6 +181,7 @@ public class CharmEffect extends SpellAbilityEffect {
List<AbilitySub> chosen = chooser.getController().chooseModeForAbility(sa, min, num, sa.hasParam("CanRepeatModes")); List<AbilitySub> chosen = chooser.getController().chooseModeForAbility(sa, min, num, sa.hasParam("CanRepeatModes"));
chainAbilities(sa, chosen); chainAbilities(sa, chosen);
return chosen != null && !chosen.isEmpty();
} }
private static void chainAbilities(SpellAbility sa, List<AbilitySub> chosen) { private static void chainAbilities(SpellAbility sa, List<AbilitySub> chosen) {

View File

@@ -1465,7 +1465,8 @@ public class Card extends GameEntity implements Comparable<Card> {
} }
} }
} }
if (keyword.startsWith("CantBeCounteredBy")) { if (keyword.startsWith("CantBeCounteredBy") || keyword.startsWith("Panharmonicon")
|| keyword.startsWith("Dieharmonicon")) {
final String[] p = keyword.split(":"); final String[] p = keyword.split(":");
sbLong.append(p[2]).append("\r\n"); sbLong.append(p[2]).append("\r\n");
} else if (keyword.startsWith("etbCounter")) { } else if (keyword.startsWith("etbCounter")) {
@@ -3404,6 +3405,15 @@ public class Card extends GameEntity implements Comparable<Card> {
return change; return change;
} }
public final boolean hasChangedCardKeywords(final long timestamp) {
return changedCardKeywords.containsKey(timestamp);
}
public final void addChangedCardKeywordsInternal(final KeywordsChange change, final long timestamp) {
changedCardKeywords.put(timestamp, change);
updateKeywordsCache(currentState);
}
// Hidden keywords will be left out // Hidden keywords will be left out
public final Collection<KeywordInterface> getUnhiddenKeywords() { public final Collection<KeywordInterface> getUnhiddenKeywords() {
return getUnhiddenKeywords(currentState); return getUnhiddenKeywords(currentState);
@@ -5731,7 +5741,7 @@ public class Card extends GameEntity implements Comparable<Card> {
public void setChangedCardKeywords(Map<Long, KeywordsChange> changedCardKeywords) { public void setChangedCardKeywords(Map<Long, KeywordsChange> changedCardKeywords) {
this.changedCardKeywords.clear(); this.changedCardKeywords.clear();
for (Entry<Long, KeywordsChange> entry : changedCardKeywords.entrySet()) { for (Entry<Long, KeywordsChange> entry : changedCardKeywords.entrySet()) {
this.changedCardKeywords.put(entry.getKey(), entry.getValue()); this.changedCardKeywords.put(entry.getKey(), entry.getValue().copy(this, true));
} }
} }

View File

@@ -25,8 +25,6 @@ import forge.card.mana.ManaCost;
import forge.game.Game; import forge.game.Game;
import forge.game.ability.AbilityFactory; import forge.game.ability.AbilityFactory;
import forge.game.ability.AbilityUtils; import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType;
import forge.game.ability.effects.CharmEffect;
import forge.game.cost.Cost; import forge.game.cost.Cost;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.replacement.ReplacementHandler; import forge.game.replacement.ReplacementHandler;
@@ -680,9 +678,6 @@ public class CardFactory {
} }
trig.setStackDescription(trig.toString()); trig.setStackDescription(trig.toString());
if (trig.getApi() == ApiType.Charm && !trig.isWrapper()) {
CharmEffect.makeChoices(trig);
}
WrappedAbility wrapperAbility = new WrappedAbility(t, trig, ((WrappedAbility) sa).getDecider()); WrappedAbility wrapperAbility = new WrappedAbility(t, trig, ((WrappedAbility) sa).getDecider());
wrapperAbility.setTrigger(true); wrapperAbility.setTrigger(true);

View File

@@ -11,6 +11,7 @@ import com.google.common.collect.Maps;
import com.google.common.collect.Table; import com.google.common.collect.Table;
import forge.game.Game; import forge.game.Game;
import forge.game.spellability.SpellAbility;
import forge.game.trigger.TriggerType; import forge.game.trigger.TriggerType;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
@@ -45,4 +46,39 @@ public class CardZoneTable extends ForwardingTable<ZoneType, ZoneType, CardColle
game.getTriggerHandler().runTrigger(TriggerType.ChangesZoneAll, runParams, false); game.getTriggerHandler().runTrigger(TriggerType.ChangesZoneAll, runParams, false);
} }
} }
public CardCollection filterCards(Iterable<ZoneType> origin, ZoneType destination, String valid, Card host, SpellAbility sa) {
CardCollection allCards = new CardCollection();
if (destination != null) {
if (!containsColumn(destination)) {
return allCards;
}
}
if (origin != null) {
for (ZoneType z : origin) {
if (containsRow(z)) {
if (destination != null) {
allCards.addAll(row(z).get(destination));
} else {
for (CardCollection c : row(z).values()) {
allCards.addAll(c);
}
}
}
}
} else if (destination != null) {
for (CardCollection c : column(destination).values()) {
allCards.addAll(c);
}
} else {
for (CardCollection c : values()) {
allCards.addAll(c);
}
}
if (valid != null) {
allCards = CardLists.getValidCards(allCards, valid.split(","), host.getController(), host, sa);
}
return allCards;
}
} }

View File

@@ -8,6 +8,8 @@ import java.util.Iterator;
import com.google.common.collect.Multimap; import com.google.common.collect.Multimap;
import com.google.common.collect.MultimapBuilder; import com.google.common.collect.MultimapBuilder;
import forge.game.card.Card;
public class KeywordCollection implements Iterable<String>, Serializable { public class KeywordCollection implements Iterable<String>, Serializable {
private static final long serialVersionUID = -2882986558147844702L; private static final long serialVersionUID = -2882986558147844702L;
@@ -151,6 +153,12 @@ public class KeywordCollection implements Iterable<String>, Serializable {
return map.get(keyword); return map.get(keyword);
} }
public void setHostCard(final Card host) {
for (KeywordInterface k : map.values()) {
k.setHostCard(host);
}
}
@Override @Override
public Iterator<String> iterator() { public Iterator<String> iterator() {
return new Iterator<String>() { return new Iterator<String>() {

View File

@@ -233,7 +233,7 @@ public abstract class KeywordInstance<T extends KeywordInstance<?>> implements K
return result; return result;
} catch (final Exception ex) { } catch (final Exception ex) {
throw new RuntimeException("KeywordInstance : clone() error, " + ex); throw new RuntimeException("KeywordInstance : clone() error", ex);
} }
} }
@@ -252,4 +252,26 @@ public abstract class KeywordInstance<T extends KeywordInstance<?>> implements K
public boolean redundant(Collection<KeywordInterface> list) { public boolean redundant(Collection<KeywordInterface> list) {
return !list.isEmpty() && keyword.isMultipleRedundant; return !list.isEmpty() && keyword.isMultipleRedundant;
} }
/* (non-Javadoc)
* @see forge.game.keyword.KeywordInterface#setHostCard(forge.game.card.Card)
*/
@Override
public void setHostCard(Card host) {
for (SpellAbility sa : this.abilities) {
sa.setHostCard(host);
}
for (Trigger tr : this.triggers) {
tr.setHostCard(host);
}
for (ReplacementEffect re : this.replacements) {
re.setHostCard(host);
}
for (StaticAbility sa : this.staticAbilities) {
sa.setHostCard(host);
}
}
} }

View File

@@ -31,6 +31,7 @@ public interface KeywordInterface extends Cloneable {
public void addSpellAbility(final SpellAbility s); public void addSpellAbility(final SpellAbility s);
public void addStaticAbility(final StaticAbility st); public void addStaticAbility(final StaticAbility st);
public void setHostCard(final Card host);
/** /**
* @return the triggers * @return the triggers

View File

@@ -30,12 +30,11 @@ import forge.game.card.Card;
* </p> * </p>
* *
* @author Forge * @author Forge
* @version $Id: KeywordsChange.java 27095 2014-08-17 07:32:24Z elcnesh $
*/ */
public class KeywordsChange { public class KeywordsChange implements Cloneable {
private final KeywordCollection keywords = new KeywordCollection(); private KeywordCollection keywords = new KeywordCollection();
private final List<KeywordInterface> removeKeywordInterfaces = Lists.newArrayList(); private List<KeywordInterface> removeKeywordInterfaces = Lists.newArrayList();
private final List<String> removeKeywords = Lists.newArrayList(); private List<String> removeKeywords = Lists.newArrayList();
private boolean removeAllKeywords; private boolean removeAllKeywords;
private boolean removeIntrinsicKeywords; private boolean removeIntrinsicKeywords;
@@ -172,4 +171,49 @@ public class KeywordsChange {
removeIntrinsicKeywords = true; removeIntrinsicKeywords = true;
} }
} }
public void setHostCard(final Card host) {
keywords.setHostCard(host);
for (KeywordInterface k : removeKeywordInterfaces) {
k.setHostCard(host);
}
}
public KeywordsChange copy(final Card host, final boolean lki) {
try {
KeywordsChange result = (KeywordsChange)super.clone();
result.keywords = new KeywordCollection();
for (KeywordInterface ki : this.keywords.getValues()) {
result.keywords.insert(ki.copy(host, lki));
}
result.removeKeywords = Lists.newArrayList(removeKeywords);
result.removeKeywordInterfaces = Lists.newArrayList();
for (KeywordInterface ki : this.removeKeywordInterfaces) {
removeKeywordInterfaces.add(ki.copy(host, lki));
}
return result;
} catch (final Exception ex) {
throw new RuntimeException("KeywordsChange : clone() error", ex);
}
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("<+");
sb.append(this.keywords);
sb.append("|-");
sb.append(this.removeKeywordInterfaces);
sb.append("|-");
sb.append(this.removeKeywords);
sb.append(">");
return sb.toString();
}
} }

View File

@@ -76,7 +76,7 @@ public class ReplaceMoved extends ReplacementEffect {
return false; return false;
} }
if (zt.equals(ZoneType.Battlefield) && getHostCard().equals(affected)) { if (zt.equals(ZoneType.Battlefield) && getHostCard().equals(affected) && !hasParam("BypassEtbCheck")) {
// would be an etb replacement effect that enters the battlefield // would be an etb replacement effect that enters the battlefield
Card lki = CardUtil.getLKICopy(affected); Card lki = CardUtil.getLKICopy(affected);
lki.setLastKnownZone(lki.getController().getZone(zt)); lki.setLastKnownZone(lki.getController().getZone(zt));

View File

@@ -144,6 +144,8 @@ public abstract class Spell extends SpellAbility implements java.io.Serializable
if (lkicheck) { if (lkicheck) {
game.getAction().checkStaticAbilities(false); game.getAction().checkStaticAbilities(false);
game.getTracker().unfreeze(); game.getTracker().unfreeze();
// reset owner for lki
card.setController(null, 0);
} }
if (!(isInstant || activator.canCastSorcery() || flash || getRestrictions().isInstantSpeed() if (!(isInstant || activator.canCastSorcery() || flash || getRestrictions().isInstantSpeed()

View File

@@ -42,48 +42,19 @@ public class TriggerChangesZoneAll extends Trigger {
} }
private CardCollection filterCards(CardZoneTable table) { private CardCollection filterCards(CardZoneTable table) {
CardCollection allCards = new CardCollection();
ZoneType destination = null; ZoneType destination = null;
List<ZoneType> origin = null;
if (hasParam("Destination")) { if (hasParam("Destination") && !getParam("Destination").equals("Any")) {
if (!getParam("Destination").equals("Any")) { destination = ZoneType.valueOf(getParam("Destination"));
destination = ZoneType.valueOf(getParam("Destination"));
if (!table.containsColumn(destination)) {
return allCards;
}
}
} }
if (hasParam("Origin") && !getParam("Origin").equals("Any")) { if (hasParam("Origin") && !getParam("Origin").equals("Any")) {
if (getParam("Origin") == null) { origin = ZoneType.listValueOf(getParam("Origin"));
return allCards;
}
final List<ZoneType> origin = ZoneType.listValueOf(getParam("Origin"));
for (ZoneType z : origin) {
if (table.containsRow(z)) {
if (destination != null) {
allCards.addAll(table.row(z).get(destination));
} else {
for (CardCollection c : table.row(z).values()) {
allCards.addAll(c);
}
}
}
}
} else if (destination != null) {
for (CardCollection c : table.column(destination).values()) {
allCards.addAll(c);
}
} else {
for (CardCollection c : table.values()) {
allCards.addAll(c);
}
} }
if (hasParam("ValidCards")) { final String valid = this.getParamOrDefault("ValidCards", null);
allCards = CardLists.getValidCards(allCards, getParam("ValidCards").split(","),
getHostCard().getController(), getHostCard(), null); return table.filterCards(origin, destination, valid, getHostCard(), null);
}
return allCards;
} }
} }

View File

@@ -25,7 +25,10 @@ import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType; import forge.game.ability.ApiType;
import forge.game.ability.effects.CharmEffect; import forge.game.ability.effects.CharmEffect;
import forge.game.card.Card; import forge.game.card.Card;
import forge.game.card.CardLists;
import forge.game.card.CardUtil; import forge.game.card.CardUtil;
import forge.game.card.CardZoneTable;
import forge.game.keyword.KeywordInterface;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.spellability.Ability; import forge.game.spellability.Ability;
@@ -42,6 +45,7 @@ import io.sentry.event.BreadcrumbBuilder;
import java.util.*; import java.util.*;
import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ListMultimap; import com.google.common.collect.ListMultimap;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
@@ -376,11 +380,7 @@ public class TriggerHandler {
// Static triggers // Static triggers
for (final Trigger t : Lists.newArrayList(activeTriggers)) { for (final Trigger t : Lists.newArrayList(activeTriggers)) {
if (t.isStatic() && canRunTrigger(t, mode, runParams)) { if (t.isStatic() && canRunTrigger(t, mode, runParams)) {
int x = 1 + handlePanharmonicon(t, runParams); runSingleTrigger(t, runParams);
for (int i = 0; i < x; ++i) {
runSingleTrigger(t, runParams);
}
checkStatics = true; checkStatics = true;
} }
@@ -448,7 +448,7 @@ public class TriggerHandler {
} }
} }
int x = 1 + handlePanharmonicon(t, runParams);; int x = 1 + handlePanharmonicon(t, runParams, player);
for (int i = 0; i < x; ++i) { for (int i = 0; i < x; ++i) {
runSingleTrigger(t, runParams); runSingleTrigger(t, runParams);
@@ -636,7 +636,10 @@ public class TriggerHandler {
sa.setStackDescription(sa.toString()); sa.setStackDescription(sa.toString());
if (sa.getApi() == ApiType.Charm && !sa.isWrapper()) { if (sa.getApi() == ApiType.Charm && !sa.isWrapper()) {
CharmEffect.makeChoices(sa); if (!CharmEffect.makeChoices(sa)) {
// 603.3c If no mode is chosen, the ability is removed from the stack.
return;
}
} }
Player decider = null; Player decider = null;
@@ -692,46 +695,81 @@ public class TriggerHandler {
} }
} }
private int handlePanharmonicon(final Trigger t, final Map<String, Object> runParams) { private int handlePanharmonicon(final Trigger t, final Map<String, Object> runParams, final Player p) {
// Need to get the last info from the trigger host Card host = t.getHostCard();
final Card host = game.getChangeZoneLKIInfo(t.getHostCard());
final Player p = host.getController();
// not a changesZone trigger // not a changesZone trigger or changesZoneAll
if (t.getMode() != TriggerType.ChangesZone) { if (t.getMode() != TriggerType.ChangesZone && t.getMode() != TriggerType.ChangesZoneAll) {
return 0; return 0;
} }
// leave battlefield trigger, might be dying
// only real changeszone look back for this
if (t.getMode() == TriggerType.ChangesZone && "Battlefield".equals(t.getParam("Origin"))) {
// Need to get the last info from the trigger host
host = game.getChangeZoneLKIInfo(host);
}
// not a Permanent you control // not a Permanent you control
if (!host.isPermanent() || !host.isInZone(ZoneType.Battlefield)) { if (!host.isPermanent() || !host.isInZone(ZoneType.Battlefield)) {
return 0; return 0;
} }
int n = 0; int n = 0;
for (final String kw : p.getKeywords()) { if (t.getMode() == TriggerType.ChangesZone) {
if (kw.startsWith("Panharmonicon")) { // iterate over all cards
// Enter the Battlefield Trigger final List<Card> lastCards = CardLists.filterControlledBy(p.getGame().getLastStateBattlefield(), p);
if (runParams.get("Destination") instanceof String) { for (final Card ck : lastCards) {
final String dest = (String) runParams.get("Destination"); for (final KeywordInterface ki : ck.getKeywords()) {
if ("Battlefield".equals(dest) && runParams.get("Card") instanceof Card) { final String kw = ki.getOriginal();
final Card card = (Card) runParams.get("Card"); if (kw.startsWith("Panharmonicon")) {
final String valid = kw.split(":")[1]; // Enter the Battlefield Trigger
if (card.isValid(valid.split(","), p, host, null)) { if (runParams.get("Destination") instanceof String) {
n++; final String dest = (String) runParams.get("Destination");
if ("Battlefield".equals(dest) && runParams.get("Card") instanceof Card) {
final Card card = (Card) runParams.get("Card");
final String valid = kw.split(":")[1];
if (card.isValid(valid.split(","), p, ck, null)) {
n++;
}
}
}
} else if (kw.startsWith("Dieharmonicon")) {
// 700.4. The term dies means “is put into a graveyard from the battlefield.”
if (runParams.get("Origin") instanceof String) {
final String origin = (String) runParams.get("Origin");
if ("Battlefield".equals(origin) && runParams.get("Destination") instanceof String) {
final String dest = (String) runParams.get("Destination");
if ("Graveyard".equals(dest) && runParams.get("Card") instanceof Card) {
final Card card = (Card) runParams.get("Card");
final String valid = kw.split(":")[1];
if (card.isValid(valid.split(","), p, ck, null)) {
n++;
}
}
}
} }
} }
} }
} else if (kw.startsWith("Dieharmonicon")) { }
// 700.4. The term dies means “is put into a graveyard from the battlefield.” } else if (t.getMode() == TriggerType.ChangesZoneAll) {
if (runParams.get("Origin") instanceof String) { final CardZoneTable table = (CardZoneTable) runParams.get("Cards");
final String origin = (String) runParams.get("Origin"); // iterate over all cards
if ("Battlefield".equals(origin) && runParams.get("Destination") instanceof String) { for (final Card ck : p.getCardsIn(ZoneType.Battlefield)) {
final String dest = (String) runParams.get("Destination"); for (final KeywordInterface ki : ck.getKeywords()) {
if ("Graveyard".equals(dest) && runParams.get("Card") instanceof Card) { final String kw = ki.getOriginal();
final Card card = (Card) runParams.get("Card"); if (kw.startsWith("Panharmonicon")) {
if (card.isCreature()) { // currently there is no ChangesZoneAll that would trigger on etb
n++; final String valid = kw.split(":")[1];
} if (!table.filterCards(null, ZoneType.Battlefield, valid, ck, null).isEmpty()) {
n++;
}
} else if (kw.startsWith("Dieharmonicon")) {
// 700.4. The term dies means “is put into a graveyard from the battlefield.”
final String valid = kw.split(":")[1];
if (!table.filterCards(ImmutableList.of(ZoneType.Battlefield), ZoneType.Graveyard,
valid, ck, null).isEmpty()) {
n++;
} }
} }
} }

View File

@@ -13,7 +13,7 @@ public class TriggerWaiting {
private Map<String, Object> params; private Map<String, Object> params;
private List<Trigger> triggers = null; private List<Trigger> triggers = null;
public TriggerWaiting(TriggerType m, Map<String, Object> p) { public TriggerWaiting(TriggerType m, Map<String, Object> p) {
mode = m; mode = m;
params = p; params = p;
} }
@@ -26,7 +26,6 @@ public class TriggerWaiting {
return params; return params;
} }
public List<Trigger> getTriggers() { public List<Trigger> getTriggers() {
return triggers; return triggers;
} }
@@ -35,7 +34,7 @@ public class TriggerWaiting {
this.triggers = triggers; this.triggers = triggers;
} }
@Override @Override
public String toString() { public String toString() {
return TextUtil.concatWithSpace("Waiting trigger:", mode.toString(),"with", params.toString()); return TextUtil.concatWithSpace("Waiting trigger:", mode.toString(),"with", params.toString());
} }

View File

@@ -397,6 +397,7 @@ public final class CMatchUI
case Hand: case Hand:
updateHand = true; updateHand = true;
updateZones = true; updateZones = true;
FloatingZone.refresh(owner, zone);
break; break;
default: default:
updateZones = true; updateZones = true;
@@ -524,6 +525,45 @@ public final class CMatchUI
} }
} }
@Override
public void setSelectables(final Iterable<CardView> cards) {
super.setSelectables(cards);
// update zones on tabletop and floating zones - non-selectable cards may be rendered differently
FThreads.invokeInEdtNowOrLater(new Runnable() {
@Override public final void run() {
for (final PlayerView p : getGameView().getPlayers()) {
if ( p.getCards(ZoneType.Battlefield) != null ) {
updateCards(p.getCards(ZoneType.Battlefield));
}
if ( p.getCards(ZoneType.Hand) != null ) {
updateCards(p.getCards(ZoneType.Hand));
}
}
FloatingZone.refreshAll();
}
});
}
@Override
public void clearSelectables() {
super.clearSelectables();
// update zones on tabletop and floating zones - non-selectable cards may be rendered differently
FThreads.invokeInEdtNowOrLater(new Runnable() {
@Override public final void run() {
for (final PlayerView p : getGameView().getPlayers()) {
if ( p.getCards(ZoneType.Battlefield) != null ) {
updateCards(p.getCards(ZoneType.Battlefield));
}
if ( p.getCards(ZoneType.Hand) != null ) {
updateCards(p.getCards(ZoneType.Hand));
}
}
FloatingZone.refreshAll();
}
});
}
@Override @Override
public List<JMenu> getMenus() { public List<JMenu> getMenus() {
return menus.getMenus(); return menus.getMenus();

View File

@@ -253,7 +253,7 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl
g2d.rotate(getTappedAngle(), cardXOffset + edgeOffset, (cardYOffset + cardHeight) g2d.rotate(getTappedAngle(), cardXOffset + edgeOffset, (cardYOffset + cardHeight)
- edgeOffset); - edgeOffset);
} }
super.paint(g2d); super.paint(g2d);
} }
@Override @Override
@@ -268,25 +268,21 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl
final int cornerSize = noBorderPref && !cardImgHasAlpha ? 0 : Math.max(4, Math.round(cardWidth * CardPanel.ROUNDED_CORNER_SIZE)); final int cornerSize = noBorderPref && !cardImgHasAlpha ? 0 : Math.max(4, Math.round(cardWidth * CardPanel.ROUNDED_CORNER_SIZE));
final int offset = isTapped() && (!noBorderPref || cardImgHasAlpha) ? 1 : 0; final int offset = isTapped() && (!noBorderPref || cardImgHasAlpha) ? 1 : 0;
// Magenta outline for when card was chosen to pay // Magenta outline for when card is chosen
if (matchUI.isUsedToPay(getCard())) { if (matchUI.isUsedToPay(getCard())) {
g2d.setColor(Color.magenta); g2d.setColor(Color.magenta);
final int n2 = Math.max(4, Math.round(2 * cardWidth * CardPanel.SELECTED_BORDER_SIZE)); final int n2 = Math.max(1, Math.round(2 * cardWidth * CardPanel.SELECTED_BORDER_SIZE));
g2d.fillRoundRect(cardXOffset - n2, (cardYOffset - n2) + offset, cardWidth + (n2 * 2), cardHeight + (n2 * 2), cornerSize + n2, cornerSize + n2);
} else if (matchUI.isSelectable(getCard())) { // Cyan outline for selectable cards
g2d.setColor(Color.cyan);
final int n2 = Math.max(4, Math.round(2 * cardWidth * CardPanel.SELECTED_BORDER_SIZE));
g2d.fillRoundRect(cardXOffset - n2, (cardYOffset - n2) + offset, cardWidth + (n2 * 2), cardHeight + (n2 * 2), cornerSize + n2, cornerSize + n2); g2d.fillRoundRect(cardXOffset - n2, (cardYOffset - n2) + offset, cardWidth + (n2 * 2), cardHeight + (n2 * 2), cornerSize + n2, cornerSize + n2);
} }
// Green outline for hover // Green outline for hover
if (isSelected) { if (isSelected) {
g2d.setColor(Color.green); g2d.setColor(Color.green);
final int n = Math.max(4, Math.round(cardWidth * CardPanel.SELECTED_BORDER_SIZE)); final int n = Math.max(1, Math.round(cardWidth * CardPanel.SELECTED_BORDER_SIZE));
g2d.fillRoundRect(cardXOffset - n, (cardYOffset - n) + offset, cardWidth + (n * 2), cardHeight + (n * 2), cornerSize + n , cornerSize + n); g2d.fillRoundRect(cardXOffset - n, (cardYOffset - n) + offset, cardWidth + (n * 2), cardHeight + (n * 2), cornerSize + n , cornerSize + n);
} }
// Black fill - (will become outline for white bordered cards) // Black fill - (will become an outline for white bordered cards)
g2d.setColor(Color.black); g2d.setColor(Color.black);
g2d.fillRoundRect(cardXOffset, cardYOffset + offset, cardWidth, cardHeight, cornerSize, cornerSize); g2d.fillRoundRect(cardXOffset, cardYOffset + offset, cardWidth, cardHeight, cornerSize, cornerSize);
@@ -309,6 +305,12 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl
g2d.fillRoundRect(cardXOffset + ins, cardYOffset + ins, cardWidth - ins*2, cardHeight - ins*2, cornerSize-ins, cornerSize-ins); g2d.fillRoundRect(cardXOffset + ins, cardYOffset + ins, cardWidth - ins*2, cardHeight - ins*2, cornerSize-ins, cornerSize-ins);
} }
} }
if (matchUI.isSelectable(getCard())) { // White border for selectable cards to further highlight them
g2d.setColor(Color.WHITE);
final int ins = 1;
g2d.fillRoundRect(cardXOffset+ins, cardYOffset+ins, cardWidth-ins*2, cardHeight-ins*2, cornerSize-ins, cornerSize-ins);
}
} }
private void drawManaCost(final Graphics g, final ManaCost cost, final int deltaY) { private void drawManaCost(final Graphics g, final ManaCost cost, final int deltaY) {
@@ -332,6 +334,17 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl
drawFoilEffect(g, card, cardXOffset, cardYOffset, drawFoilEffect(g, card, cardXOffset, cardYOffset,
cardWidth, cardHeight, Math.round(cardWidth * BLACK_BORDER_SIZE)); cardWidth, cardHeight, Math.round(cardWidth * BLACK_BORDER_SIZE));
} }
boolean nonselectable = matchUI.isSelecting() && !matchUI.isSelectable(getCard());
// if selecting, darken non-selectable cards
if ( nonselectable ) {
boolean noBorderPref = !isPreferenceEnabled(FPref.UI_RENDER_BLACK_BORDERS);
boolean cardImgHasAlpha = imagePanel != null && imagePanel.getSrcImage() != null && imagePanel.getSrcImage().getColorModel().hasAlpha();
final int cornerSize = noBorderPref && !cardImgHasAlpha ? 0 : Math.max(4, Math.round(cardWidth * CardPanel.ROUNDED_CORNER_SIZE));
final int offset = isTapped() && (!noBorderPref || cardImgHasAlpha) ? 1 : 0;
g.setColor(new Color(0.0f,0.0f,0.0f,0.6f));
g.fillRoundRect(cardXOffset, cardYOffset + offset, cardWidth, cardHeight, cornerSize, cornerSize);
}
} }
public static void drawFoilEffect(final Graphics g, final CardView card2, final int x, final int y, final int width, final int height, final int borderSize) { public static void drawFoilEffect(final Graphics g, final CardView card2, final int x, final int y, final int width, final int height, final int borderSize) {
@@ -783,6 +796,7 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl
return FModel.getPreferences().getPrefBoolean(preferenceName); return FModel.getPreferences().getPrefBoolean(preferenceName);
} }
// don't show overlays on non-selectable cards when selecting
private boolean isShowingOverlays() { private boolean isShowingOverlays() {
return isPreferenceEnabled(FPref.UI_SHOW_CARD_OVERLAYS) && card != null; return isPreferenceEnabled(FPref.UI_SHOW_CARD_OVERLAYS) && card != null;
} }

View File

@@ -94,6 +94,11 @@ public class FloatingZone extends FloatingCardArea {
} }
floatingAreas.clear(); floatingAreas.clear();
} }
public static void refreshAll() {
for (final FloatingZone cardArea : floatingAreas.values()) {
cardArea.refresh();
}
}
private final ZoneType zone; private final ZoneType zone;
private PlayerView player; private PlayerView player;

View File

@@ -1503,4 +1503,197 @@ public class GameSimulatorTest extends SimulationTestCase {
} }
public void testRiotEnchantment() {
Game game = initAndCreateGame();
Player p = game.getPlayers().get(0);
game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p);
final String goblinName = "Zhur-Taa Goblin";
addCard("Rhythm of the Wild", p);
Card goblin = addCardToZone(goblinName, p, ZoneType.Hand);
addCard("Mountain", p);
addCard("Forest", p);
SpellAbility goblinSA = goblin.getFirstSpellAbility();
assertNotNull(goblinSA);
GameSimulator sim = createSimulator(game, p);
int score = sim.simulateSpellAbility(goblinSA).value;
assertTrue(score > 0);
Game simGame = sim.getSimulatedGameState();
Card simGoblin = findCardWithName(simGame, goblinName);
assertNotNull(simGoblin);
int effects = simGoblin.getCounters(CounterType.P1P1) + simGoblin.getKeywordMagnitude(Keyword.HASTE);
assertTrue(effects == 2);
}
public void testTeysaKarlovXathridNecromancer() {
// Teysa Karlov and Xathrid Necromancer dying at the same time makes 4 token
Game game = initAndCreateGame();
Player p = game.getPlayers().get(0);
game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p);
addCard("Teysa Karlov", p);
addCard("Xathrid Necromancer", p);
for (int i = 0; i < 4; i++) {
addCardToZone("Plains", p, ZoneType.Battlefield);
}
Card wrathOfGod = addCardToZone("Wrath of God", p, ZoneType.Hand);
game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p);
SpellAbility wrathSA = wrathOfGod.getFirstSpellAbility();
assertNotNull(wrathSA);
GameSimulator sim = createSimulator(game, p);
int score = sim.simulateSpellAbility(wrathSA).value;
assertTrue(score > 0);
Game simGame = sim.getSimulatedGameState();
int numZombies = countCardsWithName(simGame, "Zombie");
assertTrue(numZombies == 4);
}
public void testDoubleTeysaKarlovXathridNecromancer() {
// Teysa Karlov dieing because of Legendary rule will make Xathrid Necromancer trigger 3 times
Game game = initAndCreateGame();
Player p = game.getPlayers().get(0);
game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p);
addCard("Teysa Karlov", p);
addCard("Xathrid Necromancer", p);
for (int i = 0; i < 3; i++) {
addCard("Plains", p);
}
addCard("Swamp", p);
Card second = addCardToZone("Teysa Karlov", p, ZoneType.Hand);
SpellAbility secondSA = second.getFirstSpellAbility();
GameSimulator sim = createSimulator(game, p);
int score = sim.simulateSpellAbility(secondSA).value;
assertTrue(score > 0);
Game simGame = sim.getSimulatedGameState();
int numZombies = countCardsWithName(simGame, "Zombie");
assertTrue(numZombies == 3);
}
public void testTeysaKarlovGitrogMonster() {
Game game = initAndCreateGame();
Player p = game.getPlayers().get(0);
game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p);
addCard("Teysa Karlov", p);
addCard("The Gitrog Monster", p);
addCard("Dryad Arbor", p);
for (int i = 0; i < 4; i++) {
addCard("Plains", p);
addCardToZone("Plains", p, ZoneType.Library);
}
Card armageddon = addCardToZone("Armageddon", p, ZoneType.Hand);
game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p);
SpellAbility armageddonSA = armageddon.getFirstSpellAbility();
GameSimulator sim = createSimulator(game, p);
int score = sim.simulateSpellAbility(armageddonSA).value;
assertTrue(score > 0);
Game simGame = sim.getSimulatedGameState();
// Two cards drawn
assertTrue(simGame.getPlayers().get(0).getZone(ZoneType.Hand).size() == 2);
}
public void testTeysaKarlovGitrogMonsterGitrogDies() {
Game game = initAndCreateGame();
Player p = game.getPlayers().get(0);
game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p);
Card teysa = addCard("Teysa Karlov", p);
addCard("The Gitrog Monster", p);
addCard("Dryad Arbor", p);
String indestructibilityName = "Indestructibility";
Card indestructibility = addCard(indestructibilityName, p);
indestructibility.attachToEntity(teysa);
// update Indestructible state
game.getAction().checkStateEffects(true);
for (int i = 0; i < 4; i++) {
addCard("Plains", p);
addCardToZone("Plains", p, ZoneType.Library);
}
Card armageddon = addCardToZone("Wrath of God", p, ZoneType.Hand);
game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p);
SpellAbility armageddonSA = armageddon.getFirstSpellAbility();
GameSimulator sim = createSimulator(game, p);
int score = sim.simulateSpellAbility(armageddonSA).value;
assertTrue(score > 0);
Game simGame = sim.getSimulatedGameState();
// One cards drawn
assertTrue(simGame.getPlayers().get(0).getZone(ZoneType.Hand).size() == 1);
}
public void testTeysaKarlovGitrogMonsterTeysaDies() {
Game game = initAndCreateGame();
Player p = game.getPlayers().get(0);
game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p);
addCard("Teysa Karlov", p);
Card gitrog = addCard("The Gitrog Monster", p);
addCard("Dryad Arbor", p);
String indestructibilityName = "Indestructibility";
Card indestructibility = addCard(indestructibilityName, p);
indestructibility.attachToEntity(gitrog);
// update Indestructible state
game.getAction().checkStateEffects(true);
for (int i = 0; i < 4; i++) {
addCard("Plains", p);
addCardToZone("Plains", p, ZoneType.Library);
}
Card armageddon = addCardToZone("Wrath of God", p, ZoneType.Hand);
game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p);
SpellAbility armageddonSA = armageddon.getFirstSpellAbility();
GameSimulator sim = createSimulator(game, p);
int score = sim.simulateSpellAbility(armageddonSA).value;
assertTrue(score > 0);
Game simGame = sim.getSimulatedGameState();
// One cards drawn
assertTrue(simGame.getPlayers().get(0).getZone(ZoneType.Hand).size() == 1);
}
} }

View File

@@ -1409,24 +1409,24 @@ Dimir Guildgate|GRN
Boros Guildgate|GRN Boros Guildgate|GRN
[RNA Lands] [RNA Lands]
10 Azorious Guildgate|GRN 10 Azorius Guildgate|RNA
10 Gruul Guildgate|GRN 10 Gruul Guildgate|RNA
10 Orzhov Guildgate|GRN 10 Orzhov Guildgate|RNA
10 Rakdos Guildgate|GRN 10 Rakdos Guildgate|RNA
10 Simic Guildgate|GRN 10 Simic Guildgate|RNA
[RNA Secret Cards] [RNA Secret Cards]
Dovin, Architecht of Law Dovin, Architect of Law
Elite Arrester Elite Arrester
Dovin's Dismissal Dovin's Dismissal
Dovin's Automaton Dovin's Automaton
Domri City Smasher Domri, City Smasher
Ragefire Ragefire
Charging War Boar Charging War Boar
Domri's Nodorog Domri's Nodorog
The Haunt of Hightower The Haunt of Hightower
Azorious Guildgate|GRN Azorius Guildgate|RNA
Gruul Guildgate|GRN Gruul Guildgate|RNA
Orzhov Guildgate|GRN Orzhov Guildgate|RNA
Rakdos Guildgate|GRN Rakdos Guildgate|RNA
Simic Guildgate|GRN Simic Guildgate|RNA

View File

@@ -2,8 +2,8 @@ Name:Dross Scorpion
ManaCost:4 ManaCost:4
Types:Artifact Creature Scorpion Types:Artifact Creature Scorpion
PT:3/1 PT:3/1
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Artifact.Creature+Other | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigUntap | TriggerDescription$ Whenever CARDNAME or another artifact creature dies, T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Artifact.Creature+Other | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigUntap | TriggerDescription$ Whenever CARDNAME or another artifact creature dies, you may untap target artifact.
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigUntap | TriggerDescription$ you may untap target artifact. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigUntap | Secondary$ True | TriggerDescription$ Whenever CARDNAME or another artifact creature dies, you may untap target artifact.
SVar:TrigUntap:DB$Untap | ValidTgts$ Artifact | TgtPrompt$ Choose target artifact. SVar:TrigUntap:DB$Untap | ValidTgts$ Artifact | TgtPrompt$ Choose target artifact.
SVar:Picture:http://www.wizards.com/global/images/magic/general/dross_scorpion.jpg SVar:Picture:http://www.wizards.com/global/images/magic/general/dross_scorpion.jpg
Oracle:Whenever Dross Scorpion or another artifact creature dies, you may untap target artifact. Oracle:Whenever Dross Scorpion or another artifact creature dies, you may untap target artifact.

View File

@@ -2,7 +2,7 @@ Name:Naban, Dean of Iteration
ManaCost:1 U ManaCost:1 U
Types:Legendary Creature Human Wizard Types:Legendary Creature Human Wizard
PT:2/1 PT:2/1
S:Mode$ Continuous | Affected$ You | AddKeyword$ Panharmonicon:Wizard.YouCtrl | Description$ If a Wizard entering the battlefield under your control causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time. K:Panharmonicon:Wizard.YouCtrl:If a Wizard entering the battlefield under your control causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time.
DeckHints:Type$Wizard DeckHints:Type$Wizard
SVar:Picture:http://www.wizards.com/global/images/magic/general/naban_dean_of_iteration.jpg SVar:Picture:http://www.wizards.com/global/images/magic/general/naban_dean_of_iteration.jpg
Oracle:If a Wizard entering the battlefield under your control causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time. Oracle:If a Wizard entering the battlefield under your control causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time.

View File

@@ -1,6 +1,6 @@
Name:Panharmonicon Name:Panharmonicon
ManaCost:4 ManaCost:4
Types:Artifact Types:Artifact
S:Mode$ Continuous | Affected$ You | AddKeyword$ Panharmonicon:Creature,Artifact | Description$ If an artifact or creature entering the battlefield causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time. K:Panharmonicon:Creature,Artifact:If an artifact or creature entering the battlefield causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time.
SVar:Picture:http://www.wizards.com/global/images/magic/general/panharmonicon.jpg SVar:Picture:http://www.wizards.com/global/images/magic/general/panharmonicon.jpg
Oracle:If an artifact or creature entering the battlefield causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time. Oracle:If an artifact or creature entering the battlefield causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time.

View File

@@ -1,8 +1,7 @@
Name:Raid Bombardment Name:Raid Bombardment
ManaCost:2 R ManaCost:2 R
Types:Enchantment Types:Enchantment
T:Mode$ Attacks | ValidCard$ Creature.powerLE2+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a creature you control with power 2 or less attacks, CARDNAME deals 1 damage to defending player. T:Mode$ Attacks | ValidCard$ Creature.powerLE2+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a creature you control with power 2 or less attacks, CARDNAME deals 1 damage to the player or planeswalker that creature is attacking
SVar:TrigDamage:DB$DealDamage | Defined$ TriggeredDefendingPlayer | NumDmg$ 1 SVar:TrigDamage:DB$DealDamage | Defined$ TriggeredDefender | NumDmg$ 1
SVar:PlayMain1:TRUE SVar:PlayMain1:TRUE
SVar:Picture:http://www.wizards.com/global/images/magic/general/raid_bombardment.jpg Oracle:Whenever a creature you control with power 2 or less attacks, Raid Bombardment deals 1 damage to the player or planeswalker that creature is attacking.
Oracle:Whenever a creature you control with power 2 or less attacks, Raid Bombardment deals 1 damage to defending player.

View File

@@ -3,6 +3,10 @@ ManaCost:2 R R
Types:Creature Elemental Types:Creature Elemental
PT:1/1 PT:1/1
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDig | TriggerDescription$ At the beginning of your upkeep, reveal cards from the top of your library until you reveal a creature card. Until your next turn, CARDNAME's base power becomes twice that card's power and its toughness. Put the revealed cards on the bottom of your library in a random order. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDig | TriggerDescription$ At the beginning of your upkeep, reveal cards from the top of your library until you reveal a creature card. Until your next turn, CARDNAME's base power becomes twice that card's power and its toughness. Put the revealed cards on the bottom of your library in a random order.
SVar:TrigDig:DB$ DigUntil | Valid$ Creature | ValidDescription$ creature card | FoundDestination$ Library | RevealedDestination$ Library | RevealedLibraryPosition$ -1 | RememberFound$ True | SubAbility$ DBAnimate SVar:TrigDig:DB$ DigUntil | Reveal$ True | Valid$ Creature | ValidDescription$ creature card | FoundDestination$ Exile | RevealedDestination$ Exile | RememberFound$ True | ImprintRevealed$ True | SubAbility$ DBAnimate
SVar:DBAnimate:DB$ Animate | Power$ X | Toughness$ Y SVar:DBAnimate:DB$ Animate | Power$ X | Toughness$ Y | SubAbility$ DBMovetoLib
SVar:DBMovetoLib:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered,Card.IsImprinted | Origin$ Exile | Destination$ Library | RandomOrder$ True | LibraryPosition$ -1 | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True
SVar:X:Remembered$CardPower/Times.2
SVar:Y:Remembered$CardToughness/Times.2
Oracle:At the beginning of your upkeep, reveal cards from the top of your library until you reveal a creature card. Until your next turn, Amplifire's base power becomes twice that card's power and its base toughness becomes twice that card's toughness. Put the revealed cards on the bottom of your library in a random order. Oracle:At the beginning of your upkeep, reveal cards from the top of your library until you reveal a creature card. Until your next turn, Amplifire's base power becomes twice that card's power and its base toughness becomes twice that card's toughness. Put the revealed cards on the bottom of your library in a random order.

View File

@@ -2,6 +2,7 @@ Name:Awaken the Erstwhile
ManaCost:3 B B ManaCost:3 B B
Types:Sorcery Types:Sorcery
A:SP$ RepeatEach | Cost$ 3 B B | RepeatPlayers$ Player | RepeatSubAbility$ DBDiscard | SpellDescription$ Each player discards all the cards in their hand, then creates that many 2/2 black Zombie creature tokens. A:SP$ RepeatEach | Cost$ 3 B B | RepeatPlayers$ Player | RepeatSubAbility$ DBDiscard | SpellDescription$ Each player discards all the cards in their hand, then creates that many 2/2 black Zombie creature tokens.
SVar:DBToken:DB$ Token | TokenAmount$ X | TokenName$ Zombie | TokenTypes$ Creature,Zombie | TokenOwner$ You | TokenColors$ Black | TokenPower$ 2 | TokenToughness$ 2 | References$ X SVar:DBToken:DB$ Token | TokenAmount$ X | TokenScript$ b_2_2_zombie | TokenOwner$ You | LegacyImage$ b 2 2 zombie rna | References$ X
SVar:X:Remembered$Amount SVar:X:Remembered$Amount
DeckHas:Ability$Token
Oracle:Each player discards all the cards in their hand, then creates that many 2/2 black Zombie creature tokens. Oracle:Each player discards all the cards in their hand, then creates that many 2/2 black Zombie creature tokens.

View File

@@ -3,7 +3,5 @@ ManaCost:2 B
Types:Creature Vampire Types:Creature Vampire
PT:3/1 PT:3/1
T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, you may sacrifice another creature. If you do, CARDNAME can't be blocked this turn. T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, you may sacrifice another creature. If you do, CARDNAME can't be blocked this turn.
SVar:TrigPump:AB$ Pump | Cost$ Sac<1/Creature.Other/another creature> | Defined$ Self | KW$ HIDDEN Unblockable | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ1 | SubAbility$ DBCleanup | References$ X SVar:TrigPump:AB$ Pump | Cost$ Sac<1/Creature.Other/another creature> | Defined$ Self | KW$ HIDDEN Unblockable
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:X:Remembered$Amount
Oracle:Whenever Bloodmist Infiltrator attacks, you may sacrifice another creature. If you do, Bloodmist Infiltrator can't be blocked this turn. Oracle:Whenever Bloodmist Infiltrator attacks, you may sacrifice another creature. If you do, Bloodmist Infiltrator can't be blocked this turn.

View File

@@ -1,3 +1,4 @@
# TODO: -- THIS SCRIPT NEEDS REWRITING (non-functional) --
Name:Captive Audience Name:Captive Audience
ManaCost:5 B R ManaCost:5 B R
Types:Enchantment Types:Enchantment
@@ -21,4 +22,5 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | E
SVar:TrigChoose:DB$ ChooseCard | Defined$ You | Choices$ Player.Opponent | Mandatory$ True | SubAbility$ DBChangeZone SVar:TrigChoose:DB$ ChooseCard | Defined$ You | Choices$ Player.Opponent | Mandatory$ True | SubAbility$ DBChangeZone
SVar:DBChangeZone:DB$ ChangeZone | Defined$ Self | Origin$ All | Destination$ Battlefield | GainControl$ True SVar:DBChangeZone:DB$ ChangeZone | Defined$ Self | Origin$ All | Destination$ Battlefield | GainControl$ True
SVar:RemRandomDeck:True SVar:RemRandomDeck:True
DeckHas:Ability$Token
Oracle:Captive Audience enters the battlefield under the control of an opponent of your choice.\nAt the beginning of your upkeep, choose one that hasn't been chosen —\n• Your life total becomes 4.\n• Discard your hand.\n• Each opponent creates five 2/2 black Zombie creature tokens. Oracle:Captive Audience enters the battlefield under the control of an opponent of your choice.\nAt the beginning of your upkeep, choose one that hasn't been chosen —\n• Your life total becomes 4.\n• Discard your hand.\n• Each opponent creates five 2/2 black Zombie creature tokens.

View File

@@ -0,0 +1,7 @@
Name:Cavalcade of Calamity
ManaCost:1 R
Types:Enchantment
T:Mode$ Attacks | ValidCard$ Creature.powerLE1+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a creature you control with power 1 or less attacks, CARDNAME deals 1 damage to the player or planeswalker that creature is attacking
SVar:TrigDamage:DB$DealDamage | Defined$ TriggeredDefender | NumDmg$ 1
SVar:PlayMain1:TRUE
Oracle:Whenever a creature you control with power 1 or less attacks, Cavalcade of Calamity deals 1 damage to the player or planeswalker that creature is attacking.

View File

@@ -0,0 +1,8 @@
Name:Charging War Boar
ManaCost:1 R G
Types:Creature Boar
PT:3/1
K:Haste
S:Mode$ Continuous | Affected$ Card.Self | AddKeyword$ Trample | AddPower$ 1 | AddToughness$ 1 | IsPresent$ Planeswalker.Domri+YouCtrl | Description$ As long as you control a Domri planeswalker, CARDNAME gets +1/+1 and has trample.
SVar:BuffedBy:Domri
Oracle:Haste (This creature can attack and {T} as soon as it comes under your control.)\nAs long as you control a Domri planeswalker, Charging War Boar gets +1/+1 and has trample. (It can deal excess damage to the player or planeswalker its attacking.)

View File

@@ -0,0 +1,8 @@
Name:Cindervines
ManaCost:R G
Types:Enchantment
T:Mode$ SpellCast | ValidCard$ Card.nonCreature | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigDealOneDamage | TriggerDescription$ Whenever an opponent casts a noncreature spell, CARDNAME deals 1 damage to that player.
SVar:TrigDealOneDamage:DB$DealDamage | Defined$ TriggeredActivator | NumDmg$ 1
A:AB$ Destroy | Cost$ 1 Sac<1/CARDNAME> | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | SubAbility$ DBDealTwoDamage | SpellDescription$ Destroy target artifact or enchantment. CARDNAME deals 2 damage to that permanents controller.
SVar:DBDealTwoDamage:DB$ DealDamage | Defined$ TargetedController | NumDmg$ 2
Oracle:Whenever an opponent casts a noncreature spell, Cindervines deals 1 damage to that player.\n{1}, Sacrifice Cindervines: Destroy target artifact or enchantment. Cindervines deals 2 damage to that permanents controller.

View File

@@ -0,0 +1,8 @@
Name:Clamor Shaman
ManaCost:2 R
Types:Creature Shaman
PT:1/1
K:Riot
T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigCanNotBlock | TriggerDescription$ Whenever CARDNAME attacks, target creature an opponent controls can't block this turn.
SVar:TrigCanNotBlock:DB$ Pump | ValidTgts$ Creature.OppCtrl | KW$ HIDDEN CARDNAME can't block. | TgtPrompt$ Select target creature an opponent controls | IsCurse$ True
Oracle:Riot (This creature enters the battlefield with your choice of a +1/+1 counter or haste.)\nWhenever Clamor Shaman attacks, target creature an opponent controls cant block this turn.

View File

@@ -11,8 +11,8 @@ ALTERNATE
Name:Consume Name:Consume
ManaCost:2 W B ManaCost:2 W B
Types:Sorcery Types:Sorcery
A:SP$ ChooseCard | Cost$ 2 W B | ValidTgts$ Player | Choices$ Creature.greatestPowerControlledByRemembered | Mandatory$ True | SubAbility$ DBSac A:SP$ Sacrifice | Cost$ 2 W B | ValidTgts$ Player | SacValid$ Creature.greatestPower+TargetedPlayerCtrl | RememberSacrificed$ True | SacMessage$ Creature with greatest power among creatures you control | SubAbility$ DBGainLife | SpellDescription$ Target player sacrifices a creature with the greatest power among creatures they control. You gain life equal to its power.
SVar:DBSac:DB$ Sacrifice | Defined$ Targeted | SacValid$ Card.ChosenCard | RememberSacrificed$ True | SacMessage$ the creature with the highest power | SubAbility$ DBGainLife SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ X | References$ X | SubAbility$ DBCleanup
SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ X | References$ X SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:X:TargetedLKI$CardPower SVar:X:RememberedLKI$CardPower
Oracle:Target player sacrifices a creature with the greatest power among creatures they control. You gain life equal to its power. Oracle:Target player sacrifices a creature with the greatest power among creatures they control. You gain life equal to its power.

View File

@@ -11,7 +11,8 @@ ALTERNATE
Name:Deploy Name:Deploy
ManaCost:2 W U ManaCost:2 W U
Types:Instant Types:Instant
A:SP$ Token | Cost$ 2 W U | TokenAmount$ 2 | TokenOwner$ You | TokenScript$ c_1_1_a_thopter_flying | SubAbility$ DBGainLife | SpellDescription$ Create two 1/1 colorless Thopter artifact creature tokens with flying, then you gain 1 life for each creature you control. A:SP$ Token | Cost$ 2 W U | TokenAmount$ 2 | TokenOwner$ You | TokenScript$ c_1_1_a_thopter_flying | LegacyImage$ c 1 1 a thopter flying rna | SubAbility$ DBGainLife | SpellDescription$ Create two 1/1 colorless Thopter artifact creature tokens with flying, then you gain 1 life for each creature you control.
SVar:DBGainLife:DB$ GainLife | LifeAmount$ X | References$ X SVar:DBGainLife:DB$ GainLife | LifeAmount$ X | References$ X
SVar:X:Count$TypeYouCtrl.Creature SVar:X:Count$TypeYouCtrl.Creature
DeckHas:Ability$Token
Oracle:Create two 1/1 colorless Thopter artifact creature tokens with flying, then you gain 1 life for each creature you control. Oracle:Create two 1/1 colorless Thopter artifact creature tokens with flying, then you gain 1 life for each creature you control.

View File

@@ -0,0 +1,9 @@
Name:Domri's Nodorog
ManaCost:3 R G
Types:Creature Beast
PT:5/2
K:Trample
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library and/or graveyard for a card named Domri, City Smasher, reveal it, and put it into your hand. If you search your library this way, shuffle it.
SVar:TrigSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedDomri; City Smasher | ChangeNum$ 1 | Optional$ True
DeckHints:Name$Domri, City Smasher
Oracle:Trample\nWhen Domris Nodorog enters the battlefield, you may search your library and/or graveyard for a card named Domri, City Smasher, reveal it, and put it into your hand. If you search your library this way, shuffle it.

View File

@@ -0,0 +1,11 @@
Name:Dovin, Architect of Law
ManaCost:4 W U
Types:Legendary Planeswalker Dovin
Loyalty:5
A:AB$ GainLife | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | Defined$ You | LifeAmount$ 2 | SubAbility$ DBDraw | SpellDescription$ You gain 2 life and draw a card.
SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1
A:AB$ Tap | Cost$ SubCounter<1/LOYALTY> | ValidTgts$ Creature | TgtPrompt$ Choose target creature to tap. | Planeswalker$ True | SubAbility$ DovinPump | SpellDescription$ Tap target creature. It doesn't untap during its controller's next untap step.
SVar:DovinPump:DB$ Pump | Defined$ Targeted | Permanent$ True | KW$ HIDDEN This card doesn't untap during your next untap step.
A:AB$ TapAll | Cost$ SubCounter<9/LOYALTY> | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | ValidCards$ Permanent | Planeswalker$ True | SubAbility$ NoUntap | SpellDescription$ Tap all permanents target opponent controls. That player skips their next untap step.
SVar:NoUntap:DB$ Pump | Defined$ TargetedPlayer | IsCurse$ True | KW$ Skip your next untap step. | Permanent$ True
Oracle:+1: You gain 2 life and draw a card.\n1: Tap target creature. It doesnt untap during its controllers next untap step.\n9: Tap all permanents target opponent controls. That player skips their next untap step.

View File

@@ -5,7 +5,7 @@ Loyalty:3
A:AB$ Effect | Cost$ AddCounter<1/LOYALTY> | Name$ CARDNAME Effect | Triggers$ TrigSpellCast | SVars$ TrigPutCounter | SpellDescription$ Until end of turn, whenever a creature you control deals combat damage to a player, put a loyalty counter on CARDNAME. A:AB$ Effect | Cost$ AddCounter<1/LOYALTY> | Name$ CARDNAME Effect | Triggers$ TrigSpellCast | SVars$ TrigPutCounter | SpellDescription$ Until end of turn, whenever a creature you control deals combat damage to a player, put a loyalty counter on CARDNAME.
SVar:X:Count$Valid Creature.YouCtrl SVar:X:Count$Valid Creature.YouCtrl
SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ LOYALTY | CounterNum$ 1 SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ LOYALTY | CounterNum$ 1
A:AB$ Token | Cost$ SubCounter<1/LOYALTY> | Planeswalker$ True | TokenAmount$ 1 | TokenName$ Thopter | TokenTypes$ Artifact,Creature,Thopter | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying | SubAbility$ DBGainLife | SpellDescription$ Create a 1/1 colorless Thopter artifact creature token with flying. A:AB$ Token | Cost$ SubCounter<1/LOYALTY> | Planeswalker$ True | TokenAmount$ 1 | TokenScript$ c_1_1_a_thopter_flying | TokenOwner$ You | LegacyImage$ c 1 1 a thopter flying rna | SubAbility$ DBGainLife | SpellDescription$ Create a 1/1 colorless Thopter artifact creature token with flying.
SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 | SpellDescription$ You gain 1 life. SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 | SpellDescription$ You gain 1 life.
DeckHas:Ability$Token DeckHas:Ability$Token
A:AB$ Dig | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | DigNum$ 10 | ChangeNum$ 3 | DestinationZone$ Hand | DestinationZone2$ Library | LibraryPosition$ -1 | Choices$ Card.nonLand | SpellDescription$ Look at the top ten cards of your library. Put three of them into your hand and the rest on the bottom of your library in a random order. A:AB$ Dig | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | DigNum$ 10 | ChangeNum$ 3 | DestinationZone$ Hand | DestinationZone2$ Library | LibraryPosition$ -1 | Choices$ Card.nonLand | SpellDescription$ Look at the top ten cards of your library. Put three of them into your hand and the rest on the bottom of your library in a random order.

View File

@@ -2,8 +2,10 @@ Name:Dovin's Acuity
ManaCost:1 W U ManaCost:1 W U
Types:Enchantment Types:Enchantment
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 2 life and draw a card. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 2 life and draw a card.
T:Mode$ SpellCast | ValidCard$ Instant | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerDescription$ Whenever you cast an instant spell during your main phase, you may return CARDNAME to its owner's hand.
SVar:TrigGainLife:DB$GainLife | Defined$ You | LifeAmount$ 2 | SubAbility$ DBDraw SVar:TrigGainLife:DB$GainLife | Defined$ You | LifeAmount$ 2 | SubAbility$ DBDraw
SVar:DBDraw:DB$Draw | Defined$ You | NumCards$ 1 SVar:DBDraw:DB$Draw | Defined$ You | NumCards$ 1
SVar:X:Count$IfMainPhase T:Mode$ SpellCast | ValidCard$ Instant | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | PlayerTurn$ True | CheckSVar$ X | SVarCompare$ GE1 | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerDescription$ Whenever you cast an instant spell during your main phase, you may return CARDNAME to its owner's hand.
SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | Defined$ Self
SVar:X:Count$IfMainPhase.1.0
DeckHas:Ability$LifeGain
Oracle:When Dovin's Acuity enters the battlefield, you gain 2 life and draw a card.\nWhenever you cast an instant spell during your main phase, you may return Dovin's Acuity to its owner's hand. Oracle:When Dovin's Acuity enters the battlefield, you gain 2 life and draw a card.\nWhenever you cast an instant spell during your main phase, you may return Dovin's Acuity to its owner's hand.

View File

@@ -0,0 +1,7 @@
Name:Dovin's Dismissal
ManaCost:2 W U
Types:Instant
A:SP$ ChangeZone | Cost$ 2 W U | ValidTgts$ Creature.tapped | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select target tapped creature | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 | SubAbility$ DBSearch | SpellDescription$ Put up to one target tapped creature on top of its owner's library. You may search your library and/or graveyard for a card named Dovin, Architect of Law, reveal it, and put it into your hand. If you search your library this way, shuffle it.
SVar:DBSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedDovin; Architect of Law | ChangeNum$ 1 | Optional$ True
DeckNeeds:Name$Dovin, Architect of Law
Oracle:Put up to one target tapped creature on top of its owners library. You may search your library and/or graveyard for a card named Dovin, Architect of Law, reveal it, and put it into your hand. If you search your library this way, shuffle it.

View File

@@ -0,0 +1,7 @@
Name:Elite Arrester
ManaCost:W
Types:Creature Human Soldier
PT:0/3
A:AB$ Tap | Cost$ 1 U T | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Tap target creature.
SVar:NonCombatPriority:5
Oracle:{1}{U}, {T}: Tap target creature.

View File

@@ -6,7 +6,7 @@ S:Mode$ Continuous | Affected$ Creature.OppCtrl | AddPower$ -1 | AddToughness$ -
SVar:PlayMain1:TRUE SVar:PlayMain1:TRUE
SVar:RemRandomDeck:True SVar:RemRandomDeck:True
A:AB$ ChangeZone | Cost$ 4 W B | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Card.OppOwn | SubAbility$ DBToken | SpellDescription$ Exile target card from an opponent's graveyard. If it was a creature card, you create a 1/1 white and black Spirit creature token with flying. A:AB$ ChangeZone | Cost$ 4 W B | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Card.OppOwn | SubAbility$ DBToken | SpellDescription$ Exile target card from an opponent's graveyard. If it was a creature card, you create a 1/1 white and black Spirit creature token with flying.
SVar:DBToken:DB$ Token | ConditionDefined$ Targeted | ConditionPresent$ Creature | ConditionCompare$ EQ1 | TokenAmount$ 1 | TokenScript$ wb_1_1_spirit_flying | TokenOwner$ You | SubAbility$ DBCleanup SVar:DBToken:DB$ Token | ConditionDefined$ Targeted | ConditionPresent$ Creature | ConditionCompare$ EQ1 | TokenAmount$ 1 | TokenScript$ wb_1_1_spirit_flying | TokenOwner$ You | SubAbility$ DBCleanup | LegacyImage$ wb 1 1 spirit flying rna
SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True
DeckHas:Ability$Token DeckHas:Ability$Token
Oracle:Creatures you control get +1/+1.\nCreatures your opponents control get -1/-1.\n{2}{W}{B}: Exile target card from an opponent's graveyard. If it was a creature card, you create a 1/1 white and black Spirit creature token with flying. Oracle:Creatures you control get +1/+1.\nCreatures your opponents control get -1/-1.\n{2}{W}{B}: Exile target card from an opponent's graveyard. If it was a creature card, you create a 1/1 white and black Spirit creature token with flying.

View File

@@ -1,6 +1,6 @@
Name:Final Payment Name:Final Payment
ManaCost:W B ManaCost:W B
Types:Instant Types:Instant
K:AlternateAdditionalCost:PayLife<5>:Sac<1/Creature,Enchantment> K:AlternateAdditionalCost:PayLife<5>:Sac<1/Creature;Enchantment/creature or enchantment>
A:SP$ Destroy | Cost$ W B | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Destroy target creature. A:SP$ Destroy | Cost$ W B | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Destroy target creature.
Oracle:As an additional cost to cast this spell, pay 5 life or sacrifice a creature or enchantment.\nDestroy target creature. Oracle:As an additional cost to cast this spell, pay 5 life or sacrifice a creature or enchantment.\nDestroy target creature.

View File

@@ -4,6 +4,8 @@ Types:Creature Human Shaman
PT:2/2 PT:2/2
K:Haste K:Haste
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigSacrifice | TriggerDescription$ At the beginning of your upkeep, you may sacrifice a creature. When you do, CARDNAME deals 2 damage to target opponent or planeswalker. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigSacrifice | TriggerDescription$ At the beginning of your upkeep, you may sacrifice a creature. When you do, CARDNAME deals 2 damage to target opponent or planeswalker.
SVar:TrigSacrifice:DB$ Sacrifice | Optional$ True | SacValid$ Creature | Amount$ 1 | AILogic$ CARDNAME SVar:TrigSacrifice:DB$ Sacrifice | Optional$ True | SacValid$ Creature | Amount$ 1 | RememberSacrificed$ True | SubAbility$ TrigImmediate
SVar:TrigDealDamage:DB$ DealDamage | ValidTgts$ Opponent,Planeswalker | TgtPrompt$ Select target opponent or planeswalker | NumDmg$ 2 SVar:TrigImmediate:DB$ ImmediateTrigger | Execute$ TrigDealDamage | ConditionDefined$ Remembered | ConditionPresent$ Creature | ConditionCompare$ GE1 | TriggerDescription$ When you do, CARDNAME deals 2 damage to target opponent or planeswalker.
SVar:TrigDealDamage:DB$ DealDamage | ValidTgts$ Opponent,Planeswalker | TgtPrompt$ Select target opponent or planeswalker | NumDmg$ 2 | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
Oracle:Haste\nAt the beginning of your upkeep, you may sacrifice a creature. When you do, Fireblade Artist deals 2 damage to target opponent or planeswalker. Oracle:Haste\nAt the beginning of your upkeep, you may sacrifice a creature. When you do, Fireblade Artist deals 2 damage to target opponent or planeswalker.

View File

@@ -0,0 +1,7 @@
Name:Footlight Fiend
ManaCost:BR
Types:Creature Devil
PT:1/1
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, it deals 1 damage to any target.
SVar:TrigDealDamage:DB$DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 1
Oracle:When Footlight Fiend dies, it deals 1 damage to any target.

View File

@@ -0,0 +1,8 @@
Name:Forbidding Spirit
ManaCost:1 W W
Types:Creature Spirit Cleric
PT:3/3
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TempAttackTax | TriggerDescription$ When CARDNAME enters the battlefield, until your next turn, creatures cant attack you or a planeswalker you control unless their controller pays {2} for each of those creatures.
SVar:TempAttackTax:DB$ Effect | Name$ Forbidding Spirit Effect | StaticAbilities$ TempoCantAttack | Duration$ UntilYourNextTurn | SpellDescription$ Until your next turn, creatures cant attack you or a planeswalker you control unless their controller pays {2} for each of those creatures.
SVar:TempoCantAttack:Mode$ CantAttackUnless | EffectZone$ Command | ValidCard$ Creature | Target$ You,Planeswalker.YouCtrl | Cost$ 2 | Description$ Until your next turn, creatures can't attack you or a planeswalker you control unless their controller pays {2} for each of those creatures.
Oracle:When Forbidding Spirit enters the battlefield, until your next turn, creatures cant attack you or a planeswalker you control unless their controller pays {2} for each of those creatures.

View File

@@ -0,0 +1,6 @@
Name:Get the Point
ManaCost:3 B R
Types:Instant
A:SP$ Destroy | Cost$ 3 B R | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ DBScry | SpellDescription$ Destroy target creature. Scry 1.
SVar:DBScry:DB$ Scry | ScryNum$ 1
Oracle:Destroy target creature. Scry 1.

View File

@@ -1,7 +1,7 @@
Name:Goblin Gathering Name:Goblin Gathering
ManaCost:2 R ManaCost:2 R
Types:Sorcery Types:Sorcery
A:SP$ Token | Cost$ 2 R | TokenAmount$ X | TokenScript$ r_1_1_goblin | TokenOwner$ You | References$ X | SpellDescription$ Create a number of 1/1 red Goblin creature tokens equal to two plus the number of cards named CARDNAME in your graveyard. A:SP$ Token | Cost$ 2 R | TokenAmount$ X | TokenScript$ r_1_1_goblin | LegacyImage$ r 1 1 goblin rna | TokenOwner$ You | References$ X | SpellDescription$ Create a number of 1/1 red Goblin creature tokens equal to two plus the number of cards named Goblin Gathering in your graveyard.
SVar:X:Count$ValidGraveyard Card.YouOwn+namedGoblin Gathering/Plus.2 SVar:X:Count$ValidGraveyard Card.YouOwn+namedGoblin Gathering/Plus.2
DeckHints:Name$Goblin Gathering DeckHints:Name$Goblin Gathering
DeckHas:Ability$Token DeckHas:Ability$Token

View File

@@ -3,7 +3,6 @@ ManaCost:B
Types:Creature Skeleton Warrior Types:Creature Skeleton Warrior
PT:2/1 PT:2/1
K:CARDNAME enters the battlefield tapped. K:CARDNAME enters the battlefield tapped.
A:AB$ ChangeZone | Cost$ 1 B | Origin$ Graveyard | Destination$ Hand | ActivationZone$ Graveyard | OpponentTurn$ True | SubAbility$ DBEffect | SpellDescription$ Return CARDNAME from your graveyard to your hand. Activate this ability only during your turn and only if an opponent lost life this turn. A:AB$ ChangeZone | Cost$ 1 B | Origin$ Graveyard | Destination$ Hand | ActivationZone$ Graveyard | PlayerTurn$ True | CheckSVar$ X | References$ X | SpellDescription$ Return CARDNAME from your graveyard to your hand. Activate this ability only during your turn and only if an opponent lost life this turn.
SVar:DBEffect:DB$ Effect | CheckSVar$ X | SVarCompare$ GE1 | References$ X | StaticAbilities$ MustAttack | SubAbility$ DBCleanup SVar:X:Count$LifeOppsLostThisTurn
SVar:RPrevent:Mode$ Continuous | EffectZone$ Command | Affected$ You | AddKeyword$ You only during your turn and only if an opponent lost life this turn. | Description$ Activate this ability only during your turn and only if an opponent
Oracle:Gutterbones enters the battlefield tapped.\n{1}{B}: Return Gutterbones from your graveyard to your hand. Activate this ability only during your turn and only if an opponent lost life this turn. Oracle:Gutterbones enters the battlefield tapped.\n{1}{B}: Return Gutterbones from your graveyard to your hand. Activate this ability only during your turn and only if an opponent lost life this turn.

View File

@@ -0,0 +1,8 @@
Name:Haazda Officer
ManaCost:2 W
Types:Creature Human Soldier
PT:3/2
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, target creature you control gets +1/+1 until end of turn.
SVar:TrigPump:DB$Pump | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | NumAtt$ 1 | NumDef$ 1
SVar:PlayMain1:TRUE
Oracle:When Haazda Officer enters the battlefield, target creature you control gets +1/+1 until end of turn.

View File

@@ -1,9 +1,9 @@
Name:Ill-Gotten Inheritance Name:Ill-Gotten Inheritance
ManaCost:3 B ManaCost:3 B
Types:Enchantment Types:Enchantment
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDamageAll | TriggerDescription$ At the beginning of your upkeep, CARDNAME deals 1 damage to each opponent and you gain 1 life. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ At the beginning of your upkeep, CARDNAME deals 1 damage to each opponent and you gain 1 life.
SVar:TrigDealDamage:DB$ DamageAll | ValidPlayers$ Player.Opponent | NumDmg$ 1 | SubAbility$ DBGainLife SVar:TrigDealDamage:DB$ DamageAll | ValidPlayers$ Player.Opponent | NumDmg$ 1 | SubAbility$ DBGainOneLife
SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 SVar:DBGainOneLife:DB$ GainLife | Defined$ You | LifeAmount$ 1
A:AB$ DealDamage | Cost$ 5 B Sac<1/CARDNAME> | ValidTgts$ Opponent | NumDmg$ 4 | SubAbility$ DBGainLife | SpellDescription$ CARDNAME deals 4 damage to target opponent and you gain 4 life. A:AB$ DealDamage | Cost$ 5 B Sac<1/CARDNAME> | ValidTgts$ Opponent | NumDmg$ 4 | SubAbility$ DBGainFourLife | SpellDescription$ CARDNAME deals 4 damage to target opponent and you gain 4 life.
SVar:DBGainLife:DB$GainLife | LifeAmount$ 4 SVar:DBGainFourLife:DB$GainLife | Defined$ You | LifeAmount$ 4
Oracle:At the beginning of your upkeep, Ill-Gotten Inheritance deals 1 damage to each opponent and you gain 1 life.\n{5}{B}, Sacrifice Ill-Gotten Inheritance: It deals 4 damage to target opponent and you gain 4 life. Oracle:At the beginning of your upkeep, Ill-Gotten Inheritance deals 1 damage to each opponent and you gain 1 life.\n{5}{B}, Sacrifice Ill-Gotten Inheritance: It deals 4 damage to target opponent and you gain 4 life.

View File

@@ -11,6 +11,6 @@ ALTERNATE
Name:Incongruity Name:Incongruity
ManaCost:1 G U ManaCost:1 G U
Types:Instant Types:Instant
A:AB$ ChangeZone | Cost$ 1 G U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Exile | SubAbility$ DBToken | SpellDescription$ Exile target creature. That creatures controller creates a 3/3 green Frog Lizard creature token. A:SP$ ChangeZone | Cost$ 1 G U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Exile | SubAbility$ DBToken | SpellDescription$ Exile target creature. That creatures controller creates a 3/3 green Frog Lizard creature token.
SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenOwner$ TargetedController | TokenScript$ g_3_3_frog_lizard SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenOwner$ TargetedController | TokenScript$ g_3_3_frog_lizard
Oracle:Exile target creature. That creatures controller creates a 3/3 green Frog Lizard creature token. Oracle:Exile target creature. That creatures controller creates a 3/3 green Frog Lizard creature token.

View File

@@ -10,4 +10,5 @@ A:AB$ ChangeZone | Cost$ -1/-1/Card.nonLand/nonland permanent with converted man
A:AB$ DealDamage | Cost$ PayLife<5/-5/Card> | Planeswalker$ True | Ultimate$ True | ValidTgts$ Player | NumDmg$ X | References$ X | SubAbility$ DBYouGainLife | SpellDescription$ CARDNAME deals damage to target player equal to the number of cards that player owns in exile and you gain that much life. A:AB$ DealDamage | Cost$ PayLife<5/-5/Card> | Planeswalker$ True | Ultimate$ True | ValidTgts$ Player | NumDmg$ X | References$ X | SubAbility$ DBYouGainLife | SpellDescription$ CARDNAME deals damage to target player equal to the number of cards that player owns in exile and you gain that much life.
SVar:DBYouGainLife:DB$ GainLife | Defined$ You | LifeAmount$ X | References$ X SVar:DBYouGainLife:DB$ GainLife | Defined$ You | LifeAmount$ X | References$ X
SVar:X:TargetedPlayer$CardsInExile SVar:X:TargetedPlayer$CardsInExile
DeckHas:Ability$LifeGain
Oracle:[+1]: Exile up to two target cards from a single graveyard. You gain 2 life if at least one creature card was exiled this way.\n[-1]: Exile target nonland permanent with converted mana cost 1 or less.\n[-5]: Kaya, Orzhov Usurper deals damage to target player equal to the number of cards that player owns in exile and you gain that much life. Oracle:[+1]: Exile up to two target cards from a single graveyard. You gain 2 life if at least one creature card was exiled this way.\n[-1]: Exile target nonland permanent with converted mana cost 1 or less.\n[-5]: Kaya, Orzhov Usurper deals damage to target player equal to the number of cards that player owns in exile and you gain that much life.

View File

@@ -4,4 +4,5 @@ Types:Sorcery
A:SP$ DestroyAll | Cost$ W W B B | ValidCards$ Creature | RememberDestroyed$ True | SubAbility$ DBGainLife | SpellDescription$ Destroy all creatures. You gain life equal to the number of creatures you controlled that were destroyed this way. A:SP$ DestroyAll | Cost$ W W B B | ValidCards$ Creature | RememberDestroyed$ True | SubAbility$ DBGainLife | SpellDescription$ Destroy all creatures. You gain life equal to the number of creatures you controlled that were destroyed this way.
SVar:DBGainLife:DB$ GainLife | LifeAmount$ X | References$ X SVar:DBGainLife:DB$ GainLife | LifeAmount$ X | References$ X
SVar:X:RememberedLKI$FilterControlledByRemembered_Number$1 SVar:X:RememberedLKI$FilterControlledByRemembered_Number$1
DeckHas:Ability$LifeGain
Oracle:Destroy all creatures. You gain life equal to the number of creatures you controlled that were destroyed this way. Oracle:Destroy all creatures. You gain life equal to the number of creatures you controlled that were destroyed this way.

View File

@@ -2,7 +2,7 @@ Name:Knight of the Last Breath
ManaCost:5 W B ManaCost:5 W B
Types:Creature Giant Knight Types:Creature Giant Knight
PT:4/4 PT:4/4
A:AB$ Token | Cost$ 3 Sac<1/Creature.nonToken+Other/another creature> | TokenAmount$ 1 | TokenScript$ wb_1_1_spirit_flying | TokenOwner$ You | SpellDescription$ Create a 1/1 white and black Spirit creature token with flying. A:AB$ Token | Cost$ 3 Sac<1/Creature.nonToken+Other/another creature> | TokenAmount$ 1 | TokenScript$ wb_1_1_spirit_flying | TokenOwner$ You | LegacyImage$ wb 1 1 spirit flying rna | SpellDescription$ Create a 1/1 white and black Spirit creature token with flying.
SVar:RemRandomDeck:True SVar:RemRandomDeck:True
K:Afterlife:3 K:Afterlife:3
SVar:AIPreference:SacCost$Creature.cmcLE1 SVar:AIPreference:SacCost$Creature.cmcLE1

View File

@@ -0,0 +1,8 @@
Name:Lawmage's Binding
ManaCost:1 W U
Types:Enchantment Aura
K:Flash
K:Enchant creature
A:SP$ Attach | Cost$ 1 W U | ValidTgts$ Creature | AILogic$ Curse
S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddHiddenKeyword$ CARDNAME can't attack or block. & CARDNAME's activated abilities can't be activated. | Description$ Enchanted creature can't attack or block and its activated abilities can't be activated.
Oracle:Flash\nEnchant creature\nEnchanted creature can't attack or block, and its activated abilities can't be activated.

View File

@@ -3,11 +3,21 @@ ManaCost:4 W
Types:Creature Beast Types:Creature Beast
PT:4/5 PT:4/5
K:Vigilance K:Vigilance
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile any number of other nontoken creatures you control until it leaves the battlefield. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ DBChooseExile | TriggerDescription$ When CARDNAME enters the battlefield, exile any number of other nontoken creatures you control until it leaves the battlefield.
SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | ChangeType$ Creature.nonToken+Other+YouCtrl | TargetMin$ 0 | TargetMax$ X | References$ X | Mandatory$ True | SubAbility$ DBEffect SVar:DBChooseExile:DB$ ChooseCard | Defined$ You | MinAmount$ 0 | Amount$ MaxTgts | References$ MaxTgts | Choices$ Creature.nonToken+Other+YouCtrl | ChoiceTitle$ Choose any number of other nontoken creatures you control | ChoiceZone$ Battlefield | SubAbility$ TrigExile
SVar:DBEffect:DB$ Effect | Triggers$ ComeBack | RememberObjects$ Remembered | ImprintCards$ Remembered | SVars$ TrigReturn,ExileSelf | ConditionPresent$ Card.IsRemembered | ConditionCompare$ GE1 SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | Defined$ ChosenCard | SubAbility$ DBEffect
SVar: SVar:DBEffect:DB$ Effect | Triggers$ ComeBack | RememberObjects$ RememberedCard | ImprintCards$ Self | SVars$ TrigReturn,ExileSelf | ConditionPresent$ Card.Self | Duration$ Permanent | ForgetOnMoved$ Exile | SubAbility$ DBCleanup
SVar:ComeBack:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.IsImprinted | Execute$ TrigReturn | TriggerZones$ Command | TriggerController$ TriggeredCardController | Static$ True | TriggerDescription$ That creature is exiled until EFFECTSOURCE leaves the battlefield
SVar:TrigReturn:DB$ ChangeZoneAll | Origin$ Exile | Destination$ Battlefield | ChangeType$ Card.IsRemembered | SubAbility$ ExileSelf
SVar:ExileSelf:DB$ ChangeZone | Origin$ Command | Destination$ Exile | Defined$ Self
SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True
S:Mode$ Continuous | Affected$ Card.Self | AddPower$ X | AddToughness$ X | References$ X | Description$ CARDNAME gets +2/+2 for each card exiled with it. S:Mode$ Continuous | Affected$ Card.Self | AddPower$ X | AddToughness$ X | References$ X | Description$ CARDNAME gets +2/+2 for each card exiled with it.
SVar:X:Count$Valid Card.IsRemembered+namedCARDNAME/Times.2 #Triggers to forget remembered on this
T:Mode$ ChangesZone | ValidCard$ Card.IsRemembered | Origin$ Exile | Destination$ Any | TriggerZones$ Battlefield | Static$ True | Execute$ TrigForget
SVar:TrigForget:DB$ Pump | ForgetObjects$ TriggeredCard
T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Any | Static$ True | Execute$ TrigForgetAll
SVar:TrigForgetAll:DB$ Cleanup | ClearRemembered$ True
SVar:X:Count$ValidExile Card.IsRemembered+ExiledWithSource/Times.2
SVar:MaxTgts:Count$Valid Creature.nonToken+Other+YouCtrl
SVar:RemRandomDeck:True SVar:RemRandomDeck:True
Oracle:Vigilance\nWhen Lumbering Battlement enters the battlefield, exile any number of other nontoken creatures you control until it leaves the battlefield.\nLumbering Battlement gets +2/+2 for each card exiled with it. Oracle:Vigilance\nWhen Lumbering Battlement enters the battlefield, exile any number of other nontoken creatures you control until it leaves the battlefield.\nLumbering Battlement gets +2/+2 for each card exiled with it.

View File

@@ -3,10 +3,12 @@ ManaCost:3 U U
Types:Creature Octopus Types:Creature Octopus
PT:4/5 PT:4/5
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create two 0/2 blue Illusion creature tokens with flying, it doesn't untap during its controller's next untap step. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create two 0/2 blue Illusion creature tokens with flying, it doesn't untap during its controller's next untap step.
SVar:TrigToken:DB$ Token | TokenAmount$ 2 | TokenName$ Illusion | TokenTypes$ Creature,Illusion | TokenOwner$ You | TokenColors$ Blue | TokenPower$ 0 | TokenToughness$ 2 | TokenKeywords$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True SVar:TrigToken:DB$ Token | TokenAmount$ 2 | TokenScript$ u_0_2_illusion_mesmerize | TokenOwner$ You | LegacyImage$ u 0 2 illusion mesmerize rna
SVar:PlayMain1:TRUE SVar:PlayMain1:TRUE
SVar:RemRandomDeck:True SVar:RemRandomDeck:True
S:Mode$ Continuous | Affected$ Card.Self | AddKeyword$ Hexproof | CheckSVar$ X | SVarCompare$ GE1 | Description$ CARDNAME has hexproof as long as you control an Illusion. S:Mode$ Continuous | Affected$ Card.Self | AddKeyword$ Hexproof | CheckSVar$ X | SVarCompare$ GE1 | Description$ CARDNAME has hexproof as long as you control an Illusion.
SVar:X:Count$Valid Illusion.YouCtrl SVar:X:Count$Valid Illusion.YouCtrl
SVar:BuffedBy:Illusion SVar:BuffedBy:Illusion
DeckHas:Ability$Token
DeckHints:Type$Illusion
Oracle:When Mesmerizing Benthid enters the battlefield, create two 0/2 blue Illusion creature tokens with "Whenever this creature blocks a creature, that creature doesn't untap during its controller's next untap step."\nMesmerizing Benthid has hexproof as long as you control an Illusion. Oracle:When Mesmerizing Benthid enters the battlefield, create two 0/2 blue Illusion creature tokens with "Whenever this creature blocks a creature, that creature doesn't untap during its controller's next untap step."\nMesmerizing Benthid has hexproof as long as you control an Illusion.

View File

@@ -5,4 +5,5 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creatu
SVar:TrigFlipACoin:DB$FlipACoin | FlipUntilYouLose$ True | SaveNumFlipsToSVar$ MirrorAmount | NoCall$ True | LoseSubAbility$ DBCopies SVar:TrigFlipACoin:DB$FlipACoin | FlipUntilYouLose$ True | SaveNumFlipsToSVar$ MirrorAmount | NoCall$ True | LoseSubAbility$ DBCopies
SVar:DBCopies:DB$ CopyPermanent | PumpKeywords$ Haste | AtEOT$ Exile | Defined$ TriggeredCard | NumCopies$ MirrorAmount SVar:DBCopies:DB$ CopyPermanent | PumpKeywords$ Haste | AtEOT$ Exile | Defined$ TriggeredCard | NumCopies$ MirrorAmount
SVar:MirrorAmount:Number$0 SVar:MirrorAmount:Number$0
DeckHas:Ability$Token
Oracle:Whenever a nontoken creature enters the battlefield under your control, flip a coin until you lose a flip. For each flip you won, create a token that's a copy of that creature. Those tokens gain haste. Exile them at the beginning of the next end step. Oracle:Whenever a nontoken creature enters the battlefield under your control, flip a coin until you lose a flip. For each flip you won, create a token that's a copy of that creature. Those tokens gain haste. Exile them at the beginning of the next end step.

View File

@@ -1,6 +1,6 @@
Name:Precognitive Perception Name:Precognitive Perception
ManaCost:3 U U ManaCost:3 U U
Types:Instant Types:Instant
A:SP$ Scry | Cost$ 3 U U | NumCards$ 3 | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | SubAbility$ DBDraw | SpellDescription$ Draw three cards.\nAddendum — If you cast this spell during your main phase, instead scry 3, then draw three cards. A:SP$ Scry | Cost$ 3 U U | ScryNum$ 3 | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | SubAbility$ DBDraw | SpellDescription$ Draw three cards.\nAddendum — If you cast this spell during your main phase, instead scry 3, then draw three cards.
SVar:DBDraw:DB$ Draw | Cost$ 3 U U | NumCards$ 3 SVar:DBDraw:DB$ Draw | Cost$ 3 U U | NumCards$ 3
Oracle:Draw three cards.\nAddendum — If you cast this spell during your main phase, instead scry 3, then draw three cards. Oracle:Draw three cards.\nAddendum — If you cast this spell during your main phase, instead scry 3, then draw three cards.

View File

@@ -7,5 +7,6 @@ K:Trample
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigFlip | TriggerDescription$ When CARDNAME enters the battlefield, flip a coin for each creature that isn't a Demon, Dragons, or coins. Destroy each creature whose coin comes up tails. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigFlip | TriggerDescription$ When CARDNAME enters the battlefield, flip a coin for each creature that isn't a Demon, Dragons, or coins. Destroy each creature whose coin comes up tails.
SVar:TrigFlip:DB$ FlipACoin | FlipUntilYouLose$ True | SaveNumFlipsToSVar$ X | LoseSubAbility$ DBDestroy SVar:TrigFlip:DB$ FlipACoin | FlipUntilYouLose$ True | SaveNumFlipsToSVar$ X | LoseSubAbility$ DBDestroy
SVar:DBDestroy:DB$ DestroyAll | ValidCards$ Creature.IsNotChosenType | References$ X SVar:DBDestroy:DB$ DestroyAll | ValidCards$ Creature.IsNotChosenType | References$ X
# TODO: -- THIS LINE NEEDS FIXING (doesn't reference the types correctly) --
SVar:X:Count$Valid Creature.isn SVar:X:Count$Valid Creature.isn
Oracle:Flying, trample\nWhen Rakdos, the Showstopper enters the battlefield, flip a coin for each creature that isn't a Demon, Devil, or Imp. Destroy each creature whose coin comes up tails. Oracle:Flying, trample\nWhen Rakdos, the Showstopper enters the battlefield, flip a coin for each creature that isn't a Demon, Devil, or Imp. Destroy each creature whose coin comes up tails.

View File

@@ -12,4 +12,5 @@ Name:Replicate
ManaCost:1 G U ManaCost:1 G U
Types:Sorcery Types:Sorcery
A:SP$ CopyPermanent | Cost$ 1 G U | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | SpellDescription$ Create a token that's a copy of target creature you control. A:SP$ CopyPermanent | Cost$ 1 G U | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | SpellDescription$ Create a token that's a copy of target creature you control.
DeckHas:Ability$Token
Oracle:Create a token thats a copy of target creature you control. Oracle:Create a token thats a copy of target creature you control.

View File

@@ -2,11 +2,10 @@ Name:Rix Maadi Reveler
ManaCost:1 R ManaCost:1 R
Types:Creature Human Shaman Types:Creature Human Shaman
PT:2/2 PT:2/2
K:Flying K:Spectacle:2 B R
K:Morph:2 B R T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, discard a card, then draw a card. If CARDNAME's spectacle cost was paid, instead discard your hand, then draw three cards.
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, discard a card, then draw a card. If CARDNAME's Goblin cost was paid, instead discard your hand, then draw three cards. SVar:TrigDiscard:DB$ Discard | NumCards$ 1 | Mode$ TgtChoose | SubAbility$ DBDrawOne | ConditionDefined$ TriggeredCard | ConditionPresent$ Card.spectacle | ConditionCompare$ EQ0
SVar:TrigDiscard:DB$ Discard | NumCards$ 1 | Mode$ TgtChoose | SubAbility$ DBDraw SVar:DBDrawOne:DB$ Draw | Defined$ You | NumCards$ 1 | ConditionDefined$ TriggeredCard | ConditionPresent$ Card.spectacle | ConditionCompare$ EQ0 | SubAbility$ DBDiscard
SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 3 | SubAbility$ DBDiscard SVar:DBDiscard:DB$ Discard | Mode$ Hand | Defined$ You | SubAbility$ DBDrawThree | ConditionDefined$ TriggeredCard | ConditionPresent$ Card.spectacle
SVar:DBDiscard:DB$ Discard | Mode$ Hand | Defined$ You | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ1 | References$ X | SubAbility$ DBDraw SVar:DBDrawThree:DB$ Draw | Defined$ You | NumCards$ 3 | ConditionDefined$ TriggeredCard | ConditionPresent$ Card.spectacle
SVar:DBDraw
Oracle:Spectacle {2}{B}{R} (You may cast this spell for its spectacle cost rather than its mana cost if an opponent lost life this turn.)\nWhen Rix Maadi Reveler enters the battlefield, discard a card, then draw a card. If Rix Maadi Reveler's spectacle cost was paid, instead discard your hand, then draw three cards. Oracle:Spectacle {2}{B}{R} (You may cast this spell for its spectacle cost rather than its mana cost if an opponent lost life this turn.)\nWhen Rix Maadi Reveler enters the battlefield, discard a card, then draw a card. If Rix Maadi Reveler's spectacle cost was paid, instead discard your hand, then draw three cards.

View File

@@ -0,0 +1,6 @@
Name:Rubble Slinger
ManaCost:2 RG
Types:Creature Human Warrior
PT:2/3
K:Reach
Oracle:Reach

View File

@@ -0,0 +1,6 @@
Name:Rubblebelt Runner
ManaCost:1 R G
Types:Creature Viashino Warrior
PT:3/3
K:CantBeBlockedBy Creature.token
Oracle:Rubblebelt Runner cant be blocked by creature tokens.

View File

@@ -5,4 +5,5 @@ PT:6/6
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigEffect | TriggerDescription$ When CARDNAME enters the battlefield, your number of +1/+1 counters on creatures you control. Creatures your opponents control with power less than or equal to that number can't block this turn. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigEffect | TriggerDescription$ When CARDNAME enters the battlefield, your number of +1/+1 counters on creatures you control. Creatures your opponents control with power less than or equal to that number can't block this turn.
SVar:TrigEffect:DB$Effect | Name$ CARDNAME Effect | StaticAbilities$ KWPump SVar:TrigEffect:DB$Effect | Name$ CARDNAME Effect | StaticAbilities$ KWPump
SVar:KWPump:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.YouCtrl+powerLTY | AddHiddenKeyword$ CARDNAME can't block. | Description$ Creatures your opponents control with power less than or equal to that number can't block this turn. SVar:KWPump:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.YouCtrl+powerLTY | AddHiddenKeyword$ CARDNAME can't block. | Description$ Creatures your opponents control with power less than or equal to that number can't block this turn.
# TODO: -- THIS SCRIPT NEEDS FIXING (doesn't have the count var) --
Oracle:When Rumbling Ruin enters the battlefield, count the number of +1/+1 counters on creatures you control. Creatures your opponents control with power less than or equal to that number can't block this turn. Oracle:When Rumbling Ruin enters the battlefield, count the number of +1/+1 counters on creatures you control. Creatures your opponents control with power less than or equal to that number can't block this turn.

View File

@@ -0,0 +1,7 @@
Name:Screaming Shield
ManaCost:1
Types:Artifact Equipment
K:Equip:3
S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddToughness$ 3 | AddAbility$ Mill | Description$ Equipped creature gets +0/+3 and has "{2}, {T}: Target player puts the top three cards of their library into their graveyard."
SVar:Mill:AB$ Mill | Cost$ 2 T | NumCards$ 3 | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ Target player puts the top three cards of their library into their graveyard.
Oracle:Equipped creature gets +0/+3 and has "{2}, {T}: Target player puts the top three cards of their library into their graveyard."\nEquip {3} ({3}: Attach to target creature you control. Equip only as a sorcery.)

View File

@@ -0,0 +1,8 @@
Name:Scuttlegator
ManaCost:4 GU GU
Types:Creature Crab Turtle Crocodile
PT:6/6
K:Defender
K:Adapt:3:6 GU GU
S:Mode$ Continuous | Affected$ Card.Self+counters_GE1_P1P1 | AddHiddenKeyword$ CARDNAME can attack as though it didn't have defender. | Description$ As long as CARDNAME has a +1/+1 counter on it, it can attack as though it didnt have defender.
Oracle:Defender\n{6}{G/U}{G/U}: Adapt 3. (If this creature has no +1/+1 counters on it, put two +1/+1 counters on it.)\nAs long as Scuttlegator has a +1/+1 counter on it, it can attack as though it didnt have defender.

View File

@@ -0,0 +1,8 @@
Name:Senate Griffin
ManaCost:2 UW UW
Types:Creature Griffin
PT:3/2
K:Flying
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ DBScry | TriggerDescription$ When CARDNAME etners the battlefield, scry 1.
SVar:DBScry:DB$ Scry | ScryNum$ 1
Oracle:Flying.\nWhen Senate Griffin enters the battlefield, scry 1.

View File

@@ -5,6 +5,6 @@ K:Flash
K:Enchant creature K:Enchant creature
A:SP$ Attach | Cost$ 1 W | ValidTgts$ Creature | AILogic$ Pump A:SP$ Attach | Cost$ 1 W | ValidTgts$ Creature | AILogic$ Pump
S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 1 | AddToughness$ 2 | AddKeyword$ Vigilance | Description$ Enchanted creature gets +1/+2 and has vigilance. S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 1 | AddToughness$ 2 | AddKeyword$ Vigilance | Description$ Enchanted creature gets +1/+2 and has vigilance.
T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigPump | Condition$ Main1 | TriggerDescription$ When CARDNAME enters the battlefield, if you cast it during your main phase, enchanted creature gains lifelink until end of turn. T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigPump | Condition$ Main1,Main2 | TriggerDescription$ When CARDNAME enters the battlefield, if you cast it during your main phase, enchanted creature gains lifelink until end of turn.
SVar:TrigPump:DB$ Pump | Defined$ Enchanted | KW$ SVar:TrigPump:DB$ Pump | Defined$ Enchanted | KW$ Lifelink
Oracle:Flash\nEnchant creature\nEnchanted creature gets +1/+2 and has vigilance.\nAddendum — When Sentinel's Mark enters the battlefield, if you cast it during your main phase, enchanted creature gains lifelink until end of turn. Oracle:Flash\nEnchant creature\nEnchanted creature gets +1/+2 and has vigilance.\nAddendum — When Sentinel's Mark enters the battlefield, if you cast it during your main phase, enchanted creature gains lifelink until end of turn.

View File

@@ -1,5 +1,5 @@
Name:Shimmer of Possibility Name:Shimmer of Possibility
ManaCost:1 U ManaCost:1 U
Types:Sorcery Types:Sorcery
A:SP$ Dig | Cost$ 1 U | DigNum$ 4 | ChangeNum$ 1 | SpellDescription$ Look at the top four cards of your library. Put one of them into your hand and the rest on the bottom of your library in a random order. A:SP$ Dig | Cost$ 1 U | DigNum$ 4 | ChangeNum$ 1 | RestRandomOrder$ True | SpellDescription$ Look at the top four cards of your library. Put one of them into your hand and the rest on the bottom of your library in a random order.
Oracle:Look at the top four cards of your library. Put one of them into your hand and the rest on the bottom of your library in a random order. Oracle:Look at the top four cards of your library. Put one of them into your hand and the rest on the bottom of your library in a random order.

View File

@@ -2,5 +2,6 @@ Name:Silhana Wayfinder
ManaCost:1 G ManaCost:1 G
Types:Creature Elf Scout Types:Creature Elf Scout
PT:2/1 PT:2/1
SVar:DBDig:DB$ Dig | DigNum$ 4 | ChangeNum$ 1 | Optional$ True | ChangeValid$ Creature,Land | ForceRevealToController$ True | DestinationZone$ Library | LibraryPosition$ -1 | RestRandomOrder$ True | ForceRevealToController$ True T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDig | TriggerDescription$ When CARDNAME enters the battlefield, look at the top four cards of your library. You may reveal a creature or land card from among them and put it on top of your library. Put the rest on the bottom of your library in a random order.
SVar:TrigDig:DB$ Dig | DigNum$ 4 | ChangeNum$ 1 | Optional$ True | ChangeValid$ Creature,Land | ForceRevealToController$ True | DestinationZone$ Library | LibraryPosition$ 0 | RestRandomOrder$ True | ForceRevealToController$ True
Oracle:When Silhana Wayfinder enters the battlefield, look at the top four cards of your library. You may reveal a creature or land card from among them and put it on top of your library. Put the rest on the bottom of your library in a random order. Oracle:When Silhana Wayfinder enters the battlefield, look at the top four cards of your library. You may reveal a creature or land card from among them and put it on top of your library. Put the rest on the bottom of your library in a random order.

View File

@@ -2,7 +2,7 @@ Name:Simic Locket
ManaCost:3 ManaCost:3
Types:Artifact Types:Artifact
A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}.
A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}.
AI:RemoveDeck:Random AI:RemoveDeck:Random
DeckNeeds:Color$Green | Blue DeckNeeds:Color$Green | Blue
A:AB$ Draw | Cost$ GU GU GU GU T Sac<1/CARDNAME> | NumCards$ 2 | SpellDescription$ Draw two cards. A:AB$ Draw | Cost$ GU GU GU GU T Sac<1/CARDNAME> | NumCards$ 2 | SpellDescription$ Draw two cards.

View File

@@ -2,5 +2,5 @@ Name:Smelt-Ward Ignus
ManaCost:1 R ManaCost:1 R
Types:Creature Elemental Types:Creature Elemental
PT:2/1 PT:2/1
A:AB$ GainControl | Cost$ 2 R Sac<1/CARDNAME> | ValidTgts$ Creature.powerLE3 | TgtPrompt$ Select target creature with power 3 or less | Untap$ True | AddKWs$ Haste | SorcerySpeed$ True | SpellDescription$ Gain control of target creature with power 3 or less until end of turn. Untap that creature. It gains haste until end of turn. Activate this ability only any time you could cast a sorcery. A:AB$ GainControl | Cost$ 2 R Sac<1/CARDNAME> | ValidTgts$ Creature.powerLE3 | LoseControl$ EOT | TgtPrompt$ Select target creature with power 3 or less | Untap$ True | AddKWs$ Haste | SorcerySpeed$ True | SpellDescription$ Gain control of target creature with power 3 or less until end of turn. Untap that creature. It gains haste until end of turn. Activate this ability only any time you could cast a sorcery.
Oracle:{2}{R}, Sacrifice Smelt-Ward Ignus: Gain control of target creature with power 3 or less until end of turn. Untap that creature. It gains haste until end of turn. Activate this ability only any time you could cast a sorcery. Oracle:{2}{R}, Sacrifice Smelt-Ward Ignus: Gain control of target creature with power 3 or less until end of turn. Untap that creature. It gains haste until end of turn. Activate this ability only any time you could cast a sorcery.

View File

@@ -2,6 +2,6 @@ Name:Smothering Tithe
ManaCost:3 W ManaCost:3 W
Types:Enchantment Types:Enchantment
T:Mode$ Drawn | ValidCard$ Card.OppOwn | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever an opponent draws a card, that player may pay {2}. If the player doesn't, you create a colorless Treasure artifact token with flying{T}, Sacrifice this artifact: Add one mana of any color. T:Mode$ Drawn | ValidCard$ Card.OppOwn | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever an opponent draws a card, that player may pay {2}. If the player doesn't, you create a colorless Treasure artifact token with flying{T}, Sacrifice this artifact: Add one mana of any color.
SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenName$ Treasure | TokenTypes$ Artifact,Treasure | TokenOwner$ TriggeredPlayer | TokenColors$ Colorless | TokenImage$ c treasure | TokenAbilities$ ABTreasureMana | TokenAltImages$ c_treasure2,c_treasure3,c_treasure4 SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_treasure_sac | TokenOwner$ TriggeredPlayer | LegacyImage$ c treasure
SVar:ABTreasureMana:DB$ Token | TokenAmount$ 1 | TokenName$ DeckHas:Ability$Token
Oracle:Whenever an opponent draws a card, that player may pay {2}. If the player doesn't, you create a colorless Treasure artifact token with "{T}, Sacrifice this artifact: Add one mana of any color." Oracle:Whenever an opponent draws a card, that player may pay {2}. If the player doesn't, you create a colorless Treasure artifact token with "{T}, Sacrifice this artifact: Add one mana of any color."

View File

@@ -6,7 +6,7 @@ K:Spectacle:1 B B
K:Flying K:Flying
K:Trample K:Trample
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDmg | TriggerDescription$ At the beginning of your upkeep, CARDNAME deals 1 damage to each player. Then if you have 10 or less life, put a +1/+1 counter on CARDNAME. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDmg | TriggerDescription$ At the beginning of your upkeep, CARDNAME deals 1 damage to each player. Then if you have 10 or less life, put a +1/+1 counter on CARDNAME.
SVar:TrigDmgOpp:DB$DealDamage | Defined$ Player | NumDmg$ 1 | SubAbility$ DBCounter SVar:TrigDmg:DB$DealDamage | Defined$ Player | NumDmg$ 1 | SubAbility$ DBCounter
SVar:DBCounter:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | ConditionCheckSVar$ X | ConditionSVarCompare$ LE10 | References$ X SVar:DBCounter:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | ConditionCheckSVar$ X | ConditionSVarCompare$ LE10 | References$ X
SVar:X:Count$YourLifeTotal SVar:X:Count$YourLifeTotal
DeckHas:Ability$Counters DeckHas:Ability$Counters

View File

@@ -0,0 +1,6 @@
Name:Summary Judgment
ManaCost:1 W
Types:Instant
A:SP$ DealDamage | Cost$ 1 W | ValidTgts$ Creature.tapped | NumDmg$ X | References$ X | TgtPrompt$ Select target tapped creature | SpellDescription$ CARDNAME deals 3 damage to target tapped creature. If you cast this spell during your main phase, CARDNAME deals 5 damage to that creature instead.
SVar:X:Count$IfMainPhase.5.3
Oracle:Summary Judgment deals 3 damage to target tapped creature.\nAddendum — If you cast this spell during your main phase, it deals 5 damage to that creature instead.

View File

@@ -2,7 +2,7 @@ Name:Teysa Karlov
ManaCost:2 W B ManaCost:2 W B
Types:Legendary Creature Human Advisor Types:Legendary Creature Human Advisor
PT:2/4 PT:2/4
S:Mode$ Continuous | Affected$ You | AddKeyword$ Dieharmonicon | Description$ If a creature dying causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time. K:Dieharmonicon:Creature:If a creature dying causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time.
S:Mode$ Continuous | Affected$ Creature.token+YouCtrl | AddKeyword$ Vigilance & Lifelink | Description$ Creature tokens you control have vigilance and lifelink. S:Mode$ Continuous | Affected$ Creature.token+YouCtrl | AddKeyword$ Vigilance & Lifelink | Description$ Creature tokens you control have vigilance and lifelink.
DeckHints:Ability$Token DeckHints:Ability$Token
Oracle:If a creature dying causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time.\nCreature tokens you control have vigilance and lifelink. Oracle:If a creature dying causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time.\nCreature tokens you control have vigilance and lifelink.

View File

@@ -12,5 +12,6 @@ ALTERNATE
Name:Threat Name:Threat
ManaCost:2 R G ManaCost:2 R G
Types:Sorcery Types:Sorcery
A:SP$ Token | Cost$ 2 R G | TokenAmount$ 1 | TokenOwner$ You | TokenScript$ rg_4_4_beast_trample | SpellDescription$ Create a 4/4 red and green Beast creature token with trample. A:SP$ Token | Cost$ 2 R G | TokenAmount$ 1 | TokenOwner$ You | TokenScript$ rg_4_4_beast_trample | LegacyImage$ rg 4 4 beast trample rna | SpellDescription$ Create a 4/4 red and green Beast creature token with trample.
DeckHas:Ability$Token
Oracle:Create a 4/4 red and green Beast creature token with trample. Oracle:Create a 4/4 red and green Beast creature token with trample.

View File

@@ -2,6 +2,6 @@ Name:Undercity's Embrace
ManaCost:2 B ManaCost:2 B
Types:Instant Types:Instant
A:SP$ Sacrifice | Cost$ 2 B | ValidTgts$ Opponent | SacValid$ Creature | SacMessage$ Creature | SubAbility$ DBGainLife | SpellDescription$ Target opponent sacrifices a creature. If you control a creature with power 4 or greater, you gain 4 life. | StackDescription$ SpellDescription A:SP$ Sacrifice | Cost$ 2 B | ValidTgts$ Opponent | SacValid$ Creature | SacMessage$ Creature | SubAbility$ DBGainLife | SpellDescription$ Target opponent sacrifices a creature. If you control a creature with power 4 or greater, you gain 4 life. | StackDescription$ SpellDescription
SVar:DBGainLife:DB$ GainLife | Defined$ You | ConditionPresent$ Creature.YouCtrl+powerGE4 | ConditionCompare$ GE1 | StackDescription$ If you control a creature with power 4 or greater, you gain 4 life. SVar:DBGainLife:DB$ GainLife | LifeAmount$ 4 | Defined$ You | ConditionPresent$ Creature.YouCtrl+powerGE4 | ConditionCompare$ GE1 | StackDescription$ If you control a creature with power 4 or greater, you gain 4 life.
DeckHas:Ability$LifeGain DeckHas:Ability$LifeGain
Oracle:Target opponent sacrifices a creature. If you control a creature with power 4 or greater, you gain 4 life. Oracle:Target opponent sacrifices a creature. If you control a creature with power 4 or greater, you gain 4 life.

View File

@@ -0,0 +1,6 @@
Name:Vizkopa Vampire
ManaCost:2 WB
Types:Creature Vampire
PT:3/1
K:Lifelink
Oracle:Lifelink

View File

@@ -10,7 +10,7 @@ ALTERNATE
Name:Warden Name:Warden
ManaCost:3 W U ManaCost:3 W U
Types:Sorcery Types:Sorcery
A:SP$ Token | Cost$ 3 W U | TokenAmount$ 1 | TokenOwner$ You | TokenScript$ wu_4_4_sphinx_flying_vigilance | SpellDescription$ Create a 4/4 white and blue Sphinx creature token with flying and vigilance. A:SP$ Token | Cost$ 3 W U | TokenAmount$ 1 | TokenOwner$ You | TokenScript$ wu_4_4_sphinx_flying_vigilance | LegacyImage$ wu 4 4 sphinx flying vigilance rna | SpellDescription$ Create a 4/4 white and blue Sphinx creature token with flying and vigilance.
Oracle:Create a 4/4 white and blue Sphinx creature token with flying and vigilance. Oracle:Create a 4/4 white and blue Sphinx creature token with flying and vigilance.

View File

@@ -3,7 +3,7 @@ ManaCost:5 W
Types:Creature Giant Soldier Types:Creature Giant Soldier
PT:3/6 PT:3/6
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a 1/1 white Human creature token. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a 1/1 white Human creature token.
SVar:TrigToken:DB$Token | TokenAmount$ 1 | TokenScript$ w_1_1_human | TokenOwner$ You | SpellDescription$ Create a 1/1 white Human creature token. SVar:TrigToken:DB$Token | TokenAmount$ 1 | TokenScript$ w_1_1_human | LegacyImage$ w 1 1 human rna | TokenOwner$ You | SpellDescription$ Create a 1/1 white Human creature token.
DeckHints:Type$Human DeckHints:Type$Human
DeckHas:Ability$Token DeckHas:Ability$Token
Oracle:When Watchful Giant enters the battlefield, create a 1/1 white Human creature token. Oracle:When Watchful Giant enters the battlefield, create a 1/1 white Human creature token.

View File

@@ -268,6 +268,11 @@ Booster=10 Common:!fromSheet("RNA Secret Cards"), 3 Uncommon:!fromSheet("RNA Sec
257 C Simic Guildgate 257 C Simic Guildgate
258 C Simic Guildgate 258 C Simic Guildgate
259 R Stomping Ground 259 R Stomping Ground
260 L Plains
261 L Island
262 L Swamp
263 L Mountain
264 L Forest
265 M Dovin, Architect of Law 265 M Dovin, Architect of Law
266 C Elite Arrester 266 C Elite Arrester
267 R Dovin's Dismissal 267 R Dovin's Dismissal

View File

@@ -38,6 +38,7 @@ b_2_2_zombie_m13.jpg https://downloads.cardforge.org/images/to
b_2_2_zombie_m14.jpg https://downloads.cardforge.org/images/tokens/b_2_2_zombie_m14.jpg b_2_2_zombie_m14.jpg https://downloads.cardforge.org/images/tokens/b_2_2_zombie_m14.jpg
b_2_2_zombie_mbs.jpg https://downloads.cardforge.org/images/tokens/b_2_2_zombie_mbs.jpg b_2_2_zombie_mbs.jpg https://downloads.cardforge.org/images/tokens/b_2_2_zombie_mbs.jpg
b_2_2_zombie_knight.jpg https://downloads.cardforge.org/images/tokens/b_2_2_zombie_knight.jpg b_2_2_zombie_knight.jpg https://downloads.cardforge.org/images/tokens/b_2_2_zombie_knight.jpg
b_2_2_zombie_rna.jpg https://downloads.cardforge.org/images/tokens/b_2_2_zombie_rna.jpg
b_2_4_spider.jpg https://downloads.cardforge.org/images/tokens/b_2_4_spider.jpg b_2_4_spider.jpg https://downloads.cardforge.org/images/tokens/b_2_4_spider.jpg
b_3_3_angel.jpg https://downloads.cardforge.org/images/tokens/b_3_3_angel.jpg b_3_3_angel.jpg https://downloads.cardforge.org/images/tokens/b_3_3_angel.jpg
b_3_3_kavu.jpg https://downloads.cardforge.org/images/tokens/b_3_3_kavu.jpg b_3_3_kavu.jpg https://downloads.cardforge.org/images/tokens/b_3_3_kavu.jpg
@@ -65,6 +66,7 @@ c_0_1_pest.jpg https://downloads.cardforge.org/images/to
c_0_1_prism.jpg https://downloads.cardforge.org/images/tokens/c_0_1_prism.jpg c_0_1_prism.jpg https://downloads.cardforge.org/images/tokens/c_0_1_prism.jpg
c_0_2_wall.jpg https://downloads.cardforge.org/images/tokens/c_0_2_wall.jpg c_0_2_wall.jpg https://downloads.cardforge.org/images/tokens/c_0_2_wall.jpg
c_10_10_eldrazi.jpg https://downloads.cardforge.org/images/tokens/c_10_10_eldrazi.jpg c_10_10_eldrazi.jpg https://downloads.cardforge.org/images/tokens/c_10_10_eldrazi.jpg
c_1_1_a_thopter_flying_rna.jpg https://downloads.cardforge.org/images/tokens/c_1_1_a_thopter_flying_rna.jpg
c_1_1_eldrazi_scion.jpg https://downloads.cardforge.org/images/tokens/c_1_1_eldrazi_scion.jpg c_1_1_eldrazi_scion.jpg https://downloads.cardforge.org/images/tokens/c_1_1_eldrazi_scion.jpg
c_1_1_eldrazi_scion2.jpg https://downloads.cardforge.org/images/tokens/c_1_1_eldrazi_scion2.jpg c_1_1_eldrazi_scion2.jpg https://downloads.cardforge.org/images/tokens/c_1_1_eldrazi_scion2.jpg
c_1_1_eldrazi_scion3.jpg https://downloads.cardforge.org/images/tokens/c_1_1_eldrazi_scion3.jpg c_1_1_eldrazi_scion3.jpg https://downloads.cardforge.org/images/tokens/c_1_1_eldrazi_scion3.jpg
@@ -103,6 +105,7 @@ c_5_5_tuktuk_the_returned.jpg https://downloads.cardforge.org/images/to
c_6_12_construct.jpg https://downloads.cardforge.org/images/tokens/c_6_12_construct.jpg c_6_12_construct.jpg https://downloads.cardforge.org/images/tokens/c_6_12_construct.jpg
c_7_7_eldrazi.jpg https://downloads.cardforge.org/images/tokens/c_7_7_eldrazi.jpg c_7_7_eldrazi.jpg https://downloads.cardforge.org/images/tokens/c_7_7_eldrazi.jpg
c_9_9_golem.jpg https://downloads.cardforge.org/images/tokens/c_9_9_golem.jpg c_9_9_golem.jpg https://downloads.cardforge.org/images/tokens/c_9_9_golem.jpg
c_a_treasure_sac_rna.jpg https://downloads.cardforge.org/images/tokens/c_a_treasure_sac_rna.jpg
c_gold.jpg https://downloads.cardforge.org/images/tokens/c_gold.jpg c_gold.jpg https://downloads.cardforge.org/images/tokens/c_gold.jpg
c_x_x_horror.jpg https://downloads.cardforge.org/images/tokens/c_x_x_horror.jpg c_x_x_horror.jpg https://downloads.cardforge.org/images/tokens/c_x_x_horror.jpg
c_x_x_riptide_replicator.jpg https://downloads.cardforge.org/images/tokens/c_x_x_riptide_replicator.jpg c_x_x_riptide_replicator.jpg https://downloads.cardforge.org/images/tokens/c_x_x_riptide_replicator.jpg
@@ -154,6 +157,7 @@ g_2_2_boar.jpg https://downloads.cardforge.org/images/to
g_2_2_cat_warrior.jpg https://downloads.cardforge.org/images/tokens/g_2_2_cat_warrior.jpg g_2_2_cat_warrior.jpg https://downloads.cardforge.org/images/tokens/g_2_2_cat_warrior.jpg
g_2_2_lizard.jpg https://downloads.cardforge.org/images/tokens/g_2_2_lizard.jpg g_2_2_lizard.jpg https://downloads.cardforge.org/images/tokens/g_2_2_lizard.jpg
g_2_2_ooze.jpg https://downloads.cardforge.org/images/tokens/g_2_2_ooze.jpg g_2_2_ooze.jpg https://downloads.cardforge.org/images/tokens/g_2_2_ooze.jpg
g_2_2_ooze_rna.jpg https://downloads.cardforge.org/images/tokens/g_2_2_ooze_rna.jpg
g_2_2_wolf.jpg https://downloads.cardforge.org/images/tokens/g_2_2_wolf.jpg g_2_2_wolf.jpg https://downloads.cardforge.org/images/tokens/g_2_2_wolf.jpg
g_2_2_wolf_bng.jpg https://downloads.cardforge.org/images/tokens/g_2_2_wolf_bng.jpg g_2_2_wolf_bng.jpg https://downloads.cardforge.org/images/tokens/g_2_2_wolf_bng.jpg
g_2_2_wolf_isd.jpg https://downloads.cardforge.org/images/tokens/g_2_2_wolf_isd.jpg g_2_2_wolf_isd.jpg https://downloads.cardforge.org/images/tokens/g_2_2_wolf_isd.jpg
@@ -176,11 +180,13 @@ g_3_3_boar.jpg https://downloads.cardforge.org/images/to
g_3_3_centaur.jpg https://downloads.cardforge.org/images/tokens/g_3_3_centaur.jpg g_3_3_centaur.jpg https://downloads.cardforge.org/images/tokens/g_3_3_centaur.jpg
g_3_3_centaur_bng.jpg https://downloads.cardforge.org/images/tokens/g_3_3_centaur_bng.jpg g_3_3_centaur_bng.jpg https://downloads.cardforge.org/images/tokens/g_3_3_centaur_bng.jpg
g_3_3_centaur_pro_black.jpg https://downloads.cardforge.org/images/tokens/g_3_3_centaur_pro_black.jpg g_3_3_centaur_pro_black.jpg https://downloads.cardforge.org/images/tokens/g_3_3_centaur_pro_black.jpg
g_3_3_centaur_rna.jpg https://downloads.cardforge.org/images/tokens/g_3_3_centaur_rna.jpg
g_3_3_centaur_rtr.jpg https://downloads.cardforge.org/images/tokens/g_3_3_centaur_rtr.jpg g_3_3_centaur_rtr.jpg https://downloads.cardforge.org/images/tokens/g_3_3_centaur_rtr.jpg
g_3_3_elephant.jpg https://downloads.cardforge.org/images/tokens/g_3_3_elephant.jpg g_3_3_elephant.jpg https://downloads.cardforge.org/images/tokens/g_3_3_elephant.jpg
g_3_3_elephant_ody.jpg https://downloads.cardforge.org/images/tokens/g_3_3_elephant_ody.jpg g_3_3_elephant_ody.jpg https://downloads.cardforge.org/images/tokens/g_3_3_elephant_ody.jpg
g_3_3_elephant_wwk.jpg https://downloads.cardforge.org/images/tokens/g_3_3_elephant_wwk.jpg g_3_3_elephant_wwk.jpg https://downloads.cardforge.org/images/tokens/g_3_3_elephant_wwk.jpg
g_3_3_frog_lizard.jpg https://downloads.cardforge.org/images/tokens/g_3_3_frog_lizard.jpg g_3_3_frog_lizard.jpg https://downloads.cardforge.org/images/tokens/g_3_3_frog_lizard.jpg
g_3_3_frog_lizard_rna.jpg https://downloads.cardforge.org/images/tokens/g_3_3_frog_lizard_rna.jpg
g_4_4_beast.jpg https://downloads.cardforge.org/images/tokens/g_4_4_beast.jpg g_4_4_beast.jpg https://downloads.cardforge.org/images/tokens/g_4_4_beast.jpg
g_4_4_beast_zen.jpg https://downloads.cardforge.org/images/tokens/g_4_4_beast_zen.jpg g_4_4_beast_zen.jpg https://downloads.cardforge.org/images/tokens/g_4_4_beast_zen.jpg
g_4_4_elemental.jpg https://downloads.cardforge.org/images/tokens/g_4_4_elemental.jpg g_4_4_elemental.jpg https://downloads.cardforge.org/images/tokens/g_4_4_elemental.jpg
@@ -221,6 +227,7 @@ r_1_1_goblin_dom.jpg https://downloads.cardforge.org/images/to
r_1_1_goblin_m13.jpg https://downloads.cardforge.org/images/tokens/r_1_1_goblin_m13.jpg r_1_1_goblin_m13.jpg https://downloads.cardforge.org/images/tokens/r_1_1_goblin_m13.jpg
r_1_1_goblin_nph.jpg https://downloads.cardforge.org/images/tokens/r_1_1_goblin_nph.jpg r_1_1_goblin_nph.jpg https://downloads.cardforge.org/images/tokens/r_1_1_goblin_nph.jpg
r_1_1_goblin_rav.jpg https://downloads.cardforge.org/images/tokens/r_1_1_goblin_rav.jpg r_1_1_goblin_rav.jpg https://downloads.cardforge.org/images/tokens/r_1_1_goblin_rav.jpg
r_1_1_goblin_rna.jpg https://downloads.cardforge.org/images/tokens/r_1_1_goblin_rna.jpg
r_1_1_goblin_rtr.jpg https://downloads.cardforge.org/images/tokens/r_1_1_goblin_rtr.jpg r_1_1_goblin_rtr.jpg https://downloads.cardforge.org/images/tokens/r_1_1_goblin_rtr.jpg
r_1_1_goblin_scout.jpg https://downloads.cardforge.org/images/tokens/r_1_1_goblin_scout.jpg r_1_1_goblin_scout.jpg https://downloads.cardforge.org/images/tokens/r_1_1_goblin_scout.jpg
r_1_1_goblin_som.jpg https://downloads.cardforge.org/images/tokens/r_1_1_goblin_som.jpg r_1_1_goblin_som.jpg https://downloads.cardforge.org/images/tokens/r_1_1_goblin_som.jpg
@@ -261,6 +268,7 @@ rg_1_1_goblin_warrior.jpg https://downloads.cardforge.org/images/to
rg_2_2_satyr.jpg https://downloads.cardforge.org/images/tokens/rg_2_2_satyr.jpg rg_2_2_satyr.jpg https://downloads.cardforge.org/images/tokens/rg_2_2_satyr.jpg
rg_3_4_stangg_twin.jpg https://downloads.cardforge.org/images/tokens/rg_3_4_stangg_twin.jpg rg_3_4_stangg_twin.jpg https://downloads.cardforge.org/images/tokens/rg_3_4_stangg_twin.jpg
rg_4_4_giant_warrior.jpg https://downloads.cardforge.org/images/tokens/rg_4_4_giant_warrior.jpg rg_4_4_giant_warrior.jpg https://downloads.cardforge.org/images/tokens/rg_4_4_giant_warrior.jpg
rg_4_4_beast_trample_rna.jpg https://downloads.cardforge.org/images/tokens/rg_4_4_beast_trample.jpg
rg_5_5_elemental.jpg https://downloads.cardforge.org/images/tokens/rg_5_5_elemental.jpg rg_5_5_elemental.jpg https://downloads.cardforge.org/images/tokens/rg_5_5_elemental.jpg
rw_1_1_goblin_soldier.jpg https://downloads.cardforge.org/images/tokens/rw_1_1_goblin_soldier.jpg rw_1_1_goblin_soldier.jpg https://downloads.cardforge.org/images/tokens/rw_1_1_goblin_soldier.jpg
rw_1_1_goblin_soldier_eve.jpg https://downloads.cardforge.org/images/tokens/rw_1_1_goblin_soldier_eve.jpg rw_1_1_goblin_soldier_eve.jpg https://downloads.cardforge.org/images/tokens/rw_1_1_goblin_soldier_eve.jpg
@@ -268,6 +276,7 @@ rw_1_1_soldier.jpg https://downloads.cardforge.org/images/to
u_0_1_homunculus.jpg https://downloads.cardforge.org/images/tokens/u_0_1_homunculus.jpg u_0_1_homunculus.jpg https://downloads.cardforge.org/images/tokens/u_0_1_homunculus.jpg
u_0_1_plant_wall.jpg https://downloads.cardforge.org/images/tokens/u_0_1_plant_wall.jpg u_0_1_plant_wall.jpg https://downloads.cardforge.org/images/tokens/u_0_1_plant_wall.jpg
u_0_1_starfish.jpg https://downloads.cardforge.org/images/tokens/u_0_1_starfish.jpg u_0_1_starfish.jpg https://downloads.cardforge.org/images/tokens/u_0_1_starfish.jpg
u_0_2_illusion_mesmerize_rna.jpg https://downloads.cardforge.org/images/tokens/u_0_2_illusion_mesmerize_rna.jpg
u_1_0_elemental.jpg https://downloads.cardforge.org/images/tokens/u_1_0_elemental.jpg u_1_0_elemental.jpg https://downloads.cardforge.org/images/tokens/u_1_0_elemental.jpg
u_1_1_bird.jpg https://downloads.cardforge.org/images/tokens/u_1_1_bird.jpg u_1_1_bird.jpg https://downloads.cardforge.org/images/tokens/u_1_1_bird.jpg
u_1_1_bird_eve.jpg https://downloads.cardforge.org/images/tokens/u_1_1_bird_eve.jpg u_1_1_bird_eve.jpg https://downloads.cardforge.org/images/tokens/u_1_1_bird_eve.jpg
@@ -309,6 +318,7 @@ w_1_1_citizen.jpg https://downloads.cardforge.org/images/to
w_1_1_goldmeadow_harrier.jpg https://downloads.cardforge.org/images/tokens/w_1_1_goldmeadow_harrier.jpg w_1_1_goldmeadow_harrier.jpg https://downloads.cardforge.org/images/tokens/w_1_1_goldmeadow_harrier.jpg
w_1_1_human.jpg https://downloads.cardforge.org/images/tokens/w_1_1_human.jpg w_1_1_human.jpg https://downloads.cardforge.org/images/tokens/w_1_1_human.jpg
w_1_1_human_avr.jpg https://downloads.cardforge.org/images/tokens/w_1_1_human_avr.jpg w_1_1_human_avr.jpg https://downloads.cardforge.org/images/tokens/w_1_1_human_avr.jpg
w_1_1_human_rna.jpg https://downloads.cardforge.org/images/tokens/w_1_1_human_rna.jpg
w_1_1_kithkin_soldier.jpg https://downloads.cardforge.org/images/tokens/w_1_1_kithkin_soldier.jpg w_1_1_kithkin_soldier.jpg https://downloads.cardforge.org/images/tokens/w_1_1_kithkin_soldier.jpg
w_1_1_kithkin_soldier_shm.jpg https://downloads.cardforge.org/images/tokens/w_1_1_kithkin_soldier_shm.jpg w_1_1_kithkin_soldier_shm.jpg https://downloads.cardforge.org/images/tokens/w_1_1_kithkin_soldier_shm.jpg
w_1_1_knight.jpg https://downloads.cardforge.org/images/tokens/w_1_1_knight.jpg w_1_1_knight.jpg https://downloads.cardforge.org/images/tokens/w_1_1_knight.jpg
@@ -366,13 +376,15 @@ w_x_x_reflection.jpg https://downloads.cardforge.org/images/to
wb_1_1_cleric.jpg https://downloads.cardforge.org/images/tokens/wb_1_1_cleric.jpg wb_1_1_cleric.jpg https://downloads.cardforge.org/images/tokens/wb_1_1_cleric.jpg
wb_1_1_spirit.jpg https://downloads.cardforge.org/images/tokens/wb_1_1_spirit.jpg wb_1_1_spirit.jpg https://downloads.cardforge.org/images/tokens/wb_1_1_spirit.jpg
wb_1_1_spirit_gtc.jpg https://downloads.cardforge.org/images/tokens/wb_1_1_spirit_gtc.jpg wb_1_1_spirit_gtc.jpg https://downloads.cardforge.org/images/tokens/wb_1_1_spirit_gtc.jpg
wb_1_1_spirit_rna.jpg https://downloads.cardforge.org/images/tokens/wb_1_1_spirit_rna.jpg
wrg_8_8_beast.jpg https://downloads.cardforge.org/images/tokens/wrg_8_8_beast.jpg wrg_8_8_beast.jpg https://downloads.cardforge.org/images/tokens/wrg_8_8_beast.jpg
wu_1_1_bird.jpg https://downloads.cardforge.org/images/tokens/wu_1_1_bird.jpg wu_1_1_bird.jpg https://downloads.cardforge.org/images/tokens/wu_1_1_bird.jpg
wu_4_4_sphinx_flying_vigilance_rna.jpg https://downloads.cardforge.org/images/tokens/wu_4_4_sphinx_flying_vigilance_rna.jpg
# Emblems # Emblems
chandra_the_firebrand_effect.jpg https://downloads.cardforge.org/images/tokens/chandra_the_firebrand_effect.jpg chandra_the_firebrand_effect.jpg https://downloads.cardforge.org/images/tokens/chandra_the_firebrand_effect.jpg
emblem_domri_chaos_bringer_rna.jpg https://downloads.cardforge.org/images/tokens/emblem_domri_chaos_bringer_rna.jpg
emblem_domri_rade.jpg https://downloads.cardforge.org/images/tokens/emblem_domri_rade.jpg emblem_domri_rade.jpg https://downloads.cardforge.org/images/tokens/emblem_domri_rade.jpg
emblem_elspeth_knight_errant.jpg https://downloads.cardforge.org/images/tokens/emblem_elspeth_knight_errant.jpg emblem_elspeth_knight_errant.jpg https://downloads.cardforge.org/images/tokens/emblem_elspeth_knight_errant.jpg
emblem_elspeth_suns_champion.jpg https://downloads.cardforge.org/images/tokens/emblem_elspeth_suns_champion.jpg emblem_elspeth_suns_champion.jpg https://downloads.cardforge.org/images/tokens/emblem_elspeth_suns_champion.jpg

View File

@@ -0,0 +1,17 @@
[metadata]
Name:Possibility Storm - Ravnica Allegiance #00a (Prerelease Puzzle)
URL:http://www.possibilitystorm.com/wp-content/uploads/2019/01/097.-RNA002.jpg
Goal:Win
Turns:1
Difficulty:Rare
Description:Win this turn. You have three other Growth-Chamber Guardians in your deck (in addition to the one in your hand).
[state]
humanlife=20
ailife=7
turn=1
activeplayer=human
activephase=MAIN1
humanhand=Grotesque Demise;Ancient Animus;Bedevil;Growth-Chamber Guardian
humanlibrary=Growth-Chamber Guardian;Growth-Chamber Guardian;Growth-Chamber Guardian
humanbattlefield=Rhythm of the Wild;Rhythm of the Wild;Piston-Fist Cyclops|NoETBTrigs;Mausoleum Harpy|NoETBTrigs;Dragon Egg|NoETBTrigs;Blood Crypt|NoETBTrigs;Blood Crypt|NoETBTrigs;Blood Crypt|NoETBTrigs;Overgrown Tomb|NoETBTrigs;Overgrown Tomb|NoETBTrigs;Overgrown Tomb|NoETBTrigs
aibattlefield=Goring Ceratops;Goblin Chainwhirler;Goblin Chainwhirler

View File

@@ -0,0 +1,5 @@
Name:Treasure
ManaCost:no cost
Types:Artifact Treasure
A:AB$ Mana | Cost$ T Sac<1/CARDNAME|this artifact> | Produced$ Any | Amount$ 1 | SpellDescription$ Add one mana of any color.
Oracle:{T}, Sacrifice this artifact: Add one mana of any color.

View File

@@ -0,0 +1,9 @@
Name:Illusion
Types:Creature Illusion
ManaCost:no cost
Colors:blue
PT:0/2
T:Mode$ AttackerBlocked | ValidBlocker$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever this creature blocks a creature, that creature doesn't untap during its controller's next untap step.
SVar:TrigPump:DB$ Pump | Defined$ TriggeredAttacker | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True
SVar:HasBlockEffect:TRUE
Oracle:Whenever this creature blocks a creature, that creature doesn't untap during its controller's next untap step.

View File

@@ -159,6 +159,7 @@ public interface IGuiGame {
void setUsedToPay(CardView card, boolean value); void setUsedToPay(CardView card, boolean value);
void setSelectables(final Iterable<CardView> cards); void setSelectables(final Iterable<CardView> cards);
void clearSelectables(); void clearSelectables();
boolean isSelecting();
void awaitNextInput(); void awaitNextInput();
void cancelAwaitNextInput(); void cancelAwaitNextInput();

View File

@@ -230,6 +230,9 @@ public abstract class AbstractGuiGame implements IGuiGame, IMayViewCards {
public boolean isSelectable(final CardView card) { public boolean isSelectable(final CardView card) {
return selectableCards.contains(card); return selectableCards.contains(card);
} }
public boolean isSelecting() {
return !selectableCards.isEmpty();
}
/** Concede game, bring up WinLose UI. */ /** Concede game, bring up WinLose UI. */
public boolean concede() { public boolean concede() {

View File

@@ -69,7 +69,7 @@ public class InputSelectFromTwoLists<T extends GameEntity> extends InputSelectMa
if ( valid1.contains(s) ) { selected1 = true; } if ( valid1.contains(s) ) { selected1 = true; }
if ( valid2.contains(s) ) { selected2 = true; } if ( valid2.contains(s) ) { selected2 = true; }
} }
validChoices = selected1 ? ( selected2 ? FCollection.getEmpty() : valid2 ) : ( selected2 ? valid1 : validBoth ); validChoices = selected1 ? ( selected2 ? FCollection.<T>getEmpty() : valid2 ) : ( selected2 ? valid1 : validBoth );
setSelectables(); setSelectables();
FThreads.invokeInEdtNowOrLater(new Runnable() { FThreads.invokeInEdtNowOrLater(new Runnable() {
@Override public void run() { @Override public void run() {