mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-14 17:58:01 +00:00
Merge branch 'master' of https://git.cardforge.org/core-developers/forge
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>() {
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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));
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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.
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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.
|
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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.
|
||||||
8
forge-gui/res/cardsfolder/upcoming/charging_war_boar.txt
Normal file
8
forge-gui/res/cardsfolder/upcoming/charging_war_boar.txt
Normal 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 it’s attacking.)
|
||||||
8
forge-gui/res/cardsfolder/upcoming/cindervines.txt
Normal file
8
forge-gui/res/cardsfolder/upcoming/cindervines.txt
Normal 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 permanent’s 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 permanent’s controller.
|
||||||
8
forge-gui/res/cardsfolder/upcoming/clamor_shaman.txt
Normal file
8
forge-gui/res/cardsfolder/upcoming/clamor_shaman.txt
Normal 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 can’t block this turn.
|
||||||
@@ -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.
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
9
forge-gui/res/cardsfolder/upcoming/domris_nodorog.txt
Normal file
9
forge-gui/res/cardsfolder/upcoming/domris_nodorog.txt
Normal 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 Domri’s 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.
|
||||||
@@ -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.\n−1: Tap target creature. It doesn’t untap during its controller’s next untap step.\n−9: Tap all permanents target opponent controls. That player skips their next untap step.
|
||||||
@@ -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.
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
7
forge-gui/res/cardsfolder/upcoming/dovins_dismissal.txt
Normal file
7
forge-gui/res/cardsfolder/upcoming/dovins_dismissal.txt
Normal 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 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.
|
||||||
7
forge-gui/res/cardsfolder/upcoming/elite_arrester.txt
Normal file
7
forge-gui/res/cardsfolder/upcoming/elite_arrester.txt
Normal 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.
|
||||||
@@ -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.
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
7
forge-gui/res/cardsfolder/upcoming/footlight_fiend.txt
Normal file
7
forge-gui/res/cardsfolder/upcoming/footlight_fiend.txt
Normal 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.
|
||||||
8
forge-gui/res/cardsfolder/upcoming/forbidding_spirit.txt
Normal file
8
forge-gui/res/cardsfolder/upcoming/forbidding_spirit.txt
Normal 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 can’t 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 can’t 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 can’t attack you or a planeswalker you control unless their controller pays {2} for each of those creatures.
|
||||||
6
forge-gui/res/cardsfolder/upcoming/get_the_point.txt
Normal file
6
forge-gui/res/cardsfolder/upcoming/get_the_point.txt
Normal 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.
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
8
forge-gui/res/cardsfolder/upcoming/haazda_officer.txt
Normal file
8
forge-gui/res/cardsfolder/upcoming/haazda_officer.txt
Normal 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.
|
||||||
@@ -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.
|
||||||
|
|||||||
@@ -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 creature’s 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 creature’s 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 creature’s controller creates a 3/3 green Frog Lizard creature token.
|
Oracle:Exile target creature. That creature’s controller creates a 3/3 green Frog Lizard creature token.
|
||||||
@@ -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.
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
8
forge-gui/res/cardsfolder/upcoming/lawmages_binding.txt
Normal file
8
forge-gui/res/cardsfolder/upcoming/lawmages_binding.txt
Normal 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.
|
||||||
@@ -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.
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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 that’s a copy of target creature you control.
|
Oracle:Create a token that’s a copy of target creature you control.
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
6
forge-gui/res/cardsfolder/upcoming/rubble_slinger.txt
Normal file
6
forge-gui/res/cardsfolder/upcoming/rubble_slinger.txt
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
Name:Rubble Slinger
|
||||||
|
ManaCost:2 RG
|
||||||
|
Types:Creature Human Warrior
|
||||||
|
PT:2/3
|
||||||
|
K:Reach
|
||||||
|
Oracle:Reach
|
||||||
6
forge-gui/res/cardsfolder/upcoming/rubblebelt_runner.txt
Normal file
6
forge-gui/res/cardsfolder/upcoming/rubblebelt_runner.txt
Normal 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 can’t be blocked by creature tokens.
|
||||||
@@ -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.
|
||||||
|
|||||||
7
forge-gui/res/cardsfolder/upcoming/screaming_shield.txt
Normal file
7
forge-gui/res/cardsfolder/upcoming/screaming_shield.txt
Normal 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.)
|
||||||
8
forge-gui/res/cardsfolder/upcoming/scuttlegator.txt
Normal file
8
forge-gui/res/cardsfolder/upcoming/scuttlegator.txt
Normal 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 didn’t 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 didn’t have defender.
|
||||||
8
forge-gui/res/cardsfolder/upcoming/senate_griffin.txt
Normal file
8
forge-gui/res/cardsfolder/upcoming/senate_griffin.txt
Normal 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.
|
||||||
@@ -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.
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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."
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
6
forge-gui/res/cardsfolder/upcoming/summary_judgment.txt
Normal file
6
forge-gui/res/cardsfolder/upcoming/summary_judgment.txt
Normal 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.
|
||||||
@@ -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.
|
||||||
|
|||||||
@@ -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.
|
||||||
@@ -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.
|
||||||
|
|||||||
6
forge-gui/res/cardsfolder/upcoming/vizkopa_vampire.txt
Normal file
6
forge-gui/res/cardsfolder/upcoming/vizkopa_vampire.txt
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
Name:Vizkopa Vampire
|
||||||
|
ManaCost:2 WB
|
||||||
|
Types:Creature Vampire
|
||||||
|
PT:3/1
|
||||||
|
K:Lifelink
|
||||||
|
Oracle:Lifelink
|
||||||
@@ -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.
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
17
forge-gui/res/puzzle/PS_RNA0a.pzl
Normal file
17
forge-gui/res/puzzle/PS_RNA0a.pzl
Normal 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
|
||||||
5
forge-gui/res/tokenscripts/c_a_treasure_sac.txt
Normal file
5
forge-gui/res/tokenscripts/c_a_treasure_sac.txt
Normal 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.
|
||||||
9
forge-gui/res/tokenscripts/u_0_2_illusion_mesmerize.txt
Normal file
9
forge-gui/res/tokenscripts/u_0_2_illusion_mesmerize.txt
Normal 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.
|
||||||
@@ -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();
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
Reference in New Issue
Block a user