Merge branch 'master' of https://github.com/Card-Forge/forge into adventure

This commit is contained in:
Grimm
2022-05-06 00:07:00 +02:00
207 changed files with 3003 additions and 695 deletions

View File

@@ -329,9 +329,6 @@ public class ComputerUtil {
}
AbilityUtils.resolve(sa);
// destroys creatures if they have lethal damage, etc..
//game.getAction().checkStateEffects();
}
}
@@ -827,7 +824,7 @@ public class ComputerUtil {
}
}
if ("DesecrationDemon".equals(source.getParam("AILogic"))) {
if ("DesecrationDemon".equals(logic)) {
sacThreshold = SpecialCardAi.DesecrationDemon.getSacThreshold();
} else if (considerSacThreshold != -1) {
sacThreshold = considerSacThreshold;
@@ -1227,12 +1224,12 @@ public class ComputerUtil {
final Game game = sa.getActivatingPlayer().getGame();
final PhaseHandler ph = game.getPhaseHandler();
return (sa.getHostCard().isCreature()
return sa.getHostCard().isCreature()
&& sa.getPayCosts().hasTapCost()
&& (ph.getPhase().isBefore(PhaseType.COMBAT_DECLARE_BLOCKERS)
&& !ph.getNextTurn().equals(sa.getActivatingPlayer()))
&& !sa.getHostCard().hasSVar("EndOfTurnLeavePlay")
&& !sa.hasParam("ActivationPhases"));
&& !sa.hasParam("ActivationPhases");
}
//returns true if it's better to wait until blockers are declared).
@@ -2601,8 +2598,7 @@ public class ComputerUtil {
}
public static CardCollection getSafeTargets(final Player ai, SpellAbility sa, CardCollectionView validCards) {
CardCollection safeCards = new CardCollection(validCards);
safeCards = CardLists.filter(safeCards, new Predicate<Card>() {
CardCollection safeCards = CardLists.filter(validCards, new Predicate<Card>() {
@Override
public boolean apply(final Card c) {
if (c.getController() == ai) {
@@ -2615,8 +2611,7 @@ public class ComputerUtil {
}
public static Card getKilledByTargeting(final SpellAbility sa, CardCollectionView validCards) {
CardCollection killables = new CardCollection(validCards);
killables = CardLists.filter(killables, new Predicate<Card>() {
CardCollection killables = CardLists.filter(validCards, new Predicate<Card>() {
@Override
public boolean apply(final Card c) {
return c.getController() != sa.getActivatingPlayer() && c.getSVar("Targeting").equals("Dies");

View File

@@ -5,6 +5,7 @@ import java.util.Map;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import forge.ai.ComputerUtil;
import forge.ai.ComputerUtilCard;
import forge.ai.SpellAbilityAi;
import forge.game.card.Card;
@@ -20,6 +21,7 @@ public class MutateAi extends SpellAbilityAi {
@Override
protected boolean canPlayAI(Player aiPlayer, SpellAbility sa) {
CardCollectionView mutateTgts = CardLists.getTargetableCards(aiPlayer.getCreaturesInPlay(), sa);
mutateTgts = ComputerUtil.getSafeTargets(aiPlayer, sa, mutateTgts);
// Filter out some abilities that are useless
// TODO: add other stuff useless for Mutate here

View File

@@ -1,7 +1,9 @@
package forge.ai.ability;
import forge.ai.AiAttackController;
import forge.ai.SpellAbilityAi;
import forge.ai.SpellApiToAi;
import forge.game.card.Card;
import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType;
import forge.game.player.Player;
@@ -9,6 +11,7 @@ import forge.game.player.PlayerActionConfirmMode;
import forge.game.spellability.AbilityStatic;
import forge.game.spellability.AbilitySub;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
/**
* TODO: Write javadoc for this type.
@@ -38,6 +41,28 @@ public class PeekAndRevealAi extends SpellAbilityAi {
}
// So far this only appears on Triggers, but will expand
// once things get converted from Dig + NoMove
Player opp = AiAttackController.choosePreferredDefenderPlayer(aiPlayer);
final Card host = sa.getHostCard();
Player libraryOwner = aiPlayer;
if (!willPayCosts(aiPlayer, sa, sa.getPayCosts(), host)) {
return false;
}
if (sa.usesTargeting()) {
sa.resetTargets();
//todo: evaluate valid targets
if (!sa.canTarget(opp)) {
return false;
}
sa.getTargets().add(opp);
libraryOwner = opp;
}
if (libraryOwner.getCardsIn(ZoneType.Library).isEmpty()) {
return false;
}
return true;
}

View File

@@ -133,6 +133,10 @@ public class UntapAi extends SpellAbilityAi {
CardCollection list = CardLists.getTargetableCards(targetController.getCardsIn(ZoneType.Battlefield), sa);
if (!sa.isCurse()) {
list = ComputerUtil.getSafeTargets(ai, sa, list);
}
if (list.isEmpty()) {
return false;
}
@@ -261,10 +265,8 @@ public class UntapAi extends SpellAbilityAi {
}
private boolean untapTargetList(final Card source, final TargetRestrictions tgt, final SpellAbility sa, final boolean mandatory,
final CardCollection tapList) {
for (final Card c : sa.getTargets().getTargetCards()) {
tapList.remove(c);
}
final CardCollection tapList) {
tapList.removeAll(sa.getTargets().getTargetCards());
if (tapList.isEmpty()) {
return false;

View File

@@ -577,6 +577,8 @@ public class GameAction {
}
}
table.replaceCounterEffect(game, null, true);
// Need to apply any static effects to produce correct triggers
checkStaticAbilities();
@@ -592,8 +594,6 @@ public class GameAction {
}
game.getTriggerHandler().registerActiveTrigger(copied, false);
table.replaceCounterEffect(game, null, true);
// play the change zone sound
game.fireEvent(new GameEventCardChangeZone(c, zoneFrom, zoneTo));

View File

@@ -1851,9 +1851,6 @@ public class AbilityUtils {
}
}
list = CardLists.getValidCards(list, k[1], sa.getActivatingPlayer(), c, sa);
if (k[0].contains("TotalToughness")) {
return doXMath(Aggregates.sum(list, CardPredicates.Accessors.fnGetNetToughness), expr, c, ctb);
}
return doXMath(list.size(), expr, c, ctb);
}
@@ -2416,16 +2413,6 @@ public class AbilityUtils {
return doXMath(cmc, expr, c, ctb);
}
if (sq[0].startsWith("ColorsCtrl")) {
final String restriction = l[0].substring(11);
final CardCollection list = CardLists.getValidCards(player.getCardsIn(ZoneType.Battlefield), restriction, player, c, ctb);
byte n = 0;
for (final Card card : list) {
n |= card.getColor().getColor();
}
return doXMath(ColorSet.fromMask(n).countColors(), expr, c, ctb);
}
// Count$AttackersDeclared
if (sq[0].startsWith("AttackersDeclared")) {
List<Card> attackers = player.getCreaturesAttackedThisTurn();
@@ -2688,20 +2675,6 @@ public class AbilityUtils {
return MyRandom.getRandom().nextInt(1+max-min) + min;
}
// Count$TotalCounters.<counterType>_<valid>
if (sq[0].startsWith("TotalCounters")) {
final String[] restrictions = l[0].split("_");
final CounterType cType = CounterType.getType(restrictions[1]);
final String[] validFilter = restrictions[2].split(",");
CardCollectionView validCards = game.getCardsIn(ZoneType.Battlefield);
validCards = CardLists.getValidCards(validCards, validFilter, player, c, ctb);
int cCount = 0;
for (final Card card : validCards) {
cCount += card.getCounters(cType);
}
return doXMath(cCount, expr, c, ctb);
}
// Count$ThisTurnCast <Valid>
// Count$LastTurnCast <Valid>
if (sq[0].startsWith("ThisTurnCast") || sq[0].startsWith("LastTurnCast")) {
@@ -2756,13 +2729,27 @@ public class AbilityUtils {
String[] paidparts = l[0].split("\\$", 2);
String[] lparts = paidparts[0].split(" ", 2);
final CardCollectionView cardsInZones;
CardCollectionView cardsInZones = null;
if (lparts[0].contains("All")) {
cardsInZones = game.getCardsInGame();
} else {
cardsInZones = lparts[0].length() > 5
? game.getCardsIn(ZoneType.listValueOf(lparts[0].substring(5)))
: game.getCardsIn(ZoneType.Battlefield);
final List<ZoneType> zones = ZoneType.listValueOf(lparts[0].length() > 5 ? lparts[0].substring(5) : "Battlefield");
boolean usedLastState = false;
if (ctb instanceof SpellAbility && zones.size() == 1) {
SpellAbility sa = (SpellAbility) ctb;
if (sa.isReplacementAbility()) {
if (zones.get(0).equals(ZoneType.Battlefield)) {
cardsInZones = sa.getLastStateBattlefield();
usedLastState = true;
} else if (zones.get(0).equals(ZoneType.Graveyard)) {
cardsInZones = sa.getLastStateGraveyard();
usedLastState = true;
}
}
}
if (!usedLastState) {
cardsInZones = game.getCardsIn(zones);
}
}
int cnt;
@@ -2775,7 +2762,7 @@ public class AbilityUtils {
}
if (sq[0].startsWith("MostCardName")) {
String[] lparts = l[0].split(" ", 2);
String[] lparts = l[0].split(" ", 2);
final String[] rest = lparts[1].split(",");
final CardCollectionView cardsInZones = lparts[0].length() > 12
@@ -2859,6 +2846,19 @@ public class AbilityUtils {
}
return doXMath(powers.size(), expr, c, ctb);
}
if (sq[0].startsWith("DifferentCounterKinds_")) {
final List<CounterType> kinds = Lists.newArrayList();
final String rest = l[0].substring(22);
CardCollection list = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), rest, player, c, ctb);
for (final Card card : list) {
for (final Map.Entry<CounterType, Integer> map : card.getCounters().entrySet()) {
if (!kinds.contains(map.getKey())) {
kinds.add(map.getKey());
}
}
}
return doXMath(kinds.size(), expr, c, ctb);
}
// Complex counting methods
CardCollectionView someCards = getCardListForXCount(c, player, sq, ctb);
@@ -3448,10 +3448,6 @@ public class AbilityUtils {
return doXMath(player.getNumDiscardedThisTurn(), m, source, ctb);
}
if (value.contains("TokensCreatedThisTurn")) {
return doXMath(player.getNumTokensCreatedThisTurn(), m, source, ctb);
}
if (value.contains("AttackersDeclared")) {
return doXMath(player.getCreaturesAttackedThisTurn().size(), m, source, ctb);
}

View File

@@ -68,7 +68,9 @@ public class CopyPermanentEffect extends TokenEffectBase {
if (sa.hasParam("AddTriggers")) {
final String oDesc = sa.getDescription();
final String trigStg = oDesc.substring(oDesc.indexOf("\""),oDesc.lastIndexOf("\"") + 1);
final String trigStg = oDesc.contains("\"") ?
oDesc.substring(oDesc.indexOf("\""),oDesc.lastIndexOf("\"") + 1) :
"[trigger text parsing error]";
if (addKWs) {
sb.append(" and ").append(trigStg);
} else {

View File

@@ -2,6 +2,7 @@ package forge.game.ability.effects;
import java.util.Map;
import forge.game.card.*;
import org.apache.commons.lang3.tuple.Pair;
import com.google.common.collect.ImmutableList;
@@ -12,10 +13,6 @@ import forge.game.Game;
import forge.game.GameEntity;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
import forge.game.card.CardCollectionView;
import forge.game.card.CardLists;
import forge.game.card.CounterType;
import forge.game.player.Player;
import forge.game.player.PlayerController;
import forge.game.spellability.SpellAbility;
@@ -126,15 +123,26 @@ public class CountersRemoveEffect extends SpellAbilityEffect {
}
CardCollectionView srcCards = null;
String title = Localizer.getInstance().getMessage("lblChooseCardsToTakeTargetCounters", counterType.getName());
if (sa.hasParam("ValidSource")) {
srcCards = game.getCardsIn(ZoneType.Battlefield);
srcCards = CardLists.getValidCards(srcCards, sa.getParam("ValidSource"), player, card, sa);
if (num.equals("Any")) {
String title = Localizer.getInstance().getMessage("lblChooseCardsToTakeTargetCounters", counterType.getName());
Map<String, Object> params = Maps.newHashMap();
params.put("CounterType", counterType);
srcCards = player.getController().chooseCardsForEffect(srcCards, sa, title, 0, srcCards.size(), true, params);
}
} else if (sa.hasParam("Choices") && counterType != null) {
ZoneType choiceZone = sa.hasParam("ChoiceZone") ? ZoneType.smartValueOf(sa.getParam("ChoiceZone"))
: ZoneType.Battlefield;
CardCollection choices = CardLists.getValidCards(game.getCardsIn(choiceZone), sa.getParam("Choices"),
player, card, sa);
//currently only used by one card, so for now
//amount is locked at 1 and choice is mandatory
srcCards = pc.chooseCardsForEffect(choices, sa, title, 1, 1,
false, null);
} else {
srcCards = getTargetCards(sa);
}
@@ -171,7 +179,7 @@ public class CountersRemoveEffect extends SpellAbilityEffect {
Map<String, Object> params = Maps.newHashMap();
params.put("Target", gameCard);
params.put("CounterType", counterType);
String title = Localizer.getInstance().getMessage("lblSelectRemoveCountersNumberOfTarget", type);
title = Localizer.getInstance().getMessage("lblSelectRemoveCountersNumberOfTarget", type);
cntToRemove = pc.chooseNumber(sa, title, 0, cntToRemove, params);
}
}

View File

@@ -47,7 +47,7 @@ public class DigEffect extends SpellAbilityEffect {
verb = " exiles ";
}
sb.append(host.getController()).append(verb).append("the top ");
sb.append(numToDig == 1 ? "card" : (Lang.getNumeral(numToDig) + " cards")).append(" of ");
sb.append(numToDig == 1 ? "card" : Lang.getNumeral(numToDig) + " cards").append(" of ");
if (tgtPlayers.contains(host.getController())) {
sb.append("their ");

View File

@@ -40,7 +40,10 @@ public class DrawEffect extends SpellAbilityEffect {
sb.append(" each");
}
sb.append(Lang.joinVerb(tgtPlayers, " draw")).append(" ");
sb.append(numCards == 1 ? "a card" : (Lang.getNumeral(numCards) + " cards"));
//if NumCards calculation could change between getStackDescription and resolve, use NumCardsDesc to avoid
//a "wrong" stack description
sb.append(sa.hasParam("NumCardsDesc") ? sa.getParam("NumCardsDesc") : numCards == 1 ? "a card" :
(Lang.getNumeral(numCards) + " cards"));
sb.append(".");
}

View File

@@ -165,7 +165,9 @@ public class FightEffect extends DamageBaseEffect {
damageMap.put(fighterA, fighterB, dmg1);
damageMap.put(fighterB, fighterA, dmg2);
fighterB.setFoughtThisTurn(true);
}
fighterA.setFoughtThisTurn(true);
if (!usedDamageMap) {
sa.getHostCard().getGame().getAction().dealDamage(false, damageMap, preventMap, counterTable, sa);

View File

@@ -270,9 +270,17 @@ public class ManaEffect extends SpellAbilityEffect {
? GameActionUtil.generatedMana(sa) : "mana";
sb.append("Add ").append(toManaString(mana)).append(".");
if (sa.hasParam("RestrictValid")) {
String desc = sa.getDescription();
int i = desc.indexOf("Spend this");
sb.append(" ").append(desc, i, desc.indexOf(".", i) + 1);
sb.append(" ");
final String desc = sa.getDescription();
if (desc.contains("Spend this") && desc.contains(".")) {
int i = desc.indexOf("Spend this");
sb.append(desc, i, desc.indexOf(".", i) + 1);
} else if (desc.contains("This mana can't") && desc.contains(".")) { //for negative restrictions (Jegantha)
int i = desc.indexOf("This mana can't");
sb.append(desc, i, desc.indexOf(".", i) + 1);
} else {
sb.append("[failed to add RestrictValid to StackDesc]");
}
}
return sb.toString();
}

View File

@@ -29,21 +29,23 @@ public class PeekAndRevealEffect extends SpellAbilityEffect {
@Override
protected String getStackDescription(SpellAbility sa) {
final Player peeker = sa.getActivatingPlayer();
final int numPeek = sa.hasParam("PeekAmount") ?
AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("PeekAmount"), sa) : 1;
final String verb = sa.hasParam("NoReveal") || sa.hasParam("RevealOptional") ? " looks at " :
" reveals ";
final String defined = sa.getParamOrDefault("Defined", "their");
String whose;
if (defined.equals("Player")) {
whose = "each player's";
} else { // other else ifs for specific defined can be added above as needs arise
whose = Lang.joinHomogenous(getTargetPlayers(sa));
}
final String defined = sa.getParamOrDefault("Defined", "");
final List<Player> libraryPlayers = getDefinedPlayersOrTargeted(sa);
final String defString = Lang.joinHomogenous(libraryPlayers);
String who = defined.equals("Player") && verb.equals(" reveals ") ? "Each player" :
sa.hasParam("NoPeek") && verb.equals(" reveals ") ? defString : "";
String whose = defined.equals("Player") && verb.equals(" looks at ") ? "each player's"
: libraryPlayers.size() == 1 && libraryPlayers.get(0) == peeker ? "their" :
defString + "'s";
final StringBuilder sb = new StringBuilder();
sb.append(peeker).append(verb).append("the top ");
sb.append(who.equals("") ? peeker : who);
sb.append(verb).append("the top ");
sb.append(numPeek > 1 ? Lang.getNumeral(numPeek) + " cards " : "card ").append("of ").append(whose);
sb.append(" library.");
@@ -58,11 +60,12 @@ public class PeekAndRevealEffect extends SpellAbilityEffect {
final Card source = sa.getHostCard();
final boolean rememberRevealed = sa.hasParam("RememberRevealed");
final boolean imprintRevealed = sa.hasParam("ImprintRevealed");
final boolean noPeek = sa.hasParam("NoPeek");
String revealValid = sa.getParamOrDefault("RevealValid", "Card");
String peekAmount = sa.getParamOrDefault("PeekAmount", "1");
int numPeek = AbilityUtils.calculateAmount(source, peekAmount, sa);
List<Player> libraryPlayers = AbilityUtils.getDefinedPlayers(source, sa.getParam("Defined"), sa);
List<Player> libraryPlayers = getDefinedPlayersOrTargeted(sa);
Player peekingPlayer = sa.getActivatingPlayer();
for (Player libraryToPeek : libraryPlayers) {
@@ -77,17 +80,19 @@ public class PeekAndRevealEffect extends SpellAbilityEffect {
CardCollectionView revealableCards = CardLists.getValidCards(peekCards, revealValid,
sa.getActivatingPlayer(), source, sa);
boolean doReveal = !sa.hasParam("NoReveal") && !revealableCards.isEmpty();
if (!sa.hasParam("NoPeek")) {
if (!noPeek) {
peekingPlayer.getController().reveal(peekCards, ZoneType.Library, libraryToPeek,
CardTranslation.getTranslatedName(source.getName()) + " - " +
Localizer.getInstance().getMessage("lblRevealingCardFrom"));
Localizer.getInstance().getMessage("lblLookingCardFrom"));
}
if (doReveal && sa.hasParam("RevealOptional"))
doReveal = peekingPlayer.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblRevealCardToOtherPlayers"));
if (doReveal) {
peekingPlayer.getGame().getAction().reveal(revealableCards, peekingPlayer);
peekingPlayer.getGame().getAction().reveal(revealableCards, ZoneType.Library, libraryToPeek, !noPeek,
CardTranslation.getTranslatedName(source.getName()) + " - " +
Localizer.getInstance().getMessage("lblRevealingCardFrom"));
if (rememberRevealed) {
Map<Integer, Card> cachedMap = Maps.newHashMap();

View File

@@ -185,6 +185,16 @@ public class PumpEffect extends SpellAbilityEffect {
keywords.addAll(Arrays.asList(sa.getParam("KW").split(" & ")));
}
if (sa.hasParam("IfDesc")) {
if (sa.getParam("IfDesc").equals("True") && sa.hasParam("SpellDescription")) {
String ifDesc = sa.getParam("SpellDescription");
sb.append(ifDesc, 0, ifDesc.indexOf(",") + 1);
} else {
sb.append(sa.getParam("IfDesc"));
}
sb.append(" ");
}
if (sa instanceof AbilitySub & sa.getRootAbility().getTargets().containsAll(tgts)) {
//try to avoid having the same long list of targets twice in a StackDescription
sb.append(tgts.size() == 1 && tgts.get(0) instanceof Card ? "It " : "They ");

View File

@@ -196,6 +196,7 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
private boolean startsGameInPlay = false;
private boolean drawnThisTurn = false;
private boolean foughtThisTurn = false;
private boolean becameTargetThisTurn = false;
private boolean startedTheTurnUntapped = false;
private boolean cameUnderControlSinceLastUpkeep = true; // for Echo
@@ -1863,6 +1864,13 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
drawnThisTurn = b;
}
public final boolean getFoughtThisTurn() {
return foughtThisTurn;
}
public final void setFoughtThisTurn(final boolean b) {
foughtThisTurn = b;
}
public final CardCollectionView getGainControlTargets() { //used primarily with AbilityFactory_GainControl
return CardCollection.getView(gainControlTargets);
}
@@ -6132,7 +6140,7 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
}
if (shieldCounterReplaceDestroy == null) {
String reStr = "Event$ Destroy | ActiveZones$ Battlefield | ValidCard$ Card.Self | ValidSource$ SpellAbility "
+ "| Description$ If this permanent would be destroyed as the result of an effect, instead remove a shield counter from it";
+ "| Description$ If this permanent would be destroyed as the result of an effect, instead remove a shield counter from it.";
shieldCounterReplaceDestroy = ReplacementHandler.parseReplacement(reStr, this, false, null);
shieldCounterReplaceDestroy.setOverridingAbility(AbilityFactory.getAbility(sa, this));
}
@@ -6223,6 +6231,7 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
setRegeneratedThisTurn(0);
resetShield();
setBecameTargetThisTurn(false);
setFoughtThisTurn(false);
clearMustBlockCards();
getDamageHistory().newTurn();
getDamageHistory().setCreatureAttackedLastTurnOf(turn, getDamageHistory().getCreatureAttackedThisTurn());

View File

@@ -1662,7 +1662,7 @@ public class CardFactoryUtil {
inst.addTrigger(myTrigger);
} else if (keyword.startsWith("Replicate")) {
final String trigScript = "Mode$ SpellCast | ValidCard$ Card.Self | CheckSVar$ ReplicateAmount | Secondary$ True | TriggerDescription$ Copy CARDNAME for each time you paid its replicate cost";
final String trigScript = "Mode$ SpellCast | ValidCard$ Card.Self | CheckSVar$ ReplicateAmount | Secondary$ True | TriggerDescription$ Copy CARDNAME for each time you paid its replicate cost.";
final String abString = "DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | Amount$ ReplicateAmount | MayChooseTarget$ True";
final Trigger replicateTrigger = TriggerHandler.parseTrigger(trigScript, card, intrinsic);
@@ -1678,8 +1678,7 @@ public class CardFactoryUtil {
final String actualTrigger = "Mode$ SpellCast | ValidCard$ Card.Self | OptionalDecider$ You | "
+ " Secondary$ True | TriggerDescription$ Ripple " + num + " - CARDNAME";
final String abString = "DB$ Dig | NoMove$ True | DigNum$ " + num +
" | Reveal$ True | RememberRevealed$ True";
final String abString = "DB$ PeekAndReveal | PeekAmount$ " + num + " | RememberRevealed$ True";
final String dbCast = "DB$ Play | Valid$ Card.IsRemembered+sameName | " +
"ValidZone$ Library | WithoutManaCost$ True | Optional$ True | " +

View File

@@ -1113,6 +1113,10 @@ public class CardProperty {
if (card.getDrawnThisTurn()) {
return false;
}
} else if (property.startsWith("FoughtThisTurn")) {
if (!card.getFoughtThisTurn()) {
return false;
}
} else if (property.startsWith("firstTurnControlled")) {
if (!card.isFirstTurnControlled()) {
return false;

View File

@@ -899,12 +899,12 @@ public class Cost implements Serializable {
part.getType().equals(other.getType()) &&
StringUtils.isNumeric(part.getAmount()) &&
StringUtils.isNumeric(other.getAmount())) {
String amount = String.valueOf(Integer.parseInt(part.getAmount()) + Integer.parseInt(other.getAmount()));
String amount = String.valueOf(part.convertAmount() + other.convertAmount());
if (part instanceof CostPutCounter) { // path for Carth & Cumulative Upkeep
if (other instanceof CostPutCounter && ((CostPutCounter)other).getCounter().equals(((CostPutCounter) part).getCounter())) {
costParts.add(new CostPutCounter(amount, ((CostPutCounter) part).getCounter(), part.getType(), part.getTypeDescription()));
} else if (other instanceof CostRemoveCounter && ((CostRemoveCounter)other).counter.is(CounterEnumType.LOYALTY)) {
Integer counters = Integer.parseInt(other.getAmount()) - Integer.parseInt(part.getAmount());
Integer counters = other.convertAmount() - part.convertAmount();
// the cost can turn positive if multiple Carth raise it
if (counters < 0) {
costParts.add(new CostPutCounter(String.valueOf(counters *-1), CounterType.get(CounterEnumType.LOYALTY), part.getType(), part.getTypeDescription()));

View File

@@ -1526,10 +1526,6 @@ public class Player extends GameEntity implements Comparable<Player> {
return newCard;
}
public final int getNumTokensCreatedThisTurn() {
return numTokenCreatedThisTurn;
}
public final void addTokensCreatedThisTurn(Card token) {
numTokenCreatedThisTurn++;
final Map<AbilityKey, Object> runParams = AbilityKey.mapFromPlayer(this);

View File

@@ -248,6 +248,22 @@ public class TriggerSpellAbilityCastOrCopy extends Trigger {
}
}
if (hasParam("ManaFrom")) {
boolean found = false;
for (Mana m : spellAbility.getPayingMana()) {
Card source = m.getSourceCard();
if (source != null) {
if (matchesValidParam("ManaFrom", source)) {
found = true;
break;
}
}
}
if (!found) {
return false;
}
}
if (hasParam("SnowSpentForCardsColor")) {
boolean found = false;
for (Mana m : spellAbility.getPayingMana()) {

View File

@@ -91,7 +91,9 @@ public class DeckController<T extends DeckBase> {
}
public void loadDeck(Deck deck, boolean substituteCurrentDeck) {
boolean isStored;
if (view.getCatalogManager().isInfinite()) {
boolean isInfinite = view.getCatalogManager().isInfinite();
if (isInfinite) {
Deck currentDeck = view.getHumanDeck();
if (substituteCurrentDeck || currentDeck.isEmpty()) {
newModel();
@@ -107,10 +109,14 @@ public class DeckController<T extends DeckBase> {
isStored = false;
}
// not the same as before
Deck currentDeck = view.getHumanDeck();
for (DeckSection section: EnumSet.allOf(DeckSection.class)) {
if (view.isSectionImportable(section)) {
CardPool sectionCards = currentDeck.getOrCreate(section);
if (!isInfinite) {
sectionCards.clear();
}
sectionCards.addAll(deck.getOrCreate(section));
}
}

View File

@@ -2,6 +2,7 @@ package forge.adventure.data;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.utils.Array;
import forge.util.MyRandom;
import java.io.Serializable;
import java.util.ArrayList;
@@ -14,7 +15,7 @@ import java.util.Random;
* contains the information for the biomes
*/
public class BiomeData implements Serializable {
private final Random rand = new Random();
private final Random rand = MyRandom.getRandom();
public float startPointX;
public float startPointY;
public float noiseWeight;
@@ -40,7 +41,7 @@ public class BiomeData implements Serializable {
public ArrayList<EnemyData> getEnemyList() {
if (enemyList == null) {
enemyList = new ArrayList<EnemyData>();
enemyList = new ArrayList<>();
if (enemies == null)
return enemyList;
for (EnemyData data : new Array.ArrayIterator<>(WorldData.getAllEnemies())) {
@@ -68,11 +69,11 @@ public class BiomeData implements Serializable {
}
public EnemyData getEnemy(float difficultyFactor) {
EnemyData bestData=null;
float biggestNumber=0;
EnemyData bestData = null;
float biggestNumber = 0.0f;
for (EnemyData data : enemyList) {
float newNumber=data.spawnRate *rand.nextFloat()*difficultyFactor;
if (newNumber>biggestNumber) {
float newNumber= ( 1.0f + (data.spawnRate * rand.nextFloat()) ) * difficultyFactor;
if (newNumber > biggestNumber) {
biggestNumber=newNumber;
bestData=data;
}

View File

@@ -1,6 +1,8 @@
package forge.adventure.data;
import java.util.List;
/**
* Data class that will be used to read Json configuration files
* BiomeData
@@ -17,4 +19,5 @@ public class ConfigData {
public String[] starterDecks;
public DifficultyData[] difficulties;
public RewardData legalCards;
public List<String> restrictedCards;
}

View File

@@ -12,6 +12,7 @@ public class EnemyData {
public String name;
public String sprite;
public String deck;
public boolean copyPlayerDeck = false;
public String ai;
public float spawnRate;
public float difficulty;
@@ -23,16 +24,17 @@ public class EnemyData {
public EnemyData() { }
public EnemyData(EnemyData enemyData) {
name = enemyData.name;
sprite = enemyData.sprite;
deck = enemyData.deck;
ai = enemyData.ai;
spawnRate = enemyData.spawnRate;
difficulty = enemyData.difficulty;
speed = enemyData.speed;
life = enemyData.life;
equipment = enemyData.equipment;
colors = enemyData.colors;
name = enemyData.name;
sprite = enemyData.sprite;
deck = enemyData.deck;
ai = enemyData.ai;
spawnRate = enemyData.spawnRate;
copyPlayerDeck = enemyData.copyPlayerDeck;
difficulty = enemyData.difficulty;
speed = enemyData.speed;
life = enemyData.life;
equipment = enemyData.equipment;
colors = enemyData.colors;
if(enemyData.rewards == null) {
rewards=null;
} else {

View File

@@ -41,11 +41,8 @@ public class RewardData {
public String cardText;
public boolean matchAllSubTypes;
public RewardData() { }
public RewardData()
{
}
public RewardData(RewardData rewardData) {
type =rewardData.type;
probability =rewardData.probability;
@@ -68,23 +65,24 @@ public class RewardData {
private static Iterable<PaperCard> allCards;
private static Iterable<PaperCard> allEnemyCards;
public Array<Reward> generate(boolean isForEnemy)
{
public Array<Reward> generate(boolean isForEnemy) {
return generate(isForEnemy, null);
}
public Array<Reward> generate(boolean isForEnemy,Iterable<PaperCard> cards)
{
if(allCards==null)
{
RewardData legals=Config.instance().getConfigData().legalCards;
if(legals==null)
{
allCards = FModel.getMagicDb().getCommonCards().getUniqueCardsNoAltNoOnline();
}
else
{
allCards = Iterables.filter(FModel.getMagicDb().getCommonCards().getUniqueCardsNoAltNoOnline(), new CardUtil.CardPredicate(legals, true));
}
public Array<Reward> generate(boolean isForEnemy, Iterable<PaperCard> cards) {
if(allCards==null) {
RewardData legals = Config.instance().getConfigData().legalCards;
if(legals==null) allCards = FModel.getMagicDb().getCommonCards().getUniqueCardsNoAltNoOnline();
else allCards = Iterables.filter(FModel.getMagicDb().getCommonCards().getUniqueCardsNoAltNoOnline(), new CardUtil.CardPredicate(legals, true));
//Filter out specific cards.
allCards = Iterables.filter(allCards, new Predicate<PaperCard>() {
@Override
public boolean apply(PaperCard input){
if(input == null) return false;
return !Config.instance().getConfigData().restrictedCards.contains(input.getName());
}
});
//Filter AI cards for enemies.
allEnemyCards=Iterables.filter(allCards, new Predicate<PaperCard>() {
@Override
public boolean apply(PaperCard input) {
@@ -94,11 +92,10 @@ public class RewardData {
});
}
Array<Reward> ret=new Array<>();
if(probability==0|| WorldSave.getCurrentSave().getWorld().getRandom().nextFloat()<=probability) {
if(type==null||type.isEmpty())
if(probability == 0 || WorldSave.getCurrentSave().getWorld().getRandom().nextFloat() <= probability) {
if(type==null || type.isEmpty())
type="randomCard";
int addedCount=(int)((float)(addMaxCount)* WorldSave.getCurrentSave().getWorld().getRandom().nextFloat());
int addedCount = (int)((float)(addMaxCount)* WorldSave.getCurrentSave().getWorld().getRandom().nextFloat());
if( colors != null && colors.length > 0 ) { //Filter special "colorID" case.
String C = Current.player().getColorIdentityLong();
for(int i = 0; i < colors.length; i++){
@@ -128,26 +125,23 @@ public class RewardData {
}
break;
case "item":
if(itemName!=null&&!itemName.isEmpty())
{
for(int i=0;i<count+addedCount;i++)
{
if(itemName!=null&&!itemName.isEmpty()) {
for(int i=0;i<count+addedCount;i++) {
ret.add(new Reward(ItemData.getItem(itemName)));
}
}
break;
case "deckCard":
if(cards==null)return ret;
for(PaperCard card: CardUtil.generateCards(cards,this, count+addedCount))
{
if(cards == null) return ret;
for(PaperCard card: CardUtil.generateCards(cards,this, count+addedCount)) {
ret.add(new Reward(card));
}
break;
case "gold":
ret.add(new Reward(count+addedCount));
ret.add(new Reward(count + addedCount));
break;
case "life":
ret.add(new Reward(Reward.Type.Life, count+addedCount));
ret.add(new Reward(Reward.Type.Life, count + addedCount));
break;
}
}

View File

@@ -11,19 +11,18 @@ import java.util.HashSet;
* Class to save point of interest changes, like sold cards and dead enemies
*/
public class PointOfInterestChanges implements SaveFileContent {
private final HashSet<Integer> deletedObjects=new HashSet<>();
private final HashMap<Integer, HashSet<Integer>> cardsBought = new HashMap<>();
private java.util.Map<String, Byte> mapFlags = new HashMap<>();
public static class Map extends HashMap<String,PointOfInterestChanges> implements SaveFileContent
{
public static class Map extends HashMap<String,PointOfInterestChanges> implements SaveFileContent {
@Override
public void load(SaveFileData data) {
this.clear();
if(data==null||!data.containsKey("keys"))
return;
if(data==null || !data.containsKey("keys")) return;
String[] keys= (String[]) data.readObject("keys");
for(int i=0;i<keys.length;i++)
{
for(int i=0;i<keys.length;i++) {
SaveFileData elementData = data.readSubData("value_"+i);
PointOfInterestChanges newChanges=new PointOfInterestChanges();
newChanges.load(elementData);
@@ -66,35 +65,21 @@ public class PointOfInterestChanges implements SaveFileContent {
return data;
}
private final HashSet<Integer> deletedObjects=new HashSet<>();
private final HashMap<Integer, HashSet<Integer>> cardsBought=new HashMap<>();
private java.util.Map<String, Byte> mapFlags = new HashMap<>();
public boolean isObjectDeleted(int objectID)
{
return deletedObjects.contains(objectID);
}
public boolean deleteObject(int objectID)
{
return deletedObjects.add(objectID);
}
public boolean isObjectDeleted(int objectID) { return deletedObjects.contains(objectID); }
public boolean deleteObject(int objectID) { return deletedObjects.add(objectID); }
public java.util.Map<String, Byte> getMapFlags() {
return mapFlags;
}
public void buyCard(int objectID, int cardIndex)
{
if( !cardsBought.containsKey(objectID))
{
public void buyCard(int objectID, int cardIndex) {
if( !cardsBought.containsKey(objectID)) {
cardsBought.put(objectID,new HashSet<>());
}
cardsBought.get(objectID).add(cardIndex);
}
public boolean wasCardBought(int objectID, int cardIndex)
{
if( !cardsBought.containsKey(objectID))
{
public boolean wasCardBought(int objectID, int cardIndex) {
if( !cardsBought.containsKey(objectID)) {
return false;
}
return cardsBought.get(objectID).contains(cardIndex);

View File

@@ -111,7 +111,8 @@ public class DuelScene extends ForgeScene {
playerObject.setAvatarIndex(90001);
humanPlayer.setPlayer(playerObject);
humanPlayer.setStartingLife(advPlayer.getLife());
Current.setLatestDeck(enemy.getData().generateDeck());
Deck enemyDeck = ( enemy.getData().copyPlayerDeck ? playerDeck : enemy.getData().generateDeck() );
Current.setLatestDeck(enemyDeck);
RegisteredPlayer aiPlayer = RegisteredPlayer.forVariants(2, appliedVariants, Current.latestDeck(), null, false, null, null);
LobbyPlayer enemyPlayer = GamePlayerUtil.createAiPlayer(this.enemy.getData().name, selectAI(this.enemy.getData().ai));
if(!enemy.nameOverride.isEmpty()) enemyPlayer.setName(enemy.nameOverride); //Override name if defined in the map.

View File

@@ -269,25 +269,25 @@ public class RewardScene extends UIScene {
addListener(new ClickListener() {
@Override
public void clicked(InputEvent event, float x, float y) {
if (Current.player().getGold() >= price) {
if(changes!=null)
changes.buyCard(objectID, index);
Current.player().takeGold(price);
Current.player().addReward(reward.getReward());
if (Current.player().getGold() >= price) {
if(changes!=null)
changes.buyCard(objectID, index);
Current.player().takeGold(price);
Current.player().addReward(reward.getReward());
Gdx.input.vibrate(5);
SoundSystem.instance.play(SoundEffectType.FlipCoin, false);
Gdx.input.vibrate(5);
SoundSystem.instance.play(SoundEffectType.FlipCoin, false);
updateBuyButtons();
goldLabel.setText("Gold: " + String.valueOf(AdventurePlayer.current().getGold()));
if(changes==null)
return;
setDisabled(true);
reward.sold();
getColor().a = 0.5f;
setText("SOLD");
removeListener(this);
}
updateBuyButtons();
goldLabel.setText("Gold: " + String.valueOf(AdventurePlayer.current().getGold()));
if(changes==null)
return;
setDisabled(true);
reward.sold();
getColor().a = 0.5f;
setText("SOLD");
removeListener(this);
}
}
});
}

View File

@@ -373,7 +373,7 @@ public class MapStage extends GameStage {
case "shop":
String shopList = prop.get("shopList").toString();
shopList=shopList.replaceAll("\\s","");
List possibleShops = Arrays.asList(shopList.split(","));
List<String> possibleShops = Arrays.asList(shopList.split(","));
Array<ShopData> shops;
if (possibleShops.size() == 0 || shopList.equals(""))
shops = WorldData.getShopList();
@@ -385,8 +385,7 @@ public class MapStage extends GameStage {
}
}
}
if (shops.size == 0)
continue;
if(shops.size == 0) continue;
ShopData data = shops.get(WorldSave.getCurrentSave().getWorld().getRandom().nextInt(shops.size));
Array<Reward> ret = new Array<>();
@@ -406,6 +405,8 @@ public class MapStage extends GameStage {
}
}
break;
default:
System.err.println("Unexpected value: " + type);
}
}
}
@@ -494,16 +495,14 @@ public class MapStage extends GameStage {
}
currentMob = null;
}
public void removeAllEnemies()
{
public void removeAllEnemies() {
List<Integer> idsToRemove=new ArrayList<>();
for (MapActor actor : new Array.ArrayIterator<>(actors)) {
if (actor instanceof EnemySprite) {
idsToRemove.add(actor.getObjectId());
}
if (actor instanceof EnemySprite) {
idsToRemove.add(actor.getObjectId());
}
}
for(Integer i:idsToRemove)
deleteObject(i);
for(Integer i:idsToRemove) deleteObject(i);
}
@Override

View File

@@ -25,6 +25,7 @@ import forge.adventure.world.WorldSave;
import forge.screens.TransitionScreen;
import forge.sound.SoundEffectType;
import forge.sound.SoundSystem;
import forge.util.MyRandom;
import org.apache.commons.lang3.tuple.Pair;
import java.util.ArrayList;
@@ -40,7 +41,7 @@ public class WorldStage extends GameStage implements SaveFileContent {
private static WorldStage instance=null;
protected EnemySprite currentMob;
protected Random rand = new Random();
protected Random rand = MyRandom.getRandom();
WorldBackground background;
private float spawnDelay = 0;
private final float spawnInterval = 4;//todo config
@@ -194,32 +195,27 @@ public class WorldStage extends GameStage implements SaveFileContent {
}
private void HandleMonsterSpawn(float delta) {
World world = WorldSave.getCurrentSave().getWorld();
int currentBiome = World.highestBiome(world.getBiome((int) player.getX() / world.getTileSize(), (int) player.getY() / world.getTileSize()));
List<BiomeData> biomeData = WorldSave.getCurrentSave().getWorld().getData().GetBiomes();
if (biomeData.size() <= currentBiome)
{
if (biomeData.size() <= currentBiome) {
player.setMoveModifier(1.5f);
return;
}
player.setMoveModifier(1.0f);
BiomeData data = biomeData.get(currentBiome);
if (data == null) return;
spawnDelay -= delta;
if(spawnDelay>=0) return;
spawnDelay=spawnInterval + ( rand.nextFloat() * 4.0f );
if (data == null)
return;
ArrayList<EnemyData> list = data.getEnemyList();
if (list == null)
return;
spawnDelay -= delta;
if(spawnDelay>=0)
EnemyData enemyData = data.getEnemy( 1.0f );
if (enemyData == null)
return;
spawnDelay=spawnInterval+(rand.nextFloat()*4);
EnemyData enemyData = data.getEnemy( 1);
if (enemyData == null) {
return;
}
EnemySprite sprite = new EnemySprite(enemyData);
float unit = Scene.getIntendedHeight() / 6f;
Vector2 spawnPos = new Vector2(1, 1);

View File

@@ -22,7 +22,7 @@ import forge.adventure.util.Config;
import forge.adventure.util.Paths;
import forge.adventure.util.SaveFileContent;
import forge.adventure.util.SaveFileData;
import forge.util.MyRandom;
//import forge.util.MyRandom;
import org.apache.commons.lang3.tuple.Pair;
import java.util.ArrayList;
@@ -46,7 +46,7 @@ public class World implements Disposable, SaveFileContent {
private PointOfInterestMap mapPoiIds;
private BiomeTexture[] biomeTexture;
private long seed;
private final Random random = MyRandom.getRandom();
private final Random random = new Random();
private boolean worldDataLoaded=false;
private Texture globalTexture = null;

View File

@@ -8,6 +8,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import forge.util.MyRandom;
import org.apache.commons.lang3.StringUtils;
import com.badlogic.gdx.utils.Align;
@@ -195,7 +196,20 @@ public class FDeckChooser extends FScreen {
DeckgenUtil.randomSelect(lstDecks);
}
else {
DeckgenUtil.randomSelect(lstDecks);
List<DeckProxy> AIDecks = new ArrayList<>();
int count = 0;
if (isAi) {
for (DeckProxy deckProxy : lstDecks.getPool().toFlatList()) {
if (deckProxy.getAI().inMainDeck == 0) {
AIDecks.add(deckProxy);
count++;
}
}
}
if (count > 10)
lstDecks.setSelectedItem(AIDecks.get(MyRandom.getRandom().nextInt(AIDecks.size())));
else
DeckgenUtil.randomSelect(lstDecks);
}
accept();
}

View File

@@ -129,6 +129,8 @@ public abstract class ItemManager<T extends InventoryItem> extends FContainer im
//build display
add(searchFilter.getWidget());
add(btnSearch);
//fixme - AdvanceSearch for Adventure mode needs GUI update on landscape mode, needs onclose override to close internal EditScreen
btnSearch.setEnabled(!Forge.isMobileAdventureMode);
add(btnView);
add(btnAdvancedSearchOptions);
btnAdvancedSearchOptions.setSelected(!hideFilters);

View File

@@ -11,6 +11,17 @@
"decks/starter/red.json",
"decks/starter/green.json"
],
"restrictedCards": [
"Black Lotus",
"Mox Emerald",
"Mox Pearl",
"Mox Ruby",
"Mox Sapphire",
"Mox Jet",
"Ancestral Recall",
"Timetwister",
"Time Walk"
],
"difficulties": [
{
"name": "Easy",

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.8" tiledversion="1.8.4" orientation="orthogonal" renderorder="right-down" width="30" height="30" tilewidth="16" tileheight="16" infinite="0" nextlayerid="7" nextobjectid="95">
<map version="1.8" tiledversion="1.8.4" orientation="orthogonal" renderorder="right-down" width="30" height="30" tilewidth="16" tileheight="16" infinite="0" nextlayerid="7" nextobjectid="97">
<editorsettings>
<export format="tmx"/>
</editorsettings>
@@ -397,5 +397,15 @@
<property name="enemy" value="Merfolk Soldier"/>
</properties>
</object>
<object id="95" template="../obj/enemy.tx" x="288" y="224">
<properties>
<property name="enemy" value="Doppelganger"/>
</properties>
</object>
<object id="96" template="../obj/enemy.tx" x="304" y="224">
<properties>
<property name="enemy" value="Doppelganger"/>
</properties>
</object>
</objectgroup>
</map>

View File

@@ -0,0 +1,68 @@
doppelganger.png
size: 64,96
format: RGBA8888
filter: Nearest,Nearest
repeat: none
Avatar
xy: 0, 0
size: 16, 16
Idle
xy: 0, 16
size: 16, 16
Idle
xy: 16, 16
size: 16, 16
Idle
xy: 32, 16
size: 16, 16
Idle
xy: 48, 16
size: 16, 16
Walk
xy: 0, 32
size: 16, 16
Walk
xy: 16, 32
size: 16, 16
Walk
xy: 32, 32
size: 16, 16
Walk
xy: 48, 32
size: 16, 16
Attack
xy: 0, 48
size: 16, 16
Attack
xy: 16, 48
size: 16, 16
Attack
xy: 32, 48
size: 16, 16
Attack
xy: 48, 48
size: 16, 16
Hit
xy: 0, 64
size: 16, 16
Hit
xy: 16, 64
size: 16, 16
Hit
xy: 32, 64
size: 16, 16
Hit
xy: 48, 64
size: 16, 16
Death
xy: 0, 80
size: 16, 16
Death
xy: 16, 80
size: 16, 16
Death
xy: 32, 80
size: 16, 16
Death
xy: 48, 80
size: 16, 16

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -23,7 +23,7 @@
"height": 0.7,
"color": "10a2e0",
"spriteNames":["IslandTree" ,"Coral" ,"Shell" ],
"enemies":[ "Bird","Djinn","Elemental","Merfolk","Merfolk Avatar","Merfolk Fighter","Merfolk Lord","Merfolk Soldier","Merfolk warrior","Blue Wiz1","Blue Wiz2","Blue Wiz3","Geist","Rogue","Sea Monster","Tarkir Djinn" ] ,
"enemies":[ "Bird","Djinn","Elemental","Merfolk","Merfolk Avatar","Merfolk Fighter","Merfolk Lord","Merfolk Soldier","Merfolk warrior","Blue Wiz1","Blue Wiz2","Blue Wiz3","Geist","Rogue","Sea Monster","Tarkir Djinn","Doppelganger" ] ,
"pointsOfInterest":[
"Blue Castle",
"Island Town",

View File

@@ -3,7 +3,7 @@
"name": "Adventurer",
"sprite": "sprites/swordsman_3.atlas",
"deck": "decks/adventurer.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 25,
"life": 13,
@@ -27,7 +27,7 @@
"name": "Amonkhet Minotaur",
"sprite": "sprites/warden.atlas",
"deck": "decks/amonkhet_minotaur.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 25,
"life": 16,
@@ -51,7 +51,7 @@
"name": "Ape",
"sprite": "sprites/behemoth.atlas",
"deck": "decks/ape.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 24,
"life": 16,
@@ -75,7 +75,7 @@
"name": "Archer",
"sprite": "sprites/archer_2.atlas",
"deck": "decks/human_archer.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 25,
"life": 11,
@@ -99,7 +99,7 @@
"name": "Ashmouth Devil",
"sprite": "sprites/devil.atlas",
"deck": "decks/ashmouth_devil.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 31,
"life": 18,
@@ -123,7 +123,7 @@
"name": "Axgard Dwarf",
"sprite": "sprites/dwarf_8.atlas",
"deck": "decks/axgard_dwarf.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 22,
"life": 13,
@@ -147,7 +147,7 @@
"name": "Bandit",
"sprite": "sprites/dwarf_7.atlas",
"deck": "decks/bandit.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 24,
"life": 13,
@@ -171,7 +171,7 @@
"name": "Bear",
"sprite": "sprites/bear.atlas",
"deck": "decks/bear.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 25,
"life": 16,
@@ -195,7 +195,7 @@
"name": "Beholder",
"sprite": "sprites/beholder.atlas",
"deck": "decks/beholder.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 31,
"life": 15,
@@ -219,7 +219,7 @@
"name": "Berserker",
"sprite": "sprites/dwarf_5.atlas",
"deck": "decks/berserker.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 22,
"life": 13,
@@ -243,7 +243,7 @@
"name": "Big Zombie",
"sprite": "sprites/zombie_2.atlas",
"deck": "decks/zombie_bad.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 15,
"life": 13,
@@ -278,7 +278,7 @@
"name": "Bird",
"sprite": "sprites/griffin_2.atlas",
"deck": "decks/bird_blue.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 31,
"life": 11,
@@ -302,7 +302,7 @@
"name": "Black Wiz1",
"sprite": "sprites/black_wizard.atlas",
"deck": "decks/black_bad.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 24,
"life": 10,
@@ -326,7 +326,7 @@
"name": "Black Wiz2",
"sprite": "sprites/black_wiz2.atlas",
"deck": "decks/fear.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 24,
"life": 10,
@@ -350,7 +350,7 @@
"name": "Black Wiz3",
"sprite": "sprites/black_wiz3.atlas",
"deck": "decks/black_wiz3.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 24,
"life": 10,
@@ -374,7 +374,7 @@
"name": "Blue Wiz1",
"sprite": "sprites/mage.atlas",
"deck": "decks/blue_bad.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 31,
"life": 10,
@@ -398,7 +398,7 @@
"name": "Blue Wiz2",
"sprite": "sprites/blue_wiz2.atlas",
"deck": "decks/mill.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 24,
"life": 10,
@@ -422,7 +422,7 @@
"name": "Blue Wiz3",
"sprite": "sprites/mage_2.atlas",
"deck": "decks/counter.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 31,
"life": 10,
@@ -446,7 +446,7 @@
"name": "Boggart",
"sprite": "sprites/goblin_2.atlas",
"deck": "decks/eyeblight.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 27,
"life": 8,
@@ -481,7 +481,7 @@
"name": "Cat",
"sprite": "sprites/lion.atlas",
"deck": "decks/cat.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 27,
"life": 15,
@@ -505,7 +505,7 @@
"name": "Cathar",
"sprite": "sprites/cathar.atlas",
"deck": "decks/cathar.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 25,
"life": 13,
@@ -529,7 +529,7 @@
"name": "Centaur",
"sprite": "sprites/centaur.atlas",
"deck": "decks/centaur.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 30,
"life": 16,
@@ -553,7 +553,7 @@
"name": "Centaur Warrior",
"sprite": "sprites/centaur_2.atlas",
"deck": "decks/centaur_warrior.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 30,
"life": 16,
@@ -577,7 +577,7 @@
"name": "ClayGolem",
"sprite": "sprites/golem_2.atlas",
"deck": "decks/golem_good.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 19,
"life": 12,
@@ -610,7 +610,7 @@
"name": "Cleric",
"sprite": "sprites/cleric.atlas",
"deck": "decks/cleric.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 24,
"life": 10,
@@ -634,7 +634,7 @@
"name": "Construct",
"sprite": "sprites/golem_3.atlas",
"deck": "decks/artificer.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 21,
"life": 14,
@@ -658,7 +658,7 @@
"name": "Cyclops",
"sprite": "sprites/cyclops.atlas",
"deck": "decks/cyclops.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 16,
"life": 19,
@@ -682,7 +682,7 @@
"name": "Dark Knight",
"sprite": "sprites/death_knight.atlas",
"deck": "decks/death_knight.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 30,
"life": 15,
@@ -706,7 +706,7 @@
"name": "Dawnhart Witch",
"sprite": "sprites/dawnhart_witch.atlas",
"deck": "decks/dawnhart_witch.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 24,
"life": 10,
@@ -730,7 +730,7 @@
"name": "Death Knight",
"sprite": "sprites/death_knight_2.atlas",
"deck": "decks/death_knight.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 30,
"life": 15,
@@ -754,7 +754,7 @@
"name": "Demon",
"sprite": "sprites/demon_3.atlas",
"deck": "decks/demon.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 31,
"life": 18,
@@ -778,7 +778,7 @@
"name": "Devil",
"sprite": "sprites/imp.atlas",
"deck": "decks/devil.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 24,
"life": 11,
@@ -802,7 +802,7 @@
"name": "Dino",
"sprite": "sprites/ancient.atlas",
"deck": "decks/dinosaurs.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 15,
"life": 19,
@@ -839,7 +839,7 @@
"name": "Dinosaur",
"sprite": "sprites/ancient_2.atlas",
"deck": "decks/dinosaur_w_r.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 15,
"life": 19,
@@ -876,7 +876,7 @@
"name": "Djinn",
"sprite": "sprites/djinn.atlas",
"deck": "decks/djinn.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 32,
"life": 18,
@@ -896,11 +896,34 @@
],
"colors": "RU"
},
{
"name": "Doppelganger",
"sprite": "sprites/doppelganger.atlas",
"deck": "decks/mimic.dck",
"copyPlayerDeck": true,
"spawnRate": 0.95,
"difficulty": 0.1,
"speed": 30,
"life": 20,
"rewards": [
{
"type": "deckCard",
"probability": 1,
"count": 1
},{
"type": "gold",
"probability": 0.3,
"count": 100,
"addMaxCount": 150
}
],
"colors": "C"
},
{
"name": "Dragon",
"sprite": "sprites/dragon.atlas",
"deck": "decks/dragon.dck",
"spawnRate": 0.2,
"spawnRate": 0.95,
"difficulty": 0.1,
"speed": 31,
"life": 19,
@@ -924,7 +947,7 @@
"name": "Dwarf",
"sprite": "sprites/dwarf_2.atlas",
"deck": "decks/dwarf.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 22,
"life": 13,
@@ -948,7 +971,7 @@
"name": "Efreet",
"sprite": "sprites/efreet_2.atlas",
"deck": "decks/efreet.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 31,
"life": 18,
@@ -972,7 +995,7 @@
"name": "Eldraine Faerie",
"sprite": "sprites/pixie.atlas",
"deck": "decks/eldraine_faerie.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 31,
"life": 8,
@@ -996,7 +1019,7 @@
"name": "Eldraine Knight",
"sprite": "sprites/paladin_2.atlas",
"deck": "decks/eldraine_knight.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 30,
"life": 14,
@@ -1020,7 +1043,7 @@
"name": "Eldrazi",
"sprite": "sprites/mindelemental.atlas",
"deck": "decks/eldrazi.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 15,
"life": 19,
@@ -1044,7 +1067,7 @@
"name": "Elemental",
"sprite": "sprites/crystalelemental.atlas",
"deck": "decks/elemental_blue.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 31,
"life": 16,
@@ -1068,7 +1091,7 @@
"name": "Elf",
"sprite": "sprites/druid.atlas",
"deck": "decks/elf_bad.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 24,
"life": 10,
@@ -1103,7 +1126,7 @@
"name": "Elf warrior",
"sprite": "sprites/hunter.atlas",
"deck": "decks/elf_mid.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 25,
"life": 11,
@@ -1138,7 +1161,7 @@
"name": "Elk",
"sprite": "sprites/deer_2.atlas",
"deck": "decks/elk.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 29,
"life": 11,
@@ -1162,7 +1185,7 @@
"name": "Faerie",
"sprite": "sprites/pixie_2.atlas",
"deck": "decks/faerie.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 31,
"life": 8,
@@ -1186,7 +1209,7 @@
"name": "Fire Elemental",
"sprite": "sprites/fireelemental.atlas",
"deck": "decks/fire_elemental.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 24,
"life": 16,
@@ -1210,7 +1233,7 @@
"name": "Flame Elemental",
"sprite": "sprites/magmaelemental.atlas",
"deck": "decks/flame_elemental.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 23,
"life": 17,
@@ -1234,7 +1257,7 @@
"name": "Gargoyle",
"sprite": "sprites/gargoyle.atlas",
"deck": "decks/gargoyle.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 31,
"life": 17,
@@ -1258,7 +1281,7 @@
"name": "Gargoyle 2",
"sprite": "sprites/gargoyle_2.atlas",
"deck": "decks/gargoyle.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 31,
"life": 16,
@@ -1282,7 +1305,7 @@
"name": "Geist",
"sprite": "sprites/ghost.atlas",
"deck": "decks/ghost_blue.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 32,
"life": 15,
@@ -1306,7 +1329,7 @@
"name": "Ghoul",
"sprite": "sprites/ghoul.atlas",
"deck": "decks/ghoul.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 15,
"life": 13,
@@ -1330,7 +1353,7 @@
"name": "Ghost",
"sprite": "sprites/ghost_2.atlas",
"deck": "decks/ghost.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 31,
"life": 14,
@@ -1354,7 +1377,7 @@
"name": "Giant Spider",
"sprite": "sprites/spider_2.atlas",
"deck": "decks/spider_token.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 23,
"life": 15,
@@ -1378,7 +1401,7 @@
"name": "Goblin",
"sprite": "sprites/goblin.atlas",
"deck": "decks/goblin_bad.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 27,
"life": 8,
@@ -1421,7 +1444,7 @@
"name": "Goblin Chief",
"sprite": "sprites/wolf_rider_2.atlas",
"deck": "decks/goblin_good.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 29,
"life": 10,
@@ -1456,7 +1479,7 @@
"name": "Goblin Warrior",
"sprite": "sprites/wolf_rider.atlas",
"deck": "decks/goblin_mid.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 28,
"life": 9,
@@ -1581,7 +1604,7 @@
"name": "Gorgon",
"sprite": "sprites/gorgone.atlas",
"deck": "decks/gorgon.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 25,
"life": 14,
@@ -1605,7 +1628,7 @@
"name": "Gorgon 2",
"sprite": "sprites/gorgonen.atlas",
"deck": "decks/gorgon_2.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 25,
"life": 14,
@@ -1629,7 +1652,7 @@
"name": "Green Beast",
"sprite": "sprites/basilisk.atlas",
"deck": "decks/beast_green.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 22,
"life": 18,
@@ -1653,7 +1676,7 @@
"name": "Green Wiz1",
"sprite": "sprites/green_wiz1.atlas",
"deck": "decks/green_bad.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 24,
"life": 10,
@@ -1677,7 +1700,7 @@
"name": "Green Wiz2",
"sprite": "sprites/green_wiz2.atlas",
"deck": "decks/trample.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 24,
"life": 10,
@@ -1701,7 +1724,7 @@
"name": "Green Wiz3",
"sprite": "sprites/green_wiz3.atlas",
"deck": "decks/ramp.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 24,
"life": 10,
@@ -1725,7 +1748,7 @@
"name": "Griffin",
"sprite": "sprites/griffin.atlas",
"deck": "decks/griffin.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 32,
"life": 15,
@@ -1749,7 +1772,7 @@
"name": "Harpy",
"sprite": "sprites/harpy.atlas",
"deck": "decks/harpy.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 31,
"life": 13,
@@ -1773,7 +1796,7 @@
"name": "Harpy 2",
"sprite": "sprites/harpy_2.atlas",
"deck": "decks/harpy_2.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 31,
"life": 13,
@@ -1797,7 +1820,7 @@
"name": "Hellhound",
"sprite": "sprites/hellhound_2.atlas",
"deck": "decks/hellhound.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 25,
"life": 17,
@@ -1821,7 +1844,7 @@
"name": "High Elf",
"sprite": "sprites/druid_2.atlas",
"deck": "decks/elf_good.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 26,
"life": 12,
@@ -1856,7 +1879,7 @@
"name": "High Vampire",
"sprite": "sprites/vampire_2.atlas",
"deck": "decks/vampire.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 32,
"life": 18,
@@ -1880,7 +1903,7 @@
"name": "Horseman",
"sprite": "sprites/cavalier_2.atlas",
"deck": "decks/horsemanship.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 30,
"life": 14,
@@ -1915,7 +1938,7 @@
"name": "Human",
"sprite": "sprites/pikeman.atlas",
"deck": "decks/human_bad.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 23,
"life": 11,
@@ -1950,7 +1973,7 @@
"name": "Human elite",
"sprite": "sprites/legionite.atlas",
"deck": "decks/human_good.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 25,
"life": 13,
@@ -1985,7 +2008,7 @@
"name": "Human guard",
"sprite": "sprites/swordsman.atlas",
"deck": "decks/human_mid.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 24,
"life": 12,
@@ -2020,7 +2043,7 @@
"name": "Hydra",
"sprite": "sprites/hydra.atlas",
"deck": "decks/hydra.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 15,
"life": 19,
@@ -2055,7 +2078,7 @@
"name": "Immersturm Demon",
"sprite": "sprites/devil_2.atlas",
"deck": "decks/immersturm_demon.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 31,
"life": 17,
@@ -2079,7 +2102,7 @@
"name": "Khan",
"sprite": "sprites/cavalier.atlas",
"deck": "decks/mardu.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 30,
"life": 14,
@@ -2103,7 +2126,7 @@
"name": "Knight",
"sprite": "sprites/paladin.atlas",
"deck": "decks/knight.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 30,
"life": 14,
@@ -2138,7 +2161,7 @@
"name": "Lich",
"sprite": "sprites/lich_2.atlas",
"deck": "decks/lich.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 20,
"life": 17,
@@ -2162,7 +2185,7 @@
"name": "Merfolk",
"sprite": "sprites/waterelemental.atlas",
"deck": "decks/merfolk_bad.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 23,
"life": 12,
@@ -2197,7 +2220,7 @@
"name": "Merfolk Avatar",
"sprite": "sprites/iceelemental.atlas",
"deck": "decks/merfolk_good.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 25,
"life": 14,
@@ -2232,7 +2255,7 @@
"name": "Merfolk Fighter",
"sprite": "sprites/merfolk.atlas",
"deck": "decks/merfolk_lords.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 22,
"life": 13,
@@ -2267,7 +2290,7 @@
"name": "Merfolk Lord",
"sprite": "sprites/merfolk_lord.atlas",
"deck": "decks/merfolk_lord2.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 25,
"life": 14,
@@ -2291,7 +2314,7 @@
"name": "Merfolk Soldier",
"sprite": "sprites/mermaid.atlas",
"deck": "decks/merfolk_v_goblins.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 22,
"life": 13,
@@ -2326,7 +2349,7 @@
"name": "Merfolk warrior",
"sprite": "sprites/airelemental.atlas",
"deck": "decks/merfolk_mid.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 24,
"life": 13,
@@ -2361,7 +2384,7 @@
"name": "Mimic",
"sprite": "sprites/mimic.atlas",
"deck": "decks/mimic.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 15,
"life": 12,
@@ -2385,7 +2408,7 @@
"name": "Minotaur",
"sprite": "sprites/minotaur.atlas",
"deck": "decks/minotaur.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 25,
"life": 16,
@@ -2409,7 +2432,7 @@
"name": "Minotaur Flayer",
"sprite": "sprites/warden_2.atlas",
"deck": "decks/minotaur.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 25,
"life": 16,
@@ -2433,7 +2456,7 @@
"name": "Monk",
"sprite": "sprites/monk.atlas",
"deck": "decks/angel.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 24,
"life": 10,
@@ -2457,7 +2480,7 @@
"name": "Rakdos Devil",
"sprite": "sprites/juggler.atlas",
"deck": "decks/rakdos_devil.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 24,
"life": 11,
@@ -2481,7 +2504,7 @@
"name": "Red Beast",
"sprite": "sprites/basilisk_2.atlas",
"deck": "decks/beast_red.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 23,
"life": 17,
@@ -2505,7 +2528,7 @@
"name": "Red Wiz1",
"sprite": "sprites/enchanter.atlas",
"deck": "decks/red_bad.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 24,
"life": 10,
@@ -2529,7 +2552,7 @@
"name": "Red Wiz2",
"sprite": "sprites/red_wiz2.atlas",
"deck": "decks/haste_burn.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 24,
"life": 10,
@@ -2553,7 +2576,7 @@
"name": "Red Wiz3",
"sprite": "sprites/red_wiz3.atlas",
"deck": "decks/lava_axe.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 24,
"life": 10,
@@ -2577,7 +2600,7 @@
"name": "Rogue",
"sprite": "sprites/rogue.atlas",
"deck": "decks/rogue.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 25,
"life": 11,
@@ -2601,7 +2624,7 @@
"name": "Satyr",
"sprite": "sprites/satyr.atlas",
"deck": "decks/satyr.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 25,
"life": 8,
@@ -2625,7 +2648,7 @@
"name": "Sea Monster",
"sprite": "sprites/leech_2.atlas",
"deck": "decks/sea_monster.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 15,
"life": 19,
@@ -2649,7 +2672,7 @@
"name": "Shaman",
"sprite": "sprites/shaman_2.atlas",
"deck": "decks/shaman.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 24,
"life": 10,
@@ -2673,7 +2696,7 @@
"name": "Skeleton",
"sprite": "sprites/skeleton.atlas",
"deck": "decks/skeleton.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 20,
"life": 11,
@@ -2696,7 +2719,7 @@
"name": "Skeleton Soldier",
"sprite": "sprites/skeleton_2.atlas",
"deck": "decks/skeleton_2.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 20,
"life": 11,
@@ -2719,7 +2742,7 @@
"name": "Sliver",
"sprite": "sprites/sliver.atlas",
"deck": "decks/sliver.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 24,
"life": 14,
@@ -2742,7 +2765,7 @@
"name": "Snake",
"sprite": "sprites/big_snake.atlas",
"deck": "decks/snake.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 25,
"life": 10,
@@ -2766,7 +2789,7 @@
"name": "Spider",
"sprite": "sprites/spider.atlas",
"deck": "decks/spider.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 22,
"life": 10,
@@ -2790,7 +2813,7 @@
"name": "Tarkir Djinn",
"sprite": "sprites/djinn_2.atlas",
"deck": "decks/djinn_tarkir.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 31,
"life": 18,
@@ -2814,7 +2837,7 @@
"name": "Treefolk",
"sprite": "sprites/treant.atlas",
"deck": "decks/treefolk.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 16,
"life": 17,
@@ -2838,7 +2861,7 @@
"name": "Treefolk Guardian",
"sprite": "sprites/treant_2.atlas",
"deck": "decks/treefolk.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 16,
"life": 17,
@@ -2862,7 +2885,7 @@
"name": "Troll",
"sprite": "sprites/troll.atlas",
"deck": "decks/troll.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 25,
"life": 18,
@@ -2886,7 +2909,7 @@
"name": "Vampire",
"sprite": "sprites/vampire.atlas",
"deck": "decks/vampire.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 31,
"life": 17,
@@ -2903,7 +2926,7 @@
"name": "Vampire Lord",
"sprite": "sprites/vampire_3.atlas",
"deck": "decks/vampire_blood_token_fly.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 31,
"life": 18,
@@ -2920,7 +2943,7 @@
"name": "Viashino",
"sprite": "sprites/battler.atlas",
"deck": "decks/viashino.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 25,
"life": 11,
@@ -2944,7 +2967,7 @@
"name": "Viper",
"sprite": "sprites/big_snake_2.atlas",
"deck": "decks/snake.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 25,
"life": 10,
@@ -2968,7 +2991,7 @@
"name": "Werewolf",
"sprite": "sprites/hellhound.atlas",
"deck": "decks/werewolf.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 26,
"life": 16,
@@ -2991,7 +3014,7 @@
"name": "White Dwarf",
"sprite": "sprites/dwarf_6.atlas",
"deck": "decks/white_dwarf.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 22,
"life": 13,
@@ -3015,7 +3038,7 @@
"name": "White Wiz1",
"sprite": "sprites/priest.atlas",
"deck": "decks/white_bad.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 24,
"life": 10,
@@ -3039,7 +3062,7 @@
"name": "White Wiz2",
"sprite": "sprites/white_wiz2.atlas",
"deck": "decks/basri.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 24,
"life": 10,
@@ -3063,7 +3086,7 @@
"name": "White Wiz3",
"sprite": "sprites/white_wiz3.atlas",
"deck": "decks/human_soldier_token.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 24,
"life": 10,
@@ -3088,7 +3111,7 @@
"sprite": "sprites/leech.atlas",
"deck": "decks/wurm.json",
"ai": "reckless",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 15,
"life": 19,
@@ -3123,7 +3146,7 @@
"name": "Yeti",
"sprite": "sprites/yeti_2.atlas",
"deck": "decks/yeti.dck",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 25,
"life": 16,
@@ -3147,7 +3170,7 @@
"name": "Zombie",
"sprite": "sprites/zombie.atlas",
"deck": "decks/zombie_bad.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 15,
"life": 12,
@@ -3182,7 +3205,7 @@
"name": "Zombie Lord",
"sprite": "sprites/lich.atlas",
"deck": "decks/zombie_good.json",
"spawnRate": 0.2,
"spawnRate": 1.0,
"difficulty": 0.1,
"speed": 21,
"life": 18,

View File

@@ -23,7 +23,7 @@
"height": 0.85,
"color": "aeaeae",
"spriteNames":[ "WasteTree","Stone","WasteRock"] ,
"enemies":[ "Bandit","ClayGolem","Construct","Eldrazi","Gargoyle","Gargoyle 2","Golem","Sliver","Black Wiz1","Black Wiz2","Black Wiz3","Blue Wiz1","Blue Wiz2","Blue Wiz3","Green Wiz1","Green Wiz2","Green Wiz3","Red Wiz1","Red Wiz2","Red Wiz3","White Wiz1","White Wiz2","White Wiz3" ] ,
"enemies":[ "Bandit","ClayGolem","Construct","Eldrazi","Gargoyle","Gargoyle 2","Golem","Sliver","Black Wiz1","Black Wiz2","Black Wiz3","Blue Wiz1","Blue Wiz2","Blue Wiz3","Green Wiz1","Green Wiz2","Green Wiz3","Red Wiz1","Red Wiz2","Red Wiz3","White Wiz1","White Wiz2","White Wiz3","Doppelganger" ] ,
"pointsOfInterest":[
"Final Castle",
"Colorless Castle",

View File

@@ -4,6 +4,8 @@ Types:Legendary Creature Bird Dinosaur
PT:3/4
K:Flying
T:Mode$ TokenCreated | ValidPlayer$ You | OnlyFirst$ True | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever you create one or more tokens for the first time each turn, create a 1/1 white Bird creature token with flying.
SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ w_1_1_bird_flying | TokenOwner$ You
SVar:TrigToken:DB$ Token | TokenScript$ w_1_1_bird_flying
A:AB$ PumpAll | Cost$ 3 U R W | ValidCards$ Creature.token+YouCtrl | KW$ Double Strike | SpellDescription$ Creature tokens you control gain double strike until end of turn.
DeckHas:Ability$Token
DeckNeeds:Ability$Token
Oracle:Flying\nWhenever you create one or more tokens for the first time each turn, create a 1/1 white Bird creature token with flying.\n{3}{U}{R}{W}: Creature tokens you control gain double strike until end of turn.

View File

@@ -1,7 +1,7 @@
Name:Artillery Enthusiast
ManaCost:R
Types:Creature Goblin Artificer
PT:1/1
PT:1/2
S:Mode$ Continuous | Affected$ Creature.modified+YouCtrl | AddKeyword$ Menace | Description$ Modified creatures you control have menace.
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigSeek | TriggerDescription$ When CARDNAME enters the battlefield, you may discard a card. If you do, seek a card with mana value equal to that card's mana value.
SVar:TrigSeek:AB$ ChangeZone | Cost$ Discard<1/Card> | Origin$ Library | Destination$ Hand | AtRandom$ True | NoShuffle$ True | Mandatory$ True | NoLooking$ True | NoReveal$ True | ChangeType$ Card.cmcEQX | ChangeNum$ 1

View File

@@ -5,7 +5,7 @@ PT:1/1
K:etbCounter:P1P1:X:no Condition:CARDNAME enters the battlefield with a +1/+1 counter on it for each +1/+1 counter among other creatures you control.
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigDouble | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, double the number of +1/+1 counters on CARDNAME.
SVar:TrigDouble:DB$ MultiplyCounter | Defined$ Self | CounterType$ P1P1
SVar:X:Count$TotalCounters_P1P1_Creature.YouCtrl+Other
SVar:X:Count$Valid Creature.YouCtrl+Other$CardCounters.P1P1
SVar:NeedsToPlay:Creature.YouCtrl+counters_GE1_P1P1
DeckHas:Ability$Counters
Oracle:Ascendant Acolyte enters the battlefield with a +1/+1 counter on it for each +1/+1 counter among other creatures you control.\nAt the beginning of your upkeep, double the number of +1/+1 counters on Ascendant Acolyte.

View File

@@ -5,6 +5,6 @@ PT:3/2
K:Reach
K:Trample
K:etbCounter:P1P1:X:no Condition:CARDNAME enters the battlefield with a +1/+1 counter on it for each other creature you control with a +1/+1 counter on it.
SVar:X:Count$LastStateBattlefield Creature.Other+YouCtrl+counters_GE1_P1P1
SVar:X:Count$Valid Creature.Other+YouCtrl+counters_GE1_P1P1
DeckHints:Ability$Counters
Oracle:Reach, trample\nAvatar of the Resolute enters the battlefield with a +1/+1 counter on it for each other creature you control with a +1/+1 counter on it.

View File

@@ -3,6 +3,6 @@ ManaCost:3 U U
Types:Creature Bird Soldier Wizard
PT:3/3
K:Flying
A:AB$ Dig | Cost$ 1 U | DigNum$ 1 | ValidTgts$ Player | TgtPrompt$ Select target player | Reveal$ True | NoMove$ True | SpellDescription$ Target player reveals the top card of their library.
A:AB$ PeekAndReveal | Cost$ 1 U | ValidTgts$ Player | TgtPrompt$ Select target player | NoPeek$ True | SpellDescription$ Target player reveals the top card of their library.
AI:RemoveDeck:All
Oracle:Flying (This creature can't be blocked except by creatures with flying or reach.)\n{1}{U}: Target player reveals the top card of their library.

View File

@@ -0,0 +1,6 @@
Name:Bane's Invoker
ManaCost:1 W
Types:Creature Human Cleric
PT:2/2
A:AB$ Pump | Cost$ 8 | TargetMin$ 0 | TargetMax$ 2 | NumAtt$ +2 | NumDef$ +2 | KW$ Flying | ValidTgts$ Creature | TgtPrompt$ Select up to two target creatures | PrecostDesc$ Wind Walk - | SpellDescription$ Up to two target creatures each get +2/+2 and gain flying until end of turn.
Oracle:Wind Walk - {8}: Up to two target creatures each get +2/+2 and gain flying until end of turn.

View File

@@ -0,0 +1,6 @@
Name:Bhaal's Invoker
ManaCost:2 R
Types:Creature Dragon Shaman
PT:4/2
A:AB$ DealDamage | Cost$ 8 | Defined$ Opponent | NumDmg$ 4 | PrecostDesc$ Scorching Ray - | SpellDescription$ CARDNAME deals 4 damage to each opponent.
Oracle:Scorching Ray - {8}: Bhaal's Invoker deals 4 damage to each opponent.

View File

@@ -4,7 +4,7 @@ Types:Creature Hydra Mutant
PT:4/4
K:Trample
K:etbCounter:P1P1:Y:no Condition:CARDNAME enters the battlefield with a +1/+1 counter on it for each loyalty counter on planeswalkers you control.
SVar:Y:Count$TotalCounters_LOYALTY_Planeswalker.YouCtrl
SVar:Y:Count$Valid Planeswalker.YouCtrl$CardCounters.LOYALTY
T:Mode$ CounterAddedAll | CounterType$ LOYALTY | Valid$ Planeswalker.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever one or more loyalty counters are put on planeswalkers you control, put that many +1/+1 counters on CARDNAME.
SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ Z
SVar:Z:TriggerCount$Amount

View File

@@ -3,6 +3,6 @@ ManaCost:no cost
Types:Land
K:ETBReplacement:Other:LandTapped
SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionCheckSVar$ ETBCheckSVar2 | ConditionSVarCompare$ GT2 | SpellDescription$ CARDNAME enters the battlefield tapped unless you control two or fewer other lands.
SVar:ETBCheckSVar2:Count$LastStateBattlefield Land.YouCtrl
SVar:ETBCheckSVar2:Count$Valid Land.YouCtrl
A:AB$ Mana | Cost$ T | Produced$ Combo B R | SpellDescription$ Add {B} or {R}.
Oracle:Blackcleave Cliffs enters the battlefield tapped unless you control two or fewer other lands.\n{T}: Add {B} or {R}.

View File

@@ -3,6 +3,6 @@ ManaCost:no cost
Types:Land
K:ETBReplacement:Other:LandTapped
SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionCheckSVar$ ETBCheckSVar2 | ConditionSVarCompare$ GT2 | SpellDescription$ CARDNAME enters the battlefield tapped unless you control two or fewer other lands.
SVar:ETBCheckSVar2:Count$LastStateBattlefield Land.YouCtrl
SVar:ETBCheckSVar2:Count$Valid Land.YouCtrl
A:AB$ Mana | Cost$ T | Produced$ Combo B G | SpellDescription$ Add {B} or {G}.
Oracle:Blooming Marsh enters the battlefield tapped unless you control two or fewer other lands.\n{T}: Add {B} or {G}.

View File

@@ -3,6 +3,6 @@ ManaCost:no cost
Types:Land
K:ETBReplacement:Other:LandTapped
SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionCheckSVar$ ETBCheckSVar2 | ConditionSVarCompare$ GT2 | SpellDescription$ CARDNAME enters the battlefield tapped unless you control two or fewer other lands.
SVar:ETBCheckSVar2:Count$LastStateBattlefield Land.YouCtrl
SVar:ETBCheckSVar2:Count$Valid Land.YouCtrl
A:AB$ Mana | Cost$ T | Produced$ Combo G U | SpellDescription$ Add {G} or {U}.
Oracle:Botanical Sanctum enters the battlefield tapped unless you control two or fewer other lands.\n{T}: Add {G} or {U}.

View File

@@ -2,9 +2,9 @@ Name:Brutal Deceiver
ManaCost:2 R
Types:Creature Spirit
PT:2/2
A:AB$ Dig | Cost$ 1 | DigNum$ 1 | DestinationZone$ Library | LibraryPosition$ 0 | LibraryPosition2$ 0 | NoMove$ True | SpellDescription$ Look at the top card of your library.
A:AB$ Dig | Cost$ 2 | DigNum$ 1 | ActivationLimit$ 1 | Reveal$ True | DestinationZone$ Library | LibraryPosition$ 0 | LibraryPosition2$ 0 | NoMove$ True | RememberRevealed$ True | SubAbility$ TrigPump | SpellDescription$ Reveal the top card of your library. If it's a land card, CARDNAME gets +1/+0 and gains first strike until end of turn. Activate only once each turn.
SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ 1 | KW$ First Strike | ConditionDefined$ Remembered | ConditionPresent$ Card.Land | ConditionCompare$ GE1 | SubAbility$ DBCleanup
A:AB$ PeekAndReveal | Cost$ 1 | NoReveal$ True | SpellDescription$ Look at the top card of your library.
A:AB$ PeekAndReveal | Cost$ 2 | ActivationLimit$ 1 | NoPeek$ True | RememberRevealed$ True | SubAbility$ DBPump | SpellDescription$ Reveal the top card of your library.
SVar:DBPump:DB$ Pump | Defined$ Self | NumAtt$ 1 | KW$ First Strike | ConditionDefined$ Remembered | ConditionPresent$ Card.Land | SubAbility$ DBCleanup | IfDesc$ True | SpellDescription$ If it's a land card, CARDNAME gets +1/+0 and gains first strike until end of turn. Activate only once each turn.
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
AI:RemoveDeck:All
Oracle:{1}: Look at the top card of your library.\n{2}: Reveal the top card of your library. If it's a land card, Brutal Deceiver gets +1/+0 and gains first strike until end of turn. Activate only once each turn.

View File

@@ -2,9 +2,9 @@ Name:Callous Deceiver
ManaCost:2 U
Types:Creature Spirit
PT:1/3
A:AB$ Dig | Cost$ 1 | DigNum$ 1 | DestinationZone$ Library | LibraryPosition$ 0 | LibraryPosition2$ 0 | NoMove$ True | SpellDescription$ Look at the top card of your library.
A:AB$ Dig | Cost$ 2 | DigNum$ 1 | ActivationLimit$ 1 | Reveal$ True | DestinationZone$ Library | LibraryPosition$ 0 | LibraryPosition2$ 0 | NoMove$ True | RememberRevealed$ True | SubAbility$ TrigPump | SpellDescription$ Reveal the top card of your library. If it's a land card, CARDNAME gets +1/+0 and gains flying until end of turn. Activate only once each turn.
SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ 1 | KW$ Flying | ConditionDefined$ Remembered | ConditionPresent$ Card.Land | ConditionCompare$ GE1 | SubAbility$ DBCleanup
A:AB$ PeekAndReveal | Cost$ 1 | NoReveal$ True | SpellDescription$ Look at the top card of your library.
A:AB$ PeekAndReveal | Cost$ 2 | ActivationLimit$ 1 | NoPeek$ True | RememberRevealed$ True | SubAbility$ DBPump | SpellDescription$ Reveal the top card of your library.
SVar:DBPump:DB$ Pump | Defined$ Self | NumAtt$ 1 | KW$ Flying | ConditionDefined$ Remembered | ConditionPresent$ Card.Land | SubAbility$ DBCleanup | IfDesc$ True | SpellDescription$ If it's a land card, CARDNAME gets +1/+0 and gains flying until end of turn. Activate only once each turn.
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
AI:RemoveDeck:All
Oracle:{1}: Look at the top card of your library.\n{2}: Reveal the top card of your library. If it's a land card, Callous Deceiver gets +1/+0 and gains flying until end of turn. Activate only once each turn.

View File

@@ -1,8 +1,8 @@
Name:Candles of Leng
ManaCost:2
Types:Artifact
A:AB$ Dig | Cost$ 4 T | DigNum$ 1 | Reveal$ True | NoMove$ True | RememberRevealed$ True | SubAbility$ DBCandlesChangeZone | SpellDescription$ Reveal the top card of your library. If it has the same name as a card in your graveyard, put it into your graveyard. Otherwise, draw a card.
SVar:DBCandlesChangeZone:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Graveyard | ConditionDefined$ Remembered | ConditionPresent$ Card.sharesNameWith YourGraveyard | ConditionCompare$ GE1 | SubAbility$ DBCandlesDraw
SVar:DBCandlesDraw:DB$ Draw | NumCards$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Card.sharesNameWith YourGraveyard | ConditionCompare$ EQ0 | SubAbility$ DBCandlesCleanup
A:AB$ PeekAndReveal | Cost$ 4 T | NoPeek$ True | RememberRevealed$ True | SubAbility$ DBCandlesChangeZone | SpellDescription$ Reveal the top card of your library.
SVar:DBCandlesChangeZone:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Graveyard | ConditionDefined$ Remembered | ConditionPresent$ Card.sharesNameWith YourGraveyard | SubAbility$ DBCandlesDraw | StackDescription$ If it has the same name as a card in their graveyard, they put it into their graveyard. | SpellDescription$ If it has the same name as a card in your graveyard, put it into your graveyard.
SVar:DBCandlesDraw:DB$ Draw | ConditionDefined$ Remembered | ConditionPresent$ Card.sharesNameWith YourGraveyard | ConditionCompare$ EQ0 | SubAbility$ DBCandlesCleanup | StackDescription$ Otherwise, they draw a card. | SpellDescription$ Otherwise, draw a card.
SVar:DBCandlesCleanup:DB$ Cleanup | ClearRemembered$ True
Oracle:{4}, {T}: Reveal the top card of your library. If it has the same name as a card in your graveyard, put it into your graveyard. Otherwise, draw a card.

View File

@@ -4,5 +4,5 @@ Types:Land Forest Plains
R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplaceWith$ LandTapped | Description$ CARDNAME enters the battlefield tapped unless you control two or more basic lands.
SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionCheckSVar$ ETBCheckSVar | ConditionSVarCompare$ LE1 | SubAbility$ MoveToPlay
SVar:MoveToPlay:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard
SVar:ETBCheckSVar:Count$LastStateBattlefield Land.Basic+YouCtrl
SVar:ETBCheckSVar:Count$Valid Land.Basic+YouCtrl
Oracle:({T}: Add {G} or {W}.)\nCanopy Vista enters the battlefield tapped unless you control two or more basic lands.

View File

@@ -1,7 +1,7 @@
Name:Captain Eberhart
ManaCost:1 W
Types:Legendary Creature Human Soldier
PT:1/1
PT:1/2
K:Double Strike
S:Mode$ ReduceCost | ValidCard$ Card.YouOwn+DrawnThisTurn | Type$ Spell | Amount$ 1 | Description$ Spells cast from among cards you drew this turn cost {1} less to cast.
S:Mode$ RaiseCost | ValidCard$ Card.OppOwn+DrawnThisTurn | Type$ Spell | Amount$ 1 | Description$ Spells cast from among cards your opponents drew this turn cost {1} more to cast.

View File

@@ -3,7 +3,7 @@ ManaCost:no cost
Types:Land
K:ETBReplacement:Other:LandTapped
SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionCheckSVar$ ETBCheckSVar2 | ConditionSVarCompare$ GE2 | SpellDescription$ If you control two or more other lands, CARDNAME enters the battlefield tapped.
SVar:ETBCheckSVar2:Count$LastStateBattlefield Land.YouCtrl
SVar:ETBCheckSVar2:Count$Valid Land.YouCtrl
A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add {W}.
A:AB$ Animate | Cost$ 4 W | Defined$ Self | Power$ 3 | Toughness$ 4 | Types$ Creature,Dragon | Colors$ White | Keywords$ Flying | SpellDescription$ CARDNAME becomes a 3/4 white Dragon creature with flying until end of turn. It's still a land.
Oracle:If you control two or more other lands, Cave of the Frost Dragon enters the battlefield tapped.\n{T}: Add {W}.\n{4}{W}: Cave of the Frost Dragon becomes a 3/4 white Dragon creature with flying until end of turn. It's still a land.

View File

@@ -6,6 +6,6 @@ K:Trample
K:etbCounter:P1P1:X:no Condition:CARDNAME enters the battlefield with a +1/+1 counter on it for each land card in all graveyards.
T:Mode$ ChangesZone | Origin$ Any | Destination$ Graveyard | TriggerZones$ Graveyard | ValidCard$ Card.nonToken+Land | Execute$ TrigReturn | TriggerDescription$ Whenever a land card is put into a graveyard from anywhere, you may pay {G}{G}. If you do, return CARDNAME from your graveyard to your hand.
SVar:TrigReturn:AB$ ChangeZone | Cost$ G G | Defined$ Self | Origin$ Graveyard | Destination$ Hand
SVar:X:Count$LastStateGraveyard Land
SVar:X:Count$ValidGraveyard Land
AI:RemoveDeck:Random
Oracle:Trample\nCentaur Vinecrasher enters the battlefield with a number of +1/+1 counters on it equal to the number of land cards in all graveyards.\nWhenever a land card is put into a graveyard from anywhere, you may pay {G}{G}. If you do, return Centaur Vinecrasher from your graveyard to your hand.

View File

@@ -1,9 +1,9 @@
Name:Cerebral Eruption
ManaCost:2 R R
Types:Sorcery
A:SP$ Dig | Cost$ 2 R R | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | DigNum$ 1 | Reveal$ True | NoMove$ True | RememberRevealed$ True | SubAbility$ DBDamage | SpellDescription$ Target opponent reveals the top card of their library. Cerebral Eruption deals damage equal to the revealed card's mana value to that player and each creature they control. If a land card is revealed this way, return Cerebral Eruption to its owner's hand.
SVar:DBDamage:DB$ DamageAll | ValidCards$ Creature.TargetedPlayerCtrl | ValidPlayers$ Targeted | ValidDescription$ that player and each creature they control. | NumDmg$ X | SubAbility$ DBReturn
SVar:DBReturn:DB$ ChangeZone | Defined$ Parent | Origin$ Stack | Destination$ Hand | ConditionDefined$ Remembered | ConditionPresent$ Land | ConditionCompare$ EQ1 | ConditionDescription$ If a land card is revealed this way, | SubAbility$ DBCleanup
A:SP$ PeekAndReveal | ValidTgts$ Opponent | NoPeek$ True | RememberRevealed$ True | SubAbility$ DBDamage | SpellDescription$ Target opponent reveals the top card of their library.
SVar:DBDamage:DB$ DamageAll | ValidCards$ Creature.TargetedPlayerCtrl | ValidPlayers$ Targeted | NumDmg$ X | SubAbility$ DBReturn | StackDescription$ SpellDescription | SpellDescription$ CARDNAME deals damage equal to the revealed card's mana value to that player and each creature that player controls.
SVar:DBReturn:DB$ ChangeZone | Defined$ Parent | Origin$ Stack | Destination$ Hand | ConditionDefined$ Remembered | ConditionPresent$ Land | StackDescription$ SpellDescription | SubAbility$ DBCleanup | SpellDescription$ If a land card is revealed this way, return CARDNAME to its owner's hand.
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:X:Remembered$CardManaCost
Oracle:Target opponent reveals the top card of their library. Cerebral Eruption deals damage equal to the revealed card's mana value to that player and each creature that player controls. If a land card is revealed this way, return Cerebral Eruption to its owner's hand.

View File

@@ -4,5 +4,5 @@ Types:Land Mountain Forest
R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplaceWith$ LandTapped | Description$ CARDNAME enters the battlefield tapped unless you control two or more basic lands.
SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionCheckSVar$ ETBCheckSVar | ConditionSVarCompare$ LE1 | SubAbility$ MoveToPlay
SVar:MoveToPlay:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard
SVar:ETBCheckSVar:Count$LastStateBattlefield Land.Basic+YouCtrl
SVar:ETBCheckSVar:Count$Valid Land.Basic+YouCtrl
Oracle:({T}: Add {R} or {G}.)\nCinder Glade enters the battlefield tapped unless you control two or more basic lands.

View File

@@ -3,9 +3,9 @@ ManaCost:3 B
Types:Creature Vampire
PT:3/3
K:Deathtouch
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, target opponent discards a card with the greatest mana value among cards in their hand. Create a Blood token.
SVar:TrigDiscard:DB$ Discard | ValidTgts$ Opponent | TgtPrompt$ Select an opponent | NumCards$ 1 | DiscardValid$ Card.cmcEQX | Mode$ TgtChoose | SubAbility$ DBToken
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, target opponent discards a nonland card with the greatest mana value among cards in their hand. Create a Blood token.
SVar:TrigDiscard:DB$ Discard | ValidTgts$ Opponent | TgtPrompt$ Select an opponent | NumCards$ 1 | DiscardValid$ Card.nonLand+cmcEQX | Mode$ TgtChoose | SubAbility$ DBToken
SVar:DBToken:DB$ Token | TokenScript$ c_a_blood_draw
SVar:X:Count$HighestCMC_Card.TargetedPlayerOwn+inZoneHand
DeckHas:Ability$Token|Sacrifice & Type$Blood
Oracle:Deathtouch\nWhen Citystalker Connoisseur enters the battlefield, target opponent discards a card with the greatest mana value among cards in their hand. Create a Blood token.
DeckHas:Ability$Token|Sacrifice & Type$Artifact|Blood
Oracle:Deathtouch\nWhen Citystalker Connoisseur enters the battlefield, target opponent discards a nonland card with the greatest mana value among cards in their hand. Create a Blood token.

View File

@@ -3,6 +3,6 @@ ManaCost:no cost
Types:Land
K:ETBReplacement:Other:LandTapped
SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionCheckSVar$ ETBCheckSVar2 | ConditionSVarCompare$ GT2 | SpellDescription$ CARDNAME enters the battlefield tapped unless you control two or fewer other lands.
SVar:ETBCheckSVar2:Count$LastStateBattlefield Land.YouCtrl
SVar:ETBCheckSVar2:Count$Valid Land.YouCtrl
A:AB$ Mana | Cost$ T | Produced$ Combo W B | SpellDescription$ Add {W} or {B}.
Oracle:Concealed Courtyard enters the battlefield tapped unless you control two or fewer other lands.\n{T}: Add {W} or {B}.

View File

@@ -8,7 +8,7 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | E
SVar:TrigPutCounter:DB$ PutCounter | Defined$ Enchanted | CounterType$ P1P0 | CounterNum$ 1 | SubAbility$ DBDmg
SVar:DBDmg:DB$ DealDamage | Defined$ TriggeredPlayer | DamageSource$ Enchanted | NumDmg$ X | ConditionCheckSVar$ Y | ConditionSVarCompare$ GE3 | SubAbility$ DBDes
SVar:DBDes:DB$ Destroy | Defined$ Enchanted | NoRegen$ True | ConditionCheckSVar$ Y | ConditionSVarCompare$ GE3
SVar:Y:Count$TotalCounters_P1P0_Creature.EnchantedBy
SVar:Y:Count$Valid Creature.EnchantedBy$CardCounters.P1P0
SVar:X:Enchanted$CardPower
AI:RemoveDeck:All
Oracle:Enchant non-Wall creature\nEnchanted creature gets +1/+0.\nAt the beginning of your upkeep, put a +1/+0 counter on enchanted creature. If that creature has three or more +1/+0 counters on it, it deals damage equal to its power to its controller, then destroy that creature and it can't be regenerated.

View File

@@ -3,6 +3,6 @@ ManaCost:no cost
Types:Land
K:ETBReplacement:Other:LandTapped
SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionCheckSVar$ ETBCheckSVar2 | ConditionSVarCompare$ GT2 | SpellDescription$ CARDNAME enters the battlefield tapped unless you control two or fewer other lands.
SVar:ETBCheckSVar2:Count$LastStateBattlefield Land.YouCtrl
SVar:ETBCheckSVar2:Count$Valid Land.YouCtrl
A:AB$ Mana | Cost$ T | Produced$ Combo R G | SpellDescription$ Add {R} or {G}.
Oracle:Copperline Gorge enters the battlefield tapped unless you control two or fewer other lands.\n{T}: Add {R} or {G}.

View File

@@ -1,7 +1,7 @@
Name:Covenant of Minds
ManaCost:4 U
Types:Sorcery
A:SP$ Dig | Cost$ 4 U | DigNum$ 3 | NoMove$ True | Reveal$ True | DestinationZone$ Library | LibraryPosition$ 0 | LibraryPosition2$ 0 | SubAbility$ DBChoice | RememberRevealed$ True | SpellDescription$ Reveal the top three cards of your library. Target opponent may choose to put those cards into your hand. If they don't, put those cards into your graveyard and draw five cards.
A:SP$ PeekAndReveal | PeekAmount$ 3 | NoPeek$ True | SubAbility$ DBChoice | RememberRevealed$ True | StackDescription$ SpellDescription | SpellDescription$ Reveal the top three cards of your library. Target opponent may choose to put those cards into your hand. If they don't, put those cards into your graveyard and draw five cards.
SVar:DBChoice:DB$ GenericChoice | ValidTgts$ Opponent | Choices$ CovenantPutIntoHand,CovenantMillDraw | SubAbility$ DBCleanup
SVar:CovenantPutIntoHand:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Hand | SpellDescription$ You may choose to put those cards into that player's hand.
SVar:CovenantMillDraw:DB$ Mill | Defined$ SourceController | NumCards$ X | SubAbility$ DBDraw | SpellDescription$ If you don't, put those cards into that player's graveyard and that player draws five cards.

View File

@@ -2,10 +2,10 @@ Name:Cruel Deceiver
ManaCost:1 B
Types:Creature Spirit
PT:2/1
A:AB$ Dig | Cost$ 1 | DigNum$ 1 | DestinationZone$ Library | LibraryPosition$ 0 | LibraryPosition2$ 0 | NoMove$ True | SpellDescription$ Look at the top card of your library.
A:AB$ Dig | Cost$ 2 | DigNum$ 1 | ActivationLimit$ 1 | Reveal$ True | DestinationZone$ Library | LibraryPosition$ 0 | LibraryPosition2$ 0 | NoMove$ True | RememberRevealed$ True | SubAbility$ TrigAnimate | SpellDescription$ Reveal the top card of your library. If it's a land card, CARDNAME gains "Whenever CARDNAME deals damage to a creature, destroy that creature" until end of turn. Activate only once each turn.
SVar:TrigAnimate:DB$ Animate | Defined$ Self | Triggers$ TrigDamage | sVars$ TrigDestroy | ConditionDefined$ Remembered | ConditionPresent$ Card.Land | ConditionCompare$ GE1 | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
A:AB$ PeekAndReveal | Cost$ 1 | NoReveal$ True | SpellDescription$ Look at the top card of your library.
A:AB$ PeekAndReveal | Cost$ 2 | ActivationLimit$ 1 | NoPeek$ True | RememberRevealed$ True | SubAbility$ DBAnimate | SpellDescription$ Reveal the top card of your library.
SVar:DBAnimate:DB$ Animate | Defined$ Self | Triggers$ TrigDamage | sVars$ TrigDestroy | ConditionDefined$ Remembered | ConditionPresent$ Card.Land | SubAbility$ DBCleanup | StackDescription$ SpellDescription | SpellDescription$ If it's a land card, CARDNAME gains "Whenever CARDNAME deals damage to a creature, destroy that creature" until end of turn.
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | StackDescription$ None | SpellDescription$ Activate only once each turn.
SVar:TrigDamage:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Creature | TriggerZones$ Battlefield | Execute$ TrigDestroy | TriggerDescription$ Whenever CARDNAME deals damage to a creature, destroy that creature.
SVar:TrigDestroy:DB$ Destroy | Defined$ TriggeredTargetLKICopy
AI:RemoveDeck:All

View File

@@ -1,7 +1,7 @@
Name:Cycle of Life
ManaCost:1 G G
Types:Enchantment
A:AB$ Animate | Cost$ Return<1/CARDNAME> | ValidTgts$ Creature.ThisTurnCast+YouOwn | TgtPrompt$ Select target creature you cast this turn | Power$ 0 | Toughness$ 1 | Duration$ UntilYourNextUpkeep | SubAbility$ DelTrig | SpellDescription$ Target creature you cast this turn has base power and toughness 0/1 until your next upkeep. At the beginning of your next upkeep, put a +1/+1 counter on that creature.
A:AB$ Animate | Cost$ Return<1/CARDNAME> | ValidTgts$ Creature.wasCastByYou+ThisTurnCast | TgtPrompt$ Select target creature you cast this turn | Power$ 0 | Toughness$ 1 | Duration$ UntilYourNextUpkeep | SubAbility$ DelTrig | SpellDescription$ Target creature you cast this turn has base power and toughness 0/1 until your next upkeep. At the beginning of your next upkeep, put a +1/+1 counter on that creature.
SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | RememberObjects$ Targeted | Execute$ TrigGrowth | TriggerDescription$ Put a +1/+1 counter on that creature.
SVar:TrigGrowth:DB$ PutCounter | Defined$ DelayTriggerRemembered | CounterType$ P1P1 | CounterNum$ 1
Oracle:Return Cycle of Life to its owner's hand: Target creature you cast this turn has base power and toughness 0/1 until your next upkeep. At the beginning of your next upkeep, put a +1/+1 counter on that creature.

View File

@@ -2,9 +2,9 @@ Name:Dakra Mystic
ManaCost:U
Types:Creature Merfolk Wizard
PT:1/1
A:AB$ Dig | Cost$ U T | DigNum$ 1 | Defined$ Player | Reveal$ True | NoMove$ True | RememberRevealed$ True | SubAbility$ DBPutRevealed | SpellDescription$ Each player reveals the top card of their library. You may put the revealed cards into their owners' graveyards. If you don't, each player draws a card.
A:AB$ PeekAndReveal | Cost$ U T | Defined$ Player | RememberRevealed$ True | SubAbility$ DBPutRevealed | SpellDescription$ Each player reveals the top card of their library. You may put the revealed cards into their owners' graveyards. If you don't, each player draws a card.
SVar:DBPutRevealed:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Graveyard | Optional$ True | Imprint$ True | SubAbility$ DBDraw
SVar:DBDraw:DB$ Draw | Defined$ Player | NumCards$ 1 | ConditionDefined$ Imprinted | ConditionPresent$ Card | ConditionCompare$ EQ0 | SubAbility$ DBCleanup
SVar:DBDraw:DB$ Draw | Defined$ Player | ConditionDefined$ Imprinted | ConditionPresent$ Card | ConditionCompare$ EQ0 | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True
AI:RemoveDeck:All
Oracle:{U}, {T}: Each player reveals the top card of their library. You may put the revealed cards into their owners' graveyards. If you don't, each player draws a card.

View File

@@ -3,6 +3,6 @@ ManaCost:no cost
Types:Land
K:ETBReplacement:Other:LandTapped
SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionCheckSVar$ ETBCheckSVar2 | ConditionSVarCompare$ GT2 | SpellDescription$ CARDNAME enters the battlefield tapped unless you control two or fewer other lands.
SVar:ETBCheckSVar2:Count$LastStateBattlefield Land.YouCtrl
SVar:ETBCheckSVar2:Count$Valid Land.YouCtrl
A:AB$ Mana | Cost$ T | Produced$ Combo U B | SpellDescription$ Add {U} or {B}.
Oracle:Darkslick Shores enters the battlefield tapped unless you control two or fewer other lands.\n{T}: Add {U} or {B}.

View File

@@ -4,5 +4,5 @@ Types:Land
A:AB$ Mana | Cost$ T | Produced$ Combo B G | SpellDescription$ Add {B} or {G}.
K:ETBReplacement:Other:LandTapped
SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionCheckSVar$ ETBCheckSVar2 | ConditionSVarCompare$ LT2 | SpellDescription$ CARDNAME enters the battlefield tapped unless you control two or more other lands.
SVar:ETBCheckSVar2:Count$LastStateBattlefield Land.YouCtrl
SVar:ETBCheckSVar2:Count$Valid Land.YouCtrl
Oracle:Deathcap Glade enters the battlefield tapped unless you control two or more other lands.\n{T}: Add {B} or {G}.

View File

@@ -4,6 +4,6 @@ Types:Creature Elf Warrior
PT:3/2
K:Vigilance
A:AB$ Draw | Cost$ 5 G T | Defined$ You | NumCards$ 1 | ReduceCost$ X | SpellDescription$ Draw a card. This ability costs {1} less to activate for each +1/+1 counter on creatures you control.
SVar:X:Count$TotalCounters_P1P1_Creature.YouCtrl
SVar:X:Count$Valid Creature.YouCtrl$CardCounters.P1P1
DeckHints:Ability$Counters
Oracle:Vigilance\n{5}{G}, {T}: Draw a card. This ability costs {1} less to activate for each +1/+1 counter on creatures you control.

View File

@@ -3,7 +3,7 @@ ManaCost:no cost
Types:Land
K:ETBReplacement:Other:LandTapped
SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionCheckSVar$ ETBCheckSVar2 | ConditionSVarCompare$ GT1 | SpellDescription$ If you control two or more other lands, CARDNAME enters the battlefield tapped.
SVar:ETBCheckSVar2:Count$LastStateBattlefield Land.YouCtrl
SVar:ETBCheckSVar2:Count$Valid Land.YouCtrl
A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}.
A:AB$ Animate | Cost$ 3 R | Defined$ Self | Power$ 3 | Toughness$ 2 | Types$ Creature,Goblin | Colors$ Red | Triggers$ TrigAttack | SpellDescription$ Until end of turn, CARDNAME becomes a 3/2 red Goblin creature with "Whenever this creature attacks, create a 1/1 red Goblin creature token that's tapped and attacking." It's still a land.
SVar:TrigAttack:Mode$ Attacks | ValidCard$ Creature.Self | Execute$ TrigToken | TriggerDescription$ Whenever CARDNAME attacks, create a 1/1 red Goblin creature token that's tapped and attacking.

View File

@@ -3,6 +3,6 @@ ManaCost:no cost
Types:Land
K:ETBReplacement:Other:LandTapped
SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionCheckSVar$ ETBCheckSVar2 | ConditionSVarCompare$ LT2 | SpellDescription$ CARDNAME enters the battlefield tapped unless you control two or more other lands.
SVar:ETBCheckSVar2:Count$LastStateBattlefield Land.YouCtrl
SVar:ETBCheckSVar2:Count$Valid Land.YouCtrl
A:AB$ Mana | Cost$ T | Produced$ Combo W U | SpellDescription$ Add {W} or {U}.
Oracle:Deserted Beach enters the battlefield tapped unless you control two or more other lands.\n{T}: Add {W} or {U}.

View File

@@ -3,7 +3,7 @@ ManaCost:2 B
Types:Creature Zombie Giant
PT:2/2
K:etbCounter:P1P1:X:no Condition:CARDNAME enters the battlefield with a +1/+1 counter on it for each Zombie card in your graveyard.
SVar:X:Count$LastStateGraveyard Zombie.YouCtrl
SVar:X:Count$ValidGraveyard Zombie.YouCtrl
T:Mode$ SpellCast | ValidCard$ Zombie | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever you cast a Zombie spell, create a tapped 2/2 black Zombie creature token.
SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ b_2_2_zombie | TokenTapped$ True | TokenOwner$ You
SVar:BuffedBy:Zombie

View File

@@ -4,9 +4,9 @@ Types:Creature Djinn
PT:4/4
K:Flying
K:etbCounter:WISH:3
A:AB$ Dig | Cost$ 2 U U SubCounter<1/WISH> | DigNum$ 1 | Reveal$ True | NoMove$ True | ImprintRevealed$ True | SubAbility$ DBPlay | StackDescription$ {p:You} reveals the top card of their library. {p:You} may play that card without paying its mana cost or exile it. | SpellDescription$ Reveal the top card of your library. You may play that card without paying its mana cost. If you don't, exile it.
SVar:DBPlay:DB$ Play | Defined$ Imprinted | Controller$ You | WithoutManaCost$ True | Optional$ True | RememberPlayed$ True | SubAbility$ DBExileIfNotPlayed | StackDescription$ None
SVar:DBExileIfNotPlayed:DB$ ChangeZone | Origin$ Library | Destination$ Exile | Defined$ Imprinted | DefinedPlayer$ You | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ EQ0 | SubAbility$ DBCleanup | StackDescription$ None
A:AB$ PeekAndReveal | Cost$ 2 U U SubCounter<1/WISH> | NoPeek$ True | ImprintRevealed$ True | SubAbility$ DBPlay | | SpellDescription$ Reveal the top card of your library.
SVar:DBPlay:DB$ Play | Defined$ Imprinted | Controller$ You | WithoutManaCost$ True | Optional$ True | RememberPlayed$ True | SubAbility$ DBExileIfNotPlayed | StackDescription$ {p:You} may play that card without paying its mana cost. | SpellDescription$ You may play that card without paying its mana cost.
SVar:DBExileIfNotPlayed:DB$ ChangeZone | Origin$ Library | Destination$ Exile | Defined$ Imprinted | DefinedPlayer$ You | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ EQ0 | SubAbility$ DBCleanup | StackDescription$ If they don't, they exile it. | SpellDescription$ If you don't, exile it.
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True
AI:RemoveDeck:All
Oracle:Flying\nDjinn of Wishes enters the battlefield with three wish counters on it.\n{2}{U}{U}, Remove a wish counter from Djinn of Wishes: Reveal the top card of your library. You may play that card without paying its mana cost. If you don't, exile it.

View File

@@ -3,7 +3,7 @@ ManaCost:4 B
Types:Creature Zombie
PT:0/0
K:etbCounter:P1P1:X:no Condition:CARDNAME enters the battlefield with X +1/+1 counters on it, where X is the number of creature cards in all graveyards.
SVar:X:Count$LastStateGraveyard Creature
SVar:X:Count$ValidGraveyard Creature
SVar:NeedsToPlayVar:X GE4
A:AB$ Pump | Cost$ 2 B SubCounter<1/P1P1> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True | SpellDescription$ Target creature gets -1/-1 until end of turn.
Oracle:Drakestown Forgotten enters the battlefield with X +1/+1 counters on it, where X is the number of creature cards in all graveyards.\n{2}{B}, Remove a +1/+1 counter from Drakestown Forgotten: Target creature gets -1/-1 until end of turn.

View File

@@ -4,5 +4,5 @@ Types:Land
A:AB$ Mana | Cost$ T | Produced$ Combo G U | SpellDescription$ Add {G} or {U}.
K:ETBReplacement:Other:LandTapped
SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionCheckSVar$ ETBCheckSVar2 | ConditionSVarCompare$ LT2 | SpellDescription$ CARDNAME enters the battlefield tapped unless you control two or more other lands.
SVar:ETBCheckSVar2:Count$LastStateBattlefield Land.YouCtrl
SVar:ETBCheckSVar2:Count$Valid Land.YouCtrl
Oracle:Dreamroot Cascade enters the battlefield tapped unless you control two or more other lands.\n{T}: Add {G} or {U}.

View File

@@ -1,10 +1,10 @@
Name:Druidic Satchel
ManaCost:3
Types:Artifact
A:AB$ Dig | Cost$ 2 T | DigNum$ 1 | DestinationZone$ Library | LibraryPosition$ 0 | LibraryPosition2$ 0 | Reveal$ True | NoMove$ True | RememberRevealed$ True | SubAbility$ DBToken | SpellDescription$ Reveal the top card of your library. If it's a creature card, create a 1/1 green Saproling creature token. If it's a land card, put that card onto the battlefield under your control. If it's a noncreature, nonland card, you gain 2 life.
SVar:DBToken:DB$ Token | ConditionDefined$ Remembered | ConditionPresent$ Card.Creature | ConditionCompare$ EQ1 | TokenAmount$ 1 | TokenScript$ g_1_1_saproling | TokenOwner$ You | SubAbility$ DBMove | StackDescription$ If it's a creature card, create a 1/1 green Saproling creature token.
SVar:DBMove:DB$ ChangeZone | ConditionDefined$ Remembered | ConditionPresent$ Card.Land | ConditionCompare$ EQ1 | Defined$ Remembered | Origin$ Library | Destination$ Battlefield | SubAbility$ DBGainLife | StackDescription$ If it's a land card, put that card onto the battlefield under your control.
SVar:DBGainLife:DB$ GainLife | LifeAmount$ 2 | ConditionDefined$ Remembered | ConditionPresent$ Card.nonLand+nonCreature | ConditionCompare$ EQ1 | SubAbility$ DBCleanup | StackDescription$ If it's a noncreature, nonland card, you gain 2 life.
A:AB$ PeekAndReveal | Cost$ 2 T | RememberRevealed$ True | SubAbility$ DBToken | SpellDescription$ Reveal the top card of your library. If it's a creature card, create a 1/1 green Saproling creature token. If it's a land card, put that card onto the battlefield under your control. If it's a noncreature, nonland card, you gain 2 life.
SVar:DBToken:DB$ Token | ConditionDefined$ Remembered | ConditionPresent$ Card.Creature | TokenAmount$ 1 | TokenScript$ g_1_1_saproling | TokenOwner$ You | SubAbility$ DBMove | StackDescription$ If it's a creature card, create a 1/1 green Saproling creature token.
SVar:DBMove:DB$ ChangeZone | ConditionDefined$ Remembered | ConditionPresent$ Card.Land | Defined$ Remembered | Origin$ Library | Destination$ Battlefield | SubAbility$ DBGainLife | StackDescription$ If it's a land card, put that card onto the battlefield under your control.
SVar:DBGainLife:DB$ GainLife | LifeAmount$ 2 | ConditionDefined$ Remembered | ConditionPresent$ Card.nonLand+nonCreature | SubAbility$ DBCleanup | StackDescription$ If it's a noncreature, nonland card, you gain 2 life.
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
DeckHas:Ability$Token|LifeGain
DeckHas:Ability$Token|LifeGain & Type$Saproling
Oracle:{2}, {T}: Reveal the top card of your library. If it's a creature card, create a 1/1 green Saproling creature token. If it's a land card, put that card onto the battlefield under your control. If it's a noncreature, nonland card, you gain 2 life.

View File

@@ -3,9 +3,9 @@ ManaCost:2 W W
Types:Enchantment
S:Mode$ Continuous | AffectedZone$ Hand | Affected$ Card.YouOwn | MayLookAt$ Player | Description$ Play with your hand revealed.
R:Event$ Draw | ActiveZones$ Battlefield | ValidPlayer$ You | ReplaceWith$ EnduringRevealTop | Description$ If you would draw a card, reveal the top card of your library instead. If it's a creature card, put it into your graveyard. Otherwise, draw a card.
SVar:EnduringRevealTop:DB$ Dig | DigNum$ 1 | Reveal$ True | NoMove$ True | RememberRevealed$ True | SubAbility$ DBEnduringGraveyard
SVar:DBEnduringGraveyard:DB$ ChangeZone | Defined$ Remembered | ConditionDefined$ Remembered | ConditionPresent$ Creature | ConditionCompare$ GE1 | Origin$ Library | Destination$ Graveyard | SubAbility$ DBEnduringDraw
SVar:DBEnduringDraw:DB$ Draw | NumCards$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Creature | ConditionCompare$ EQ0 | SubAbility$ DBEnduringCleanup
SVar:EnduringRevealTop:DB$ PeekAndReveal | NoPeek$ True | RememberRevealed$ True | SubAbility$ DBEnduringGraveyard
SVar:DBEnduringGraveyard:DB$ ChangeZone | Defined$ Remembered | ConditionDefined$ Remembered | ConditionPresent$ Creature | Origin$ Library | Destination$ Graveyard | SubAbility$ DBEnduringDraw
SVar:DBEnduringDraw:DB$ Draw | ConditionDefined$ Remembered | ConditionPresent$ Creature | ConditionCompare$ EQ0 | SubAbility$ DBEnduringCleanup
SVar:DBEnduringCleanup:DB$ Cleanup | ClearRemembered$ True
T:Mode$ ChangesZone | ValidCard$ Creature.YouOwn | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigEnduringBounce | TriggerZones$ Battlefield | TriggerDescription$ Whenever a creature is put into your graveyard from the battlefield, return it to your hand.
SVar:TrigEnduringBounce:DB$ ChangeZone | Defined$ TriggeredNewCardLKICopy | Origin$ Graveyard | Destination$ Hand

View File

@@ -1,7 +1,7 @@
Name:Epiphany at the Drownyard
ManaCost:X U
Types:Instant
A:SP$ Dig | Cost$ X U | DigNum$ Y | Reveal$ True | RememberRevealed$ True | NoMove$ True | SubAbility$ DBTwoPiles | AILogic$ PayX | SpellDescription$ Reveal the top X+1 cards of your library and separate them into two piles. An opponent chooses one of those piles. Put that pile into your hand and the other into your graveyard.
A:SP$ PeekAndReveal | Cost$ X U | PeekAmount$ Y | RememberRevealed$ True | NoPeek$ True | SubAbility$ DBTwoPiles | AILogic$ PayX | SpellDescription$ Reveal the top X plus one cards of your library and separate them into two piles. An opponent chooses one of those piles. Put that pile into your hand and the other into your graveyard.
SVar:DBTwoPiles:DB$ TwoPiles | Chooser$ Opponent | DefinedCards$ Remembered | Separator$ You | ChosenPile$ DBHand | UnchosenPile$ DBGrave | AILogic$ Worst
SVar:DBHand:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Hand | SubAbility$ DBCleanup
SVar:DBGrave:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Graveyard | SubAbility$ DBCleanup

View File

@@ -5,7 +5,7 @@ PT:4/4
K:Flying
R:Event$ CreateToken | ActiveZones$ Battlefield | CheckSVar$ X | SVarCompare$ EQ0 | ValidPlayer$ You | PlayerTurn$ True | Optional$ True | ReplaceWith$ DBCopy | Description$ The first time you would create one or more tokens during each of your turns, you may instead choose a creature other than CARDNAME and create that many tokens that are copies of that creature.
SVar:DBCopy:DB$ ReplaceToken | Type$ ReplaceToken | ValidChoices$ Creature.Other | TokenScript$ Chosen
SVar:X:PlayerCountPropertyYou$TokensCreatedThisTurn
SVar:X:Count$ThisTurnEntered_Battlefield_Card.token+YouOwn
DeckHas:Ability$Token
AI:RemoveDeck:All
Oracle:Flying\nThe first time you would create one or more tokens during each of your turns, you may instead choose a creature other than Esix, Fractal Bloom and create that many tokens that are copies of that creature.

View File

@@ -3,11 +3,10 @@ ManaCost:2 U B
Types:Legendary Creature Vampire Assassin
PT:3/5
K:Unblockable
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigExile | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, exile target creature that player controls and put a hit counter on that card. That player loses the game if they own three or more exiled card with counters on them. CARDNAME's owner shuffles CARDNAME into their library.
SVar:TrigExile:DB$ ChangeZone | ValidTgts$ Creature.ControlledBy TriggeredDefendingPlayer | TgtPrompt$ Exile target creature that player controls | Origin$ Battlefield | Destination$ Exile | RememberTargets$ True | SubAbility$ PutCounter
SVar:PutCounter:DB$ PutCounter | Defined$ Remembered | CounterType$ HIT | CounterNum$ 1 | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | SubAbility$ DBLose
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigExile | TriggerDescription$ Whenever NICKNAME deals combat damage to a player, exile target creature that player controls and put a hit counter on that card. That player loses the game if they own three or more exiled cards with hit counters on them. NICKNAME's owner shuffles NICKNAME into their library.
SVar:TrigExile:DB$ ChangeZone | ValidTgts$ Creature.ControlledBy TriggeredDefendingPlayer | TgtPrompt$ Exile target creature that player controls | Origin$ Battlefield | Destination$ Exile | WithCountersType$ HIT | SubAbility$ DBLose
SVar:DBLose:DB$ LosesGame | Defined$ TriggeredTarget | ConditionCheckSVar$ CheckExile | ConditionSVarCompare$ GE3 | SubAbility$ DBShuffle
SVar:CheckExile:Count$ValidExile Card.counters_GE1_HIT+ControlledBy TriggeredDefendingPlayer
SVar:DBShuffle:DB$ ChangeZone | ConditionPresent$ Card.Self | ConditionCompare$ GE1 | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Library | Shuffle$ True
SVar:DBShuffle:DB$ ChangeZone | ConditionPresent$ Card.Self | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Library | Shuffle$ True
DeckHints:Name$Mari, the Killing Quill
Oracle:Etrata, the Silencer can't be blocked.\nWhenever Etrata deals combat damage to a player, exile target creature that player controls and put a hit counter on that card. That player loses the game if they own three or more exiled cards with hit counters on them. Etrata's owner shuffles Etrata into their library.

View File

@@ -1,7 +1,7 @@
Name:Experimental Pilot
ManaCost:U
Types:Creature Human Pilot
PT:1/1
PT:1/2
K:Ward:2
A:AB$ NameCard | Cost$ U Discard<2/Card> | Draft$ True | Defined$ You | ChooseFromList$ Cultivator's Caravan,Bomat Bazaar Barge,Raiders' Karve,Demolition Stomper,Futurist Sentinel,Mechtitan Core,Reckoner Bankbuster,High-Speed Hoverbike,Mindlink Mech,Silent Submersible,Mobile Garrison,Untethered Express,Ovalchase Dragster,Daredevil Dragster,Thundering Chariot | SubAbility$ DBMakeCard | SpellDescription$ Draft a card from CARDNAME's spellbook.
SVar:DBMakeCard:DB$ MakeCard | Name$ ChosenName | Zone$ Hand | SubAbility$ DBCleanup

View File

@@ -1,7 +1,7 @@
Name:Fact or Fiction
ManaCost:3 U
Types:Instant
A:SP$ Dig | DigNum$ 5 | Reveal$ True | RememberRevealed$ True | NoMove$ True | SubAbility$ DBTwoPiles | SpellDescription$ Reveal the top five cards of your library. An opponent separates those cards into two piles. Put one pile into your hand and the other into your graveyard.
A:SP$ PeekAndReveal | PeekAmount$ 5 | RememberRevealed$ True | NoPeek$ True | SubAbility$ DBTwoPiles | SpellDescription$ Reveal the top five cards of your library. An opponent separates those cards into two piles. Put one pile into your hand and the other into your graveyard.
SVar:DBTwoPiles:DB$ TwoPiles | Defined$ You | DefinedCards$ Remembered | Separator$ Opponent | ChosenPile$ DBHand | UnchosenPile$ DBGrave | StackDescription$ An opponent separates those cards into two piles. {p:You} puts one pile into their hand and the other into their graveyard.
SVar:DBHand:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Hand | SubAbility$ DBCleanup
SVar:DBGrave:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Graveyard | SubAbility$ DBCleanup

View File

@@ -2,9 +2,9 @@ Name:Feral Deceiver
ManaCost:3 G
Types:Creature Spirit
PT:3/2
A:AB$ Dig | Cost$ 1 | DigNum$ 1 | DestinationZone$ Library | LibraryPosition$ 0 | LibraryPosition2$ 0 | NoMove$ True | SpellDescription$ Look at the top card of your library.
A:AB$ Dig | Cost$ 2 | DigNum$ 1 | ActivationLimit$ 1 | Reveal$ True | DestinationZone$ Library | LibraryPosition$ 0 | LibraryPosition2$ 0 | NoMove$ True | RememberRevealed$ True | SubAbility$ TrigPump | SpellDescription$ Reveal the top card of your library. If it's a land card, CARDNAME gets +2/+2 and gains trample until end of turn. Activate only once each turn.
SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ 2 | NumDef$ 2 | KW$ Trample | ConditionDefined$ Remembered | ConditionPresent$ Card.Land | ConditionCompare$ GE1 | SubAbility$ DBCleanup
A:AB$ PeekAndReveal | Cost$ 1 | NoReveal$ True | SpellDescription$ Look at the top card of your library.
A:AB$ PeekAndReveal | Cost$ 2 | ActivationLimit$ 1 | NoPeek$ True | RememberRevealed$ True | SubAbility$ DBPump | SpellDescription$ Reveal the top card of your library.
SVar:DBPump:DB$ Pump | Defined$ Self | NumAtt$ 2 | NumDef$ 2 | KW$ Trample | ConditionDefined$ Remembered | ConditionPresent$ Card.Land | SubAbility$ DBCleanup | IfDesc$ True | SpellDescription$ If it's a land card, CARDNAME gets +2/+2 and gains trample until end of turn. Activate only once each turn.
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
AI:RemoveDeck:All
Oracle:{1}: Look at the top card of your library.\n{2}: Reveal the top card of your library. If it's a land card, Feral Deceiver gets +2/+2 and gains trample until end of turn. Activate only once each turn.

View File

@@ -8,7 +8,7 @@ K:Suspend:X:XCantBe0 X G G
T:Mode$ CounterRemoved | ValidCard$ Card.Self | TriggerZones$ Exile | CounterType$ TIME | Execute$ TrigPut | OptionalDecider$ You | TriggerDescription$ Whenever a time counter is removed from CARDNAME while it's exiled, you may put a +1/+1 counter on target creature.
SVar:TrigPut:DB$ PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1
SVar:X:Count$xPaid
SVar:Y:Count$TotalCounters_P1P1_Creature.YouCtrl
SVar:Y:Count$Valid Creature.YouCtrl$CardCounters.P1P1
SVar:NeedsToPlay:Creature.YouCtrl+inZoneBattlefield
DeckHints:Ability$Counters
Oracle:Fungal Behemoth's power and toughness are each equal to the number of +1/+1 counters on creatures you control.\nSuspend X—{X}{G}{G}. X can't be 0. (Rather than cast this card from your hand, you may pay {X}{G}{G} and exile it with X time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.)\nWhenever a time counter is removed from Fungal Behemoth while it's exiled, you may put a +1/+1 counter on target creature.

View File

@@ -2,7 +2,8 @@ Name:Galvanoth
ManaCost:3 R R
Types:Creature Beast
PT:3/3
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDig | OptionalDecider$ You | TriggerDescription$ At the beginning of your upkeep, you may look at the top card of your library. You may cast it without paying its mana cost if it's an instant or sorcery spell.
SVar:TrigDig:DB$ Dig | DigNum$ 1 | NoMove$ True | SubAbility$ TrigPlay
SVar:TrigPlay:DB$ Play | Defined$ TopOfLibrary | WithoutManaCost$ True | ValidSA$ Spell | Optional$ True | ConditionDefined$ TopOfLibrary | ConditionPresent$ Instant,Sorcery | ConditionCompare$ EQ1
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPeek | OptionalDecider$ You | TriggerDescription$ At the beginning of your upkeep, you may look at the top card of your library. You may cast it without paying its mana cost if it's an instant or sorcery spell.
SVar:TrigPeek:DB$ PeekAndReveal | NoReveal$ True | SubAbility$ TrigPlay
SVar:TrigPlay:DB$ Play | Defined$ TopOfLibrary | WithoutManaCost$ True | ValidSA$ Spell | Optional$ True | ConditionDefined$ TopOfLibrary | ConditionPresent$ Instant,Sorcery
DeckNeeds:Type$Instant|Sorcery
Oracle:At the beginning of your upkeep, you may look at the top card of your library. You may cast it without paying its mana cost if it's an instant or sorcery spell.

View File

@@ -2,8 +2,7 @@ Name:Game Preserve
ManaCost:2 G
Types:Enchantment
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigReveal | TriggerDescription$ At the beginning of your upkeep, each player reveals the top card of their library. If all cards revealed this way are creature cards, put those cards onto the battlefield under their owners'control.
SVar:TrigReveal:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ EachDig | SubAbility$ GoToBattlefield
SVar:EachDig:DB$ Dig | Defined$ Remembered | DigNum$ 1 | Reveal$ True | NoMove$ True | RememberRevealed$ True
SVar:TrigReveal:DB$ PeekAndReveal | Defined$ Player | RememberRevealed$ True | SubAbility$ GoToBattlefield
SVar:GoToBattlefield:DB$ ChangeZoneAll | ChangeType$ Card.TopLibrary | Origin$ Library | Destination$ Battlefield | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ0 | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:X:Count$ValidLibrary Card.nonCreature+IsRemembered

View File

@@ -1,7 +1,7 @@
Name:Garruk, Wrath of the Wilds
ManaCost:2 G G
Types:Legendary Planeswalker Garruk
Loyalty:3
Loyalty:4
A:AB$ ChooseCard | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | ChoiceZone$ Hand | Choices$ Card.Creature+YouOwn | ChoiceTitle$ Choose up to one creature card in your hand | Amount$ 1 | SubAbility$ DBEffect | StackDescription$ SpellDescription | SpellDescription$ Choose a creature card in your hand. It perpetually gets +1/+1 and perpetually gains "This spell costs {1} less to cast."
SVar:DBEffect:DB$ Effect | StaticAbilities$ PerpetualAbility,PerpetualP1P1 | Duration$ Permanent | Name$ Garruk, Wrath of the Wilds's Perpetual Effect | SubAbility$ DBCleanup
SVar:PerpetualAbility:Mode$ Continuous | Affected$ Card.ChosenCard | AddStaticAbility$ ReduceCost | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ The chosen card perpetually gets +1/+1 and perpetually gains "This spell costs {1} less to cast."
@@ -10,5 +10,5 @@ SVar:ReduceCost:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$
A:AB$ NameCard | Cost$ SubCounter<1/LOYALTY> | Planeswalker$ True | Draft$ True | Defined$ You | ChooseFromList$ Mosscoat Goriak,Sylvan Brushstrider,Murasa Rootgrazer,Dire Wolf Prowler,Ferocious Pup,Pestilent Wolf,Garruk's Uprising,Dawntreader Elk,Nessian Hornbeetle,Territorial Scythecat,Trufflesnout,Wary Okapi,Scurrid Colony,Barkhide Troll,Underdark Basilisk | SubAbility$ DBMakeCard | StackDescription$ SpellDescription | SpellDescription$ Draft a card from CARDNAME's spellbook and put it onto the battlefield.
SVar:DBMakeCard:DB$ MakeCard | Name$ ChosenName | Zone$ Battlefield | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearNamedCard$ True | ClearChosenCard$ True
A:AB$ PumpAll | Cost$ SubCounter<5/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidCards$ Creature.YouCtrl | NumAtt$ +3 | NumDef$ +3 | KW$ Trample | SpellDescription$ Until end of turn, creatures you control get +3/+3 and gain trample.
Oracle:[+1]: Choose a creature card in your hand. It perpetually gets +1/+1 and perpetually gains "This spell costs {1} less to cast."\n[-1]: Draft a card from Garruk, Wrath of the Wild's spellbook and put it onto the battlefield.\n[-5]: Until end of turn, creatures you control get +3/+3 and gain trample.
A:AB$ PumpAll | Cost$ SubCounter<6/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidCards$ Creature.YouCtrl | NumAtt$ +3 | NumDef$ +3 | KW$ Trample | SpellDescription$ Until end of turn, creatures you control get +3/+3 and gain trample.
Oracle:[+1]: Choose a creature card in your hand. It perpetually gets +1/+1 and perpetually gains "This spell costs {1} less to cast."\n[-1]: Draft a card from Garruk, Wrath of the Wild's spellbook and put it onto the battlefield.\n[-6]: Until end of turn, creatures you control get +3/+3 and gain trample.

View File

@@ -1,7 +1,7 @@
Name:Geist of Regret
ManaCost:4 U
Types:Creature Spirit
PT:4/5
PT:5/5
K:Flying
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeInstant | TriggerDescription$ When CARDNAME enters the battlefield, put a random instant card from your library into your graveyard. Then put a random sorcery card from your library into your graveyard.
SVar:TrigChangeInstant:DB$ ChangeZone | Origin$ Library | Destination$ Graveyard | ChangeType$ Instant.YouOwn | ChangeNum$ 1 | Hidden$ True | AtRandom$ True | NoShuffle$ True | Mandatory$ True | NoLooking$ True | SubAbility$ DBChangeSorcery

View File

@@ -5,5 +5,5 @@ K:Enchant creature
A:SP$ Attach | Cost$ 1 W | ValidTgts$ Creature | AILogic$ Pump
S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ Vigilance | AddAbility$ ABBolster | AddPower$ X | AddToughness$ X | Description$ Enchanted creature gets +1/+1 for each +1/+1 counter on other creatures you control. Enchanted creature has vigilance and "{W}, {T}: Bolster 1."
SVar:ABBolster:AB$ PutCounter | Cost$ W T | Bolster$ True | CounterNum$ 1 | CounterType$ P1P1 | SpellDescription$ Bolster 1.
SVar:X:Count$TotalCounters_P1P1_Creature.YouCtrl+NotEnchantedBy
SVar:X:Count$Valid Creature.YouCtrl+NotEnchantedBy$CardCounters.P1P1
Oracle:Enchant creature\nEnchanted creature gets +1/+1 for each +1/+1 counter on other creatures you control.\nEnchanted creature has vigilance and "{W}, {T}: Bolster 1." (To bolster 1, choose a creature with the least toughness among creatures you control and put a +1/+1 counter on it.)

View File

@@ -4,7 +4,7 @@ Colors:red
Types:Sorcery
K:Suspend:3:R R
A:SP$ ChangeZoneAll | ChangeType$ Permanent.YouOwn | Imprint$ True | Origin$ Battlefield | Destination$ Library | Shuffle$ True | SubAbility$ DBDig | SpellDescription$ Shuffle all permanents you own into your library, then reveal that many cards from the top of your library. Put all non-Aura permanent cards revealed this way onto the battlefield, then do the same for Aura cards, then put the rest on the bottom of your library in a random order.
SVar:DBDig:DB$ Dig | Defined$ You | NoMove$ True | DigNum$ WarpX | RememberRevealed$ True | Reveal$ True | SubAbility$ DBCleanImprint
SVar:DBDig:DB$ PeekAndReveal | NoPeek$ True | PeekAmount$ WarpX | RememberRevealed$ True | SubAbility$ DBCleanImprint
SVar:DBCleanImprint:DB$ Cleanup | ClearImprinted$ True | SubAbility$ ChangePermanent
SVar:WarpX:Imprinted$Amount
SVar:ChangePermanent:DB$ ChangeZoneAll | ChangeType$ Permanent.nonAura+IsRemembered | Origin$ Library | Destination$ Battlefield | ForgetChanged$ True | SubAbility$ ChangeEnchantment

View File

@@ -5,6 +5,6 @@ PT:0/0
K:etbCounter:P1P1:X:no Condition:CARDNAME enters the battlefield with a +1/+1 counter on it for each creature card in your graveyard.
A:AB$ Regenerate | Cost$ 1 SubCounter<1/P1P1> | SpellDescription$ Regenerate CARDNAME.
K:Dredge:6
SVar:X:Count$LastStateGraveyard Creature.YouCtrl
SVar:X:Count$ValidGraveyard Creature.YouCtrl
SVar:NeedsToPlayVar:X GE3
Oracle:Golgari Grave-Troll enters the battlefield with a +1/+1 counter on it for each creature card in your graveyard.\n{1}, Remove a +1/+1 counter from Golgari Grave-Troll: Regenerate Golgari Grave-Troll.\nDredge 6 (If you would draw a card, you may mill six cards instead. If you do, return this card from your graveyard to your hand.)

View File

@@ -4,7 +4,7 @@ Types:Creature Elf Warrior
PT:0/0
K:Haste
K:etbCounter:P1P1:X:no Condition:Undergrowth - CARDNAME enters the battlefield with a +1/+1 counter on it for each creature card in your graveyard.
SVar:X:Count$LastStateGraveyard Creature.YouCtrl
SVar:X:Count$ValidGraveyard Creature.YouCtrl
SVar:NeedsToPlayVar:X GE3
DeckHas:Ability$Counters
Oracle:Haste\nUndergrowth — Golgari Raiders enters the battlefield with a +1/+1 counter on it for each creature card in your graveyard.

View File

@@ -1,7 +1,7 @@
Name:Guided Passage
ManaCost:U R G
Types:Sorcery
A:SP$ Dig | Cost$ U R G | NumCards$ X | Reveal$ True | NoMove$ True | DestinationZone$ Library | LibraryPosition$ 0 | LibraryPosition2$ 0 | SubAbility$ DBCreature | SpellDescription$ Reveal the cards in your library. An opponent chooses from among them a creature card, a land card, and a noncreature, nonland card. You put the chosen cards into your hand. Then shuffle.
A:SP$ PeekAndReveal | PeekAmount$ X | NoPeek$ True | SubAbility$ DBCreature | SpellDescription$ Reveal the cards in your library. An opponent chooses from among them a creature card, a land card, and a noncreature, nonland card. You put the chosen cards into your hand. Then shuffle.
SVar:DBCreature:DB$ ChangeZone | ChangeType$ Creature.YouOwn | ChangeNum$ 1 | Chooser$ Opponent | Origin$ Library | Destination$ Hand | SubAbility$ DBLand
SVar:DBLand:DB$ ChangeZone | ChangeType$ Land.YouOwn | ChangeNum$ 1 | Chooser$ Opponent | Origin$ Library | Destination$ Hand | SubAbility$ DBNonCreatureNonLand
SVar:DBNonCreatureNonLand:DB$ ChangeZone | ChangeType$ Card.nonCreature+nonLand+YouOwn | ChangeNum$ 1 | Chooser$ Opponent | Origin$ Library | Destination$ Hand | Shuffle$ True

View File

@@ -3,7 +3,7 @@ ManaCost:no cost
Types:Land
K:ETBReplacement:Other:LandTapped
SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionCheckSVar$ ETBCheckSVar2 | ConditionSVarCompare$ GE2 | SpellDescription$ If you control two or more other lands, CARDNAME enters the battlefield tapped.
SVar:ETBCheckSVar2:Count$LastStateBattlefield Land.YouCtrl
SVar:ETBCheckSVar2:Count$Valid Land.YouCtrl
A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}.
A:AB$ Animate | Cost$ 5 U | Defined$ Self | Power$ 7 | Toughness$ 7 | Types$ Creature,Giant | Colors$ Blue | Keywords$ Ward:3 | SpellDescription$ Until end of turn, CARDNAME becomes a 7/7 blue Giant creature with ward {3}. It's still a land. (Whenever it becomes the target of a spell or ability an opponent controls, counter it unless that player pays {3}.)
Oracle:If you control two or more other lands, Hall of Storm Giants enters the battlefield tapped.\n{T}: Add {U}.\n{5}{U}: Until end of turn, Hall of Storm Giants becomes a 7/7 blue Giant creature with ward {3}. It's still a land. (Whenever it becomes the target of a spell or ability an opponent controls, counter it unless that player pays {3}.)

View File

@@ -2,10 +2,10 @@ Name:Harsh Deceiver
ManaCost:3 W
Types:Creature Spirit
PT:1/4
A:AB$ Dig | Cost$ 1 | DigNum$ 1 | DestinationZone$ Library | LibraryPosition$ 0 | LibraryPosition2$ 0 | NoMove$ True | SpellDescription$ Look at the top card of your library.
A:AB$ Dig | Cost$ 2 | DigNum$ 1 | ActivationLimit$ 1 | Reveal$ True | DestinationZone$ Library | LibraryPosition$ 0 | LibraryPosition2$ 0 | NoMove$ True | RememberRevealed$ True | SubAbility$ DBUntap | SpellDescription$ Reveal the top card of your library. If it's a land card, untap CARDNAME and it gets +1/+1 until end of turn. Activate only once each turn.
SVar:DBUntap:DB$ Untap | Defined$ Self | SubAbility$ DBPump | ConditionDefined$ Remembered | ConditionPresent$ Card.Land | ConditionCompare$ GE1
SVar:DBPump:DB$ Pump | Defined$ Self | NumAtt$ 1 | NumDef$ 1 | SubAbility$ DBCleanup | ConditionDefined$ Remembered | ConditionPresent$ Card.Land | ConditionCompare$ GE1
A:AB$ PeekAndReveal | Cost$ 1 | NoReveal$ True | SpellDescription$ Look at the top card of your library.
A:AB$ PeekAndReveal | Cost$ 2 | ActivationLimit$ 1 | NoPeek$ True | RememberRevealed$ True | SubAbility$ DBUntap | SpellDescription$ Reveal the top card of your library.
SVar:DBUntap:DB$ Untap | Defined$ Self | SubAbility$ DBPump | ConditionDefined$ Remembered | ConditionPresent$ Card.Land | StackDescription$ SpellDescription | SpellDescription$ If it's a land card, untap CARDNAME
SVar:DBPump:DB$ Pump | Defined$ Self | NumAtt$ 1 | NumDef$ 1 | SubAbility$ DBCleanup | ConditionDefined$ Remembered | ConditionPresent$ Card.Land | StackDescription$ and it gets +1/+1 until end of turn. | SpellDescription$ and it gets +1/+1 until end of turn. Activate only once each turn.
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
AI:RemoveDeck:All
Oracle:{1}: Look at the top card of your library.\n{2}: Reveal the top card of your library. If it's a land card, untap Harsh Deceiver and it gets +1/+1 until end of turn. Activate only once each turn.

View File

@@ -4,5 +4,5 @@ Types:Land
A:AB$ Mana | Cost$ T | Produced$ Combo B R | SpellDescription$ Add {B} or {R}.
K:ETBReplacement:Other:LandTapped
SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionCheckSVar$ ETBCheckSVar2 | ConditionSVarCompare$ LT2 | SpellDescription$ CARDNAME enters the battlefield tapped unless you control two or more other lands.
SVar:ETBCheckSVar2:Count$LastStateBattlefield Land.YouCtrl
SVar:ETBCheckSVar2:Count$Valid Land.YouCtrl
Oracle:Haunted Ridge enters the battlefield tapped unless you control two or more other lands.\n{T}: Add {B} or {R}.

View File

@@ -1,7 +1,7 @@
Name:Haunting Imitation
ManaCost:2 U
Types:Sorcery
A:SP$ Dig | Defined$ Player | DigNum$ 1 | Reveal$ True | NoMove$ True | RememberRevealed$ True | SubAbility$ DBRepeatEach | StackDescription$ SpellDescription | SpellDescription$ Each player reveals the top card of their library. For each creature card revealed this way, create a token that's a copy of that card, except it's 1/1, it's a Spirit in addition to its other types, and it has flying. If no creature cards were revealed this way, return Haunting Imitation to its owner's hand.
A:SP$ PeekAndReveal | Defined$ Player | RememberRevealed$ True | SubAbility$ DBRepeatEach | StackDescription$ SpellDescription | SpellDescription$ Each player reveals the top card of their library. For each creature card revealed this way, create a token that's a copy of that card, except it's 1/1, it's a Spirit in addition to its other types, and it has flying. If no creature cards were revealed this way, return Haunting Imitation to its owner's hand.
SVar:DBRepeatEach:DB$ RepeatEach | RepeatCards$ Creature.IsRemembered | Zone$ Library | UseImprinted$ True | RepeatSubAbility$ DBToken | SubAbility$ DBReturn
SVar:DBToken:DB$ CopyPermanent | Defined$ Imprinted | SetPower$ 1 | SetToughness$ 1 | AddTypes$ Spirit | AddKeywords$ Flying
SVar:DBReturn:DB$ ChangeZone | Defined$ Parent | Origin$ Stack | Destination$ Hand | ConditionDefined$ Remembered | ConditionPresent$ Creature | ConditionCompare$ EQ0 | SubAbility$ DBCleanup | StackDescription$ None

View File

@@ -3,7 +3,7 @@ ManaCost:no cost
Types:Land
K:ETBReplacement:Other:LandTapped
SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionCheckSVar$ ETBCheckSVar2 | ConditionSVarCompare$ GE2 | SpellDescription$ If you control two or more other lands, CARDNAME enters the battlefield tapped.
SVar:ETBCheckSVar2:Count$LastStateBattlefield Land.YouCtrl
SVar:ETBCheckSVar2:Count$Valid Land.YouCtrl
A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}.
A:AB$ Animate | Cost$ 3 B | Defined$ Self | Power$ 3 | Toughness$ 3 | Types$ Creature,Beholder | Colors$ Black | Keywords$ Menace | Triggers$ TrigAttack | SpellDescription$ Until end of turn, CARDNAME becomes a 3/3 black Beholder creature with menace and "Whenever this creature attacks, exile target card from defending player's graveyard." It's still a land.
SVar:TrigAttack:Mode$ Attacks | ValidCard$ Creature.Self | Execute$ TrigChangeZone | TriggerDescription$ Whenever this creature attacks, exile target card from defending player's graveyard.

Some files were not shown because too many files have changed in this diff Show More