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); 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(); sacThreshold = SpecialCardAi.DesecrationDemon.getSacThreshold();
} else if (considerSacThreshold != -1) { } else if (considerSacThreshold != -1) {
sacThreshold = considerSacThreshold; sacThreshold = considerSacThreshold;
@@ -1227,12 +1224,12 @@ public class ComputerUtil {
final Game game = sa.getActivatingPlayer().getGame(); final Game game = sa.getActivatingPlayer().getGame();
final PhaseHandler ph = game.getPhaseHandler(); final PhaseHandler ph = game.getPhaseHandler();
return (sa.getHostCard().isCreature() return sa.getHostCard().isCreature()
&& sa.getPayCosts().hasTapCost() && sa.getPayCosts().hasTapCost()
&& (ph.getPhase().isBefore(PhaseType.COMBAT_DECLARE_BLOCKERS) && (ph.getPhase().isBefore(PhaseType.COMBAT_DECLARE_BLOCKERS)
&& !ph.getNextTurn().equals(sa.getActivatingPlayer())) && !ph.getNextTurn().equals(sa.getActivatingPlayer()))
&& !sa.getHostCard().hasSVar("EndOfTurnLeavePlay") && !sa.getHostCard().hasSVar("EndOfTurnLeavePlay")
&& !sa.hasParam("ActivationPhases")); && !sa.hasParam("ActivationPhases");
} }
//returns true if it's better to wait until blockers are declared). //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) { public static CardCollection getSafeTargets(final Player ai, SpellAbility sa, CardCollectionView validCards) {
CardCollection safeCards = new CardCollection(validCards); CardCollection safeCards = CardLists.filter(validCards, new Predicate<Card>() {
safeCards = CardLists.filter(safeCards, new Predicate<Card>() {
@Override @Override
public boolean apply(final Card c) { public boolean apply(final Card c) {
if (c.getController() == ai) { if (c.getController() == ai) {
@@ -2615,8 +2611,7 @@ public class ComputerUtil {
} }
public static Card getKilledByTargeting(final SpellAbility sa, CardCollectionView validCards) { public static Card getKilledByTargeting(final SpellAbility sa, CardCollectionView validCards) {
CardCollection killables = new CardCollection(validCards); CardCollection killables = CardLists.filter(validCards, new Predicate<Card>() {
killables = CardLists.filter(killables, new Predicate<Card>() {
@Override @Override
public boolean apply(final Card c) { public boolean apply(final Card c) {
return c.getController() != sa.getActivatingPlayer() && c.getSVar("Targeting").equals("Dies"); 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.Predicate;
import com.google.common.base.Predicates; import com.google.common.base.Predicates;
import forge.ai.ComputerUtil;
import forge.ai.ComputerUtilCard; import forge.ai.ComputerUtilCard;
import forge.ai.SpellAbilityAi; import forge.ai.SpellAbilityAi;
import forge.game.card.Card; import forge.game.card.Card;
@@ -20,6 +21,7 @@ public class MutateAi extends SpellAbilityAi {
@Override @Override
protected boolean canPlayAI(Player aiPlayer, SpellAbility sa) { protected boolean canPlayAI(Player aiPlayer, SpellAbility sa) {
CardCollectionView mutateTgts = CardLists.getTargetableCards(aiPlayer.getCreaturesInPlay(), sa); CardCollectionView mutateTgts = CardLists.getTargetableCards(aiPlayer.getCreaturesInPlay(), sa);
mutateTgts = ComputerUtil.getSafeTargets(aiPlayer, sa, mutateTgts);
// Filter out some abilities that are useless // Filter out some abilities that are useless
// TODO: add other stuff useless for Mutate here // TODO: add other stuff useless for Mutate here

View File

@@ -1,7 +1,9 @@
package forge.ai.ability; package forge.ai.ability;
import forge.ai.AiAttackController;
import forge.ai.SpellAbilityAi; import forge.ai.SpellAbilityAi;
import forge.ai.SpellApiToAi; import forge.ai.SpellApiToAi;
import forge.game.card.Card;
import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.Player; import forge.game.player.Player;
@@ -9,6 +11,7 @@ import forge.game.player.PlayerActionConfirmMode;
import forge.game.spellability.AbilityStatic; import forge.game.spellability.AbilityStatic;
import forge.game.spellability.AbilitySub; import forge.game.spellability.AbilitySub;
import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
/** /**
* TODO: Write javadoc for this type. * 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 // So far this only appears on Triggers, but will expand
// once things get converted from Dig + NoMove // 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; return true;
} }

View File

@@ -133,6 +133,10 @@ public class UntapAi extends SpellAbilityAi {
CardCollection list = CardLists.getTargetableCards(targetController.getCardsIn(ZoneType.Battlefield), sa); CardCollection list = CardLists.getTargetableCards(targetController.getCardsIn(ZoneType.Battlefield), sa);
if (!sa.isCurse()) {
list = ComputerUtil.getSafeTargets(ai, sa, list);
}
if (list.isEmpty()) { if (list.isEmpty()) {
return false; 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, private boolean untapTargetList(final Card source, final TargetRestrictions tgt, final SpellAbility sa, final boolean mandatory,
final CardCollection tapList) { final CardCollection tapList) {
for (final Card c : sa.getTargets().getTargetCards()) { tapList.removeAll(sa.getTargets().getTargetCards());
tapList.remove(c);
}
if (tapList.isEmpty()) { if (tapList.isEmpty()) {
return false; 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 // Need to apply any static effects to produce correct triggers
checkStaticAbilities(); checkStaticAbilities();
@@ -592,8 +594,6 @@ public class GameAction {
} }
game.getTriggerHandler().registerActiveTrigger(copied, false); game.getTriggerHandler().registerActiveTrigger(copied, false);
table.replaceCounterEffect(game, null, true);
// play the change zone sound // play the change zone sound
game.fireEvent(new GameEventCardChangeZone(c, zoneFrom, zoneTo)); 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); 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); return doXMath(list.size(), expr, c, ctb);
} }
@@ -2416,16 +2413,6 @@ public class AbilityUtils {
return doXMath(cmc, expr, c, ctb); 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 // Count$AttackersDeclared
if (sq[0].startsWith("AttackersDeclared")) { if (sq[0].startsWith("AttackersDeclared")) {
List<Card> attackers = player.getCreaturesAttackedThisTurn(); List<Card> attackers = player.getCreaturesAttackedThisTurn();
@@ -2688,20 +2675,6 @@ public class AbilityUtils {
return MyRandom.getRandom().nextInt(1+max-min) + min; 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$ThisTurnCast <Valid>
// Count$LastTurnCast <Valid> // Count$LastTurnCast <Valid>
if (sq[0].startsWith("ThisTurnCast") || sq[0].startsWith("LastTurnCast")) { if (sq[0].startsWith("ThisTurnCast") || sq[0].startsWith("LastTurnCast")) {
@@ -2756,13 +2729,27 @@ public class AbilityUtils {
String[] paidparts = l[0].split("\\$", 2); String[] paidparts = l[0].split("\\$", 2);
String[] lparts = paidparts[0].split(" ", 2); String[] lparts = paidparts[0].split(" ", 2);
final CardCollectionView cardsInZones; CardCollectionView cardsInZones = null;
if (lparts[0].contains("All")) { if (lparts[0].contains("All")) {
cardsInZones = game.getCardsInGame(); cardsInZones = game.getCardsInGame();
} else { } else {
cardsInZones = lparts[0].length() > 5 final List<ZoneType> zones = ZoneType.listValueOf(lparts[0].length() > 5 ? lparts[0].substring(5) : "Battlefield");
? game.getCardsIn(ZoneType.listValueOf(lparts[0].substring(5))) boolean usedLastState = false;
: game.getCardsIn(ZoneType.Battlefield); 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; int cnt;
@@ -2775,7 +2762,7 @@ public class AbilityUtils {
} }
if (sq[0].startsWith("MostCardName")) { if (sq[0].startsWith("MostCardName")) {
String[] lparts = l[0].split(" ", 2); String[] lparts = l[0].split(" ", 2);
final String[] rest = lparts[1].split(","); final String[] rest = lparts[1].split(",");
final CardCollectionView cardsInZones = lparts[0].length() > 12 final CardCollectionView cardsInZones = lparts[0].length() > 12
@@ -2859,6 +2846,19 @@ public class AbilityUtils {
} }
return doXMath(powers.size(), expr, c, ctb); 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 // Complex counting methods
CardCollectionView someCards = getCardListForXCount(c, player, sq, ctb); CardCollectionView someCards = getCardListForXCount(c, player, sq, ctb);
@@ -3448,10 +3448,6 @@ public class AbilityUtils {
return doXMath(player.getNumDiscardedThisTurn(), m, source, ctb); return doXMath(player.getNumDiscardedThisTurn(), m, source, ctb);
} }
if (value.contains("TokensCreatedThisTurn")) {
return doXMath(player.getNumTokensCreatedThisTurn(), m, source, ctb);
}
if (value.contains("AttackersDeclared")) { if (value.contains("AttackersDeclared")) {
return doXMath(player.getCreaturesAttackedThisTurn().size(), m, source, ctb); return doXMath(player.getCreaturesAttackedThisTurn().size(), m, source, ctb);
} }

View File

@@ -68,7 +68,9 @@ public class CopyPermanentEffect extends TokenEffectBase {
if (sa.hasParam("AddTriggers")) { if (sa.hasParam("AddTriggers")) {
final String oDesc = sa.getDescription(); 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) { if (addKWs) {
sb.append(" and ").append(trigStg); sb.append(" and ").append(trigStg);
} else { } else {

View File

@@ -2,6 +2,7 @@ package forge.game.ability.effects;
import java.util.Map; import java.util.Map;
import forge.game.card.*;
import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Pair;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
@@ -12,10 +13,6 @@ import forge.game.Game;
import forge.game.GameEntity; import forge.game.GameEntity;
import forge.game.ability.AbilityUtils; import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect; 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.Player;
import forge.game.player.PlayerController; import forge.game.player.PlayerController;
import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbility;
@@ -126,15 +123,26 @@ public class CountersRemoveEffect extends SpellAbilityEffect {
} }
CardCollectionView srcCards = null; CardCollectionView srcCards = null;
String title = Localizer.getInstance().getMessage("lblChooseCardsToTakeTargetCounters", counterType.getName());
if (sa.hasParam("ValidSource")) { if (sa.hasParam("ValidSource")) {
srcCards = game.getCardsIn(ZoneType.Battlefield); srcCards = game.getCardsIn(ZoneType.Battlefield);
srcCards = CardLists.getValidCards(srcCards, sa.getParam("ValidSource"), player, card, sa); srcCards = CardLists.getValidCards(srcCards, sa.getParam("ValidSource"), player, card, sa);
if (num.equals("Any")) { if (num.equals("Any")) {
String title = Localizer.getInstance().getMessage("lblChooseCardsToTakeTargetCounters", counterType.getName());
Map<String, Object> params = Maps.newHashMap(); Map<String, Object> params = Maps.newHashMap();
params.put("CounterType", counterType); params.put("CounterType", counterType);
srcCards = player.getController().chooseCardsForEffect(srcCards, sa, title, 0, srcCards.size(), true, params); 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 { } else {
srcCards = getTargetCards(sa); srcCards = getTargetCards(sa);
} }
@@ -171,7 +179,7 @@ public class CountersRemoveEffect extends SpellAbilityEffect {
Map<String, Object> params = Maps.newHashMap(); Map<String, Object> params = Maps.newHashMap();
params.put("Target", gameCard); params.put("Target", gameCard);
params.put("CounterType", counterType); 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); cntToRemove = pc.chooseNumber(sa, title, 0, cntToRemove, params);
} }
} }

View File

@@ -47,7 +47,7 @@ public class DigEffect extends SpellAbilityEffect {
verb = " exiles "; verb = " exiles ";
} }
sb.append(host.getController()).append(verb).append("the top "); 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())) { if (tgtPlayers.contains(host.getController())) {
sb.append("their "); sb.append("their ");

View File

@@ -40,7 +40,10 @@ public class DrawEffect extends SpellAbilityEffect {
sb.append(" each"); sb.append(" each");
} }
sb.append(Lang.joinVerb(tgtPlayers, " draw")).append(" "); 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("."); sb.append(".");
} }

View File

@@ -165,7 +165,9 @@ public class FightEffect extends DamageBaseEffect {
damageMap.put(fighterA, fighterB, dmg1); damageMap.put(fighterA, fighterB, dmg1);
damageMap.put(fighterB, fighterA, dmg2); damageMap.put(fighterB, fighterA, dmg2);
fighterB.setFoughtThisTurn(true);
} }
fighterA.setFoughtThisTurn(true);
if (!usedDamageMap) { if (!usedDamageMap) {
sa.getHostCard().getGame().getAction().dealDamage(false, damageMap, preventMap, counterTable, sa); 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"; ? GameActionUtil.generatedMana(sa) : "mana";
sb.append("Add ").append(toManaString(mana)).append("."); sb.append("Add ").append(toManaString(mana)).append(".");
if (sa.hasParam("RestrictValid")) { if (sa.hasParam("RestrictValid")) {
String desc = sa.getDescription(); sb.append(" ");
int i = desc.indexOf("Spend this"); final String desc = sa.getDescription();
sb.append(" ").append(desc, i, desc.indexOf(".", i) + 1); 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(); return sb.toString();
} }

View File

@@ -29,21 +29,23 @@ public class PeekAndRevealEffect extends SpellAbilityEffect {
@Override @Override
protected String getStackDescription(SpellAbility sa) { protected String getStackDescription(SpellAbility sa) {
final Player peeker = sa.getActivatingPlayer(); final Player peeker = sa.getActivatingPlayer();
final int numPeek = sa.hasParam("PeekAmount") ? final int numPeek = sa.hasParam("PeekAmount") ?
AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("PeekAmount"), sa) : 1; AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("PeekAmount"), sa) : 1;
final String verb = sa.hasParam("NoReveal") || sa.hasParam("RevealOptional") ? " looks at " : final String verb = sa.hasParam("NoReveal") || sa.hasParam("RevealOptional") ? " looks at " :
" reveals "; " reveals ";
final String defined = sa.getParamOrDefault("Defined", "their"); final String defined = sa.getParamOrDefault("Defined", "");
String whose; final List<Player> libraryPlayers = getDefinedPlayersOrTargeted(sa);
if (defined.equals("Player")) { final String defString = Lang.joinHomogenous(libraryPlayers);
whose = "each player's"; String who = defined.equals("Player") && verb.equals(" reveals ") ? "Each player" :
} else { // other else ifs for specific defined can be added above as needs arise sa.hasParam("NoPeek") && verb.equals(" reveals ") ? defString : "";
whose = Lang.joinHomogenous(getTargetPlayers(sa)); 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(); 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(numPeek > 1 ? Lang.getNumeral(numPeek) + " cards " : "card ").append("of ").append(whose);
sb.append(" library."); sb.append(" library.");
@@ -58,11 +60,12 @@ public class PeekAndRevealEffect extends SpellAbilityEffect {
final Card source = sa.getHostCard(); final Card source = sa.getHostCard();
final boolean rememberRevealed = sa.hasParam("RememberRevealed"); final boolean rememberRevealed = sa.hasParam("RememberRevealed");
final boolean imprintRevealed = sa.hasParam("ImprintRevealed"); final boolean imprintRevealed = sa.hasParam("ImprintRevealed");
final boolean noPeek = sa.hasParam("NoPeek");
String revealValid = sa.getParamOrDefault("RevealValid", "Card"); String revealValid = sa.getParamOrDefault("RevealValid", "Card");
String peekAmount = sa.getParamOrDefault("PeekAmount", "1"); String peekAmount = sa.getParamOrDefault("PeekAmount", "1");
int numPeek = AbilityUtils.calculateAmount(source, peekAmount, sa); 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(); Player peekingPlayer = sa.getActivatingPlayer();
for (Player libraryToPeek : libraryPlayers) { for (Player libraryToPeek : libraryPlayers) {
@@ -77,17 +80,19 @@ public class PeekAndRevealEffect extends SpellAbilityEffect {
CardCollectionView revealableCards = CardLists.getValidCards(peekCards, revealValid, CardCollectionView revealableCards = CardLists.getValidCards(peekCards, revealValid,
sa.getActivatingPlayer(), source, sa); sa.getActivatingPlayer(), source, sa);
boolean doReveal = !sa.hasParam("NoReveal") && !revealableCards.isEmpty(); boolean doReveal = !sa.hasParam("NoReveal") && !revealableCards.isEmpty();
if (!sa.hasParam("NoPeek")) { if (!noPeek) {
peekingPlayer.getController().reveal(peekCards, ZoneType.Library, libraryToPeek, peekingPlayer.getController().reveal(peekCards, ZoneType.Library, libraryToPeek,
CardTranslation.getTranslatedName(source.getName()) + " - " + CardTranslation.getTranslatedName(source.getName()) + " - " +
Localizer.getInstance().getMessage("lblRevealingCardFrom")); Localizer.getInstance().getMessage("lblLookingCardFrom"));
} }
if (doReveal && sa.hasParam("RevealOptional")) if (doReveal && sa.hasParam("RevealOptional"))
doReveal = peekingPlayer.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblRevealCardToOtherPlayers")); doReveal = peekingPlayer.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblRevealCardToOtherPlayers"));
if (doReveal) { 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) { if (rememberRevealed) {
Map<Integer, Card> cachedMap = Maps.newHashMap(); 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(" & "))); 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)) { if (sa instanceof AbilitySub & sa.getRootAbility().getTargets().containsAll(tgts)) {
//try to avoid having the same long list of targets twice in a StackDescription //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 "); 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 startsGameInPlay = false;
private boolean drawnThisTurn = false; private boolean drawnThisTurn = false;
private boolean foughtThisTurn = false;
private boolean becameTargetThisTurn = false; private boolean becameTargetThisTurn = false;
private boolean startedTheTurnUntapped = false; private boolean startedTheTurnUntapped = false;
private boolean cameUnderControlSinceLastUpkeep = true; // for Echo private boolean cameUnderControlSinceLastUpkeep = true; // for Echo
@@ -1863,6 +1864,13 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
drawnThisTurn = b; 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 public final CardCollectionView getGainControlTargets() { //used primarily with AbilityFactory_GainControl
return CardCollection.getView(gainControlTargets); return CardCollection.getView(gainControlTargets);
} }
@@ -6132,7 +6140,7 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
} }
if (shieldCounterReplaceDestroy == null) { if (shieldCounterReplaceDestroy == null) {
String reStr = "Event$ Destroy | ActiveZones$ Battlefield | ValidCard$ Card.Self | ValidSource$ SpellAbility " 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 = ReplacementHandler.parseReplacement(reStr, this, false, null);
shieldCounterReplaceDestroy.setOverridingAbility(AbilityFactory.getAbility(sa, this)); shieldCounterReplaceDestroy.setOverridingAbility(AbilityFactory.getAbility(sa, this));
} }
@@ -6223,6 +6231,7 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
setRegeneratedThisTurn(0); setRegeneratedThisTurn(0);
resetShield(); resetShield();
setBecameTargetThisTurn(false); setBecameTargetThisTurn(false);
setFoughtThisTurn(false);
clearMustBlockCards(); clearMustBlockCards();
getDamageHistory().newTurn(); getDamageHistory().newTurn();
getDamageHistory().setCreatureAttackedLastTurnOf(turn, getDamageHistory().getCreatureAttackedThisTurn()); getDamageHistory().setCreatureAttackedLastTurnOf(turn, getDamageHistory().getCreatureAttackedThisTurn());

View File

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

View File

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

View File

@@ -899,12 +899,12 @@ public class Cost implements Serializable {
part.getType().equals(other.getType()) && part.getType().equals(other.getType()) &&
StringUtils.isNumeric(part.getAmount()) && StringUtils.isNumeric(part.getAmount()) &&
StringUtils.isNumeric(other.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 (part instanceof CostPutCounter) { // path for Carth & Cumulative Upkeep
if (other instanceof CostPutCounter && ((CostPutCounter)other).getCounter().equals(((CostPutCounter) part).getCounter())) { if (other instanceof CostPutCounter && ((CostPutCounter)other).getCounter().equals(((CostPutCounter) part).getCounter())) {
costParts.add(new CostPutCounter(amount, ((CostPutCounter) part).getCounter(), part.getType(), part.getTypeDescription())); costParts.add(new CostPutCounter(amount, ((CostPutCounter) part).getCounter(), part.getType(), part.getTypeDescription()));
} else if (other instanceof CostRemoveCounter && ((CostRemoveCounter)other).counter.is(CounterEnumType.LOYALTY)) { } 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 // the cost can turn positive if multiple Carth raise it
if (counters < 0) { if (counters < 0) {
costParts.add(new CostPutCounter(String.valueOf(counters *-1), CounterType.get(CounterEnumType.LOYALTY), part.getType(), part.getTypeDescription())); 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; return newCard;
} }
public final int getNumTokensCreatedThisTurn() {
return numTokenCreatedThisTurn;
}
public final void addTokensCreatedThisTurn(Card token) { public final void addTokensCreatedThisTurn(Card token) {
numTokenCreatedThisTurn++; numTokenCreatedThisTurn++;
final Map<AbilityKey, Object> runParams = AbilityKey.mapFromPlayer(this); 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")) { if (hasParam("SnowSpentForCardsColor")) {
boolean found = false; boolean found = false;
for (Mana m : spellAbility.getPayingMana()) { for (Mana m : spellAbility.getPayingMana()) {

View File

@@ -91,7 +91,9 @@ public class DeckController<T extends DeckBase> {
} }
public void loadDeck(Deck deck, boolean substituteCurrentDeck) { public void loadDeck(Deck deck, boolean substituteCurrentDeck) {
boolean isStored; boolean isStored;
if (view.getCatalogManager().isInfinite()) { boolean isInfinite = view.getCatalogManager().isInfinite();
if (isInfinite) {
Deck currentDeck = view.getHumanDeck(); Deck currentDeck = view.getHumanDeck();
if (substituteCurrentDeck || currentDeck.isEmpty()) { if (substituteCurrentDeck || currentDeck.isEmpty()) {
newModel(); newModel();
@@ -107,10 +109,14 @@ public class DeckController<T extends DeckBase> {
isStored = false; isStored = false;
} }
// not the same as before
Deck currentDeck = view.getHumanDeck(); Deck currentDeck = view.getHumanDeck();
for (DeckSection section: EnumSet.allOf(DeckSection.class)) { for (DeckSection section: EnumSet.allOf(DeckSection.class)) {
if (view.isSectionImportable(section)) { if (view.isSectionImportable(section)) {
CardPool sectionCards = currentDeck.getOrCreate(section); CardPool sectionCards = currentDeck.getOrCreate(section);
if (!isInfinite) {
sectionCards.clear();
}
sectionCards.addAll(deck.getOrCreate(section)); 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.graphics.Color;
import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Array;
import forge.util.MyRandom;
import java.io.Serializable; import java.io.Serializable;
import java.util.ArrayList; import java.util.ArrayList;
@@ -14,7 +15,7 @@ import java.util.Random;
* contains the information for the biomes * contains the information for the biomes
*/ */
public class BiomeData implements Serializable { public class BiomeData implements Serializable {
private final Random rand = new Random(); private final Random rand = MyRandom.getRandom();
public float startPointX; public float startPointX;
public float startPointY; public float startPointY;
public float noiseWeight; public float noiseWeight;
@@ -40,7 +41,7 @@ public class BiomeData implements Serializable {
public ArrayList<EnemyData> getEnemyList() { public ArrayList<EnemyData> getEnemyList() {
if (enemyList == null) { if (enemyList == null) {
enemyList = new ArrayList<EnemyData>(); enemyList = new ArrayList<>();
if (enemies == null) if (enemies == null)
return enemyList; return enemyList;
for (EnemyData data : new Array.ArrayIterator<>(WorldData.getAllEnemies())) { for (EnemyData data : new Array.ArrayIterator<>(WorldData.getAllEnemies())) {
@@ -68,11 +69,11 @@ public class BiomeData implements Serializable {
} }
public EnemyData getEnemy(float difficultyFactor) { public EnemyData getEnemy(float difficultyFactor) {
EnemyData bestData=null; EnemyData bestData = null;
float biggestNumber=0; float biggestNumber = 0.0f;
for (EnemyData data : enemyList) { for (EnemyData data : enemyList) {
float newNumber=data.spawnRate *rand.nextFloat()*difficultyFactor; float newNumber= ( 1.0f + (data.spawnRate * rand.nextFloat()) ) * difficultyFactor;
if (newNumber>biggestNumber) { if (newNumber > biggestNumber) {
biggestNumber=newNumber; biggestNumber=newNumber;
bestData=data; bestData=data;
} }

View File

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

View File

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

View File

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

View File

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

View File

@@ -111,7 +111,8 @@ public class DuelScene extends ForgeScene {
playerObject.setAvatarIndex(90001); playerObject.setAvatarIndex(90001);
humanPlayer.setPlayer(playerObject); humanPlayer.setPlayer(playerObject);
humanPlayer.setStartingLife(advPlayer.getLife()); 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); 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)); 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. 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() { addListener(new ClickListener() {
@Override @Override
public void clicked(InputEvent event, float x, float y) { public void clicked(InputEvent event, float x, float y) {
if (Current.player().getGold() >= price) { if (Current.player().getGold() >= price) {
if(changes!=null) if(changes!=null)
changes.buyCard(objectID, index); changes.buyCard(objectID, index);
Current.player().takeGold(price); Current.player().takeGold(price);
Current.player().addReward(reward.getReward()); Current.player().addReward(reward.getReward());
Gdx.input.vibrate(5); Gdx.input.vibrate(5);
SoundSystem.instance.play(SoundEffectType.FlipCoin, false); SoundSystem.instance.play(SoundEffectType.FlipCoin, false);
updateBuyButtons(); updateBuyButtons();
goldLabel.setText("Gold: " + String.valueOf(AdventurePlayer.current().getGold())); goldLabel.setText("Gold: " + String.valueOf(AdventurePlayer.current().getGold()));
if(changes==null) if(changes==null)
return; return;
setDisabled(true); setDisabled(true);
reward.sold(); reward.sold();
getColor().a = 0.5f; getColor().a = 0.5f;
setText("SOLD"); setText("SOLD");
removeListener(this); removeListener(this);
} }
} }
}); });
} }

View File

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

View File

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

View File

@@ -8,6 +8,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import forge.util.MyRandom;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import com.badlogic.gdx.utils.Align; import com.badlogic.gdx.utils.Align;
@@ -195,7 +196,20 @@ public class FDeckChooser extends FScreen {
DeckgenUtil.randomSelect(lstDecks); DeckgenUtil.randomSelect(lstDecks);
} }
else { 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(); accept();
} }

View File

@@ -129,6 +129,8 @@ public abstract class ItemManager<T extends InventoryItem> extends FContainer im
//build display //build display
add(searchFilter.getWidget()); add(searchFilter.getWidget());
add(btnSearch); 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(btnView);
add(btnAdvancedSearchOptions); add(btnAdvancedSearchOptions);
btnAdvancedSearchOptions.setSelected(!hideFilters); btnAdvancedSearchOptions.setSelected(!hideFilters);

View File

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

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?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> <editorsettings>
<export format="tmx"/> <export format="tmx"/>
</editorsettings> </editorsettings>
@@ -397,5 +397,15 @@
<property name="enemy" value="Merfolk Soldier"/> <property name="enemy" value="Merfolk Soldier"/>
</properties> </properties>
</object> </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> </objectgroup>
</map> </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, "height": 0.7,
"color": "10a2e0", "color": "10a2e0",
"spriteNames":["IslandTree" ,"Coral" ,"Shell" ], "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":[ "pointsOfInterest":[
"Blue Castle", "Blue Castle",
"Island Town", "Island Town",

View File

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

View File

@@ -23,7 +23,7 @@
"height": 0.85, "height": 0.85,
"color": "aeaeae", "color": "aeaeae",
"spriteNames":[ "WasteTree","Stone","WasteRock"] , "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":[ "pointsOfInterest":[
"Final Castle", "Final Castle",
"Colorless Castle", "Colorless Castle",

View File

@@ -4,6 +4,8 @@ Types:Legendary Creature Bird Dinosaur
PT:3/4 PT:3/4
K:Flying K:Flying
T:Mode$ TokenCreated | ValidPlayer$ You | OnlyFirst$ True | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever you create one or more tokens for the first time each turn, create a 1/1 white Bird creature token with flying. T:Mode$ 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. 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. 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 Name:Artillery Enthusiast
ManaCost:R ManaCost:R
Types:Creature Goblin Artificer 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. 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. 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 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. 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. 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: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 SVar:NeedsToPlay:Creature.YouCtrl+counters_GE1_P1P1
DeckHas:Ability$Counters 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. 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:Reach
K:Trample 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. 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 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. 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 Types:Creature Bird Soldier Wizard
PT:3/3 PT:3/3
K:Flying 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 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. 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 PT:4/4
K:Trample 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. 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. 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:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ Z
SVar:Z:TriggerCount$Amount SVar:Z:TriggerCount$Amount

View File

@@ -3,6 +3,6 @@ ManaCost:no cost
Types:Land Types:Land
K:ETBReplacement:Other:LandTapped 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: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}. 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}. 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 Types:Land
K:ETBReplacement:Other:LandTapped 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: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}. 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}. 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 Types:Land
K:ETBReplacement:Other:LandTapped 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: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}. 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}. 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 ManaCost:2 R
Types:Creature Spirit Types:Creature Spirit
PT:2/2 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$ PeekAndReveal | Cost$ 1 | NoReveal$ 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. A:AB$ PeekAndReveal | Cost$ 2 | ActivationLimit$ 1 | NoPeek$ True | RememberRevealed$ True | SubAbility$ DBPump | SpellDescription$ Reveal the top card of your library.
SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ 1 | KW$ First Strike | ConditionDefined$ Remembered | ConditionPresent$ Card.Land | ConditionCompare$ GE1 | SubAbility$ DBCleanup 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 SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
AI:RemoveDeck:All 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. 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 ManaCost:2 U
Types:Creature Spirit Types:Creature Spirit
PT:1/3 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$ PeekAndReveal | Cost$ 1 | NoReveal$ 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. A:AB$ PeekAndReveal | Cost$ 2 | ActivationLimit$ 1 | NoPeek$ True | RememberRevealed$ True | SubAbility$ DBPump | SpellDescription$ Reveal the top card of your library.
SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ 1 | KW$ Flying | ConditionDefined$ Remembered | ConditionPresent$ Card.Land | ConditionCompare$ GE1 | SubAbility$ DBCleanup 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 SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
AI:RemoveDeck:All 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. 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 Name:Candles of Leng
ManaCost:2 ManaCost:2
Types:Artifact 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. 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 | ConditionCompare$ GE1 | SubAbility$ DBCandlesDraw 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 | NumCards$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Card.sharesNameWith YourGraveyard | ConditionCompare$ EQ0 | SubAbility$ DBCandlesCleanup 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 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. 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. 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: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: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. 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 Name:Captain Eberhart
ManaCost:1 W ManaCost:1 W
Types:Legendary Creature Human Soldier Types:Legendary Creature Human Soldier
PT:1/1 PT:1/2
K:Double Strike 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$ 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. 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 Types:Land
K:ETBReplacement:Other:LandTapped 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: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$ 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. 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. 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. 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. 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: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 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. 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 Name:Cerebral Eruption
ManaCost:2 R R ManaCost:2 R R
Types:Sorcery 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. 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 | ValidDescription$ that player and each creature they control. | NumDmg$ X | SubAbility$ DBReturn 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 | ConditionCompare$ EQ1 | ConditionDescription$ If a land card is revealed this way, | SubAbility$ DBCleanup 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:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:X:Remembered$CardManaCost 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. 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. 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: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: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. 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 Types:Creature Vampire
PT:3/3 PT:3/3
K:Deathtouch 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. 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.cmcEQX | Mode$ TgtChoose | SubAbility$ DBToken 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:DBToken:DB$ Token | TokenScript$ c_a_blood_draw
SVar:X:Count$HighestCMC_Card.TargetedPlayerOwn+inZoneHand SVar:X:Count$HighestCMC_Card.TargetedPlayerOwn+inZoneHand
DeckHas:Ability$Token|Sacrifice & Type$Blood DeckHas:Ability$Token|Sacrifice & Type$Artifact|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. 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 Types:Land
K:ETBReplacement:Other:LandTapped 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: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}. 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}. 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: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: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: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 SVar:X:Enchanted$CardPower
AI:RemoveDeck:All 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. 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 Types:Land
K:ETBReplacement:Other:LandTapped 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: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}. 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}. 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 Name:Covenant of Minds
ManaCost:4 U ManaCost:4 U
Types:Sorcery 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: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: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. 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 ManaCost:1 B
Types:Creature Spirit Types:Creature Spirit
PT:2/1 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$ PeekAndReveal | Cost$ 1 | NoReveal$ 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. A:AB$ PeekAndReveal | Cost$ 2 | ActivationLimit$ 1 | NoPeek$ True | RememberRevealed$ True | SubAbility$ DBAnimate | SpellDescription$ Reveal the top card of your library.
SVar:TrigAnimate:DB$ Animate | Defined$ Self | Triggers$ TrigDamage | sVars$ TrigDestroy | ConditionDefined$ Remembered | ConditionPresent$ Card.Land | ConditionCompare$ GE1 | SubAbility$ DBCleanup 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 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: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 SVar:TrigDestroy:DB$ Destroy | Defined$ TriggeredTargetLKICopy
AI:RemoveDeck:All AI:RemoveDeck:All

View File

@@ -1,7 +1,7 @@
Name:Cycle of Life Name:Cycle of Life
ManaCost:1 G G ManaCost:1 G G
Types:Enchantment 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: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 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. 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 ManaCost:U
Types:Creature Merfolk Wizard Types:Creature Merfolk Wizard
PT:1/1 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: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 SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True
AI:RemoveDeck:All 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. 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 Types:Land
K:ETBReplacement:Other:LandTapped 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: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}. 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}. 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}. A:AB$ Mana | Cost$ T | Produced$ Combo B G | SpellDescription$ Add {B} or {G}.
K:ETBReplacement:Other:LandTapped 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: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}. 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 PT:3/2
K:Vigilance 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. 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 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. 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 Types:Land
K:ETBReplacement:Other:LandTapped 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: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$ 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. 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. 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 Types:Land
K:ETBReplacement:Other:LandTapped 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: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}. 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}. 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 Types:Creature Zombie Giant
PT:2/2 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. 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. 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:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ b_2_2_zombie | TokenTapped$ True | TokenOwner$ You
SVar:BuffedBy:Zombie SVar:BuffedBy:Zombie

View File

@@ -4,9 +4,9 @@ Types:Creature Djinn
PT:4/4 PT:4/4
K:Flying K:Flying
K:etbCounter:WISH:3 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. 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$ None 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$ None 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 SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True
AI:RemoveDeck:All 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. 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 Types:Creature Zombie
PT:0/0 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. 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 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. 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. 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}. A:AB$ Mana | Cost$ T | Produced$ Combo G U | SpellDescription$ Add {G} or {U}.
K:ETBReplacement:Other:LandTapped 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: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}. 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 Name:Druidic Satchel
ManaCost:3 ManaCost:3
Types:Artifact 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. 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 | 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: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 | 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: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 | ConditionCompare$ EQ1 | SubAbility$ DBCleanup | StackDescription$ If it's a noncreature, nonland card, you gain 2 life. 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 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. 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 Types:Enchantment
S:Mode$ Continuous | AffectedZone$ Hand | Affected$ Card.YouOwn | MayLookAt$ Player | Description$ Play with your hand revealed. 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. 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:EnduringRevealTop:DB$ PeekAndReveal | NoPeek$ True | RememberRevealed$ True | SubAbility$ DBEnduringGraveyard
SVar:DBEnduringGraveyard:DB$ ChangeZone | Defined$ Remembered | ConditionDefined$ Remembered | ConditionPresent$ Creature | ConditionCompare$ GE1 | Origin$ Library | Destination$ Graveyard | SubAbility$ DBEnduringDraw SVar:DBEnduringGraveyard:DB$ ChangeZone | Defined$ Remembered | ConditionDefined$ Remembered | ConditionPresent$ Creature | Origin$ Library | Destination$ Graveyard | SubAbility$ DBEnduringDraw
SVar:DBEnduringDraw:DB$ Draw | NumCards$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Creature | ConditionCompare$ EQ0 | SubAbility$ DBEnduringCleanup SVar:DBEnduringDraw:DB$ Draw | ConditionDefined$ Remembered | ConditionPresent$ Creature | ConditionCompare$ EQ0 | SubAbility$ DBEnduringCleanup
SVar:DBEnduringCleanup:DB$ Cleanup | ClearRemembered$ True 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. 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 SVar:TrigEnduringBounce:DB$ ChangeZone | Defined$ TriggeredNewCardLKICopy | Origin$ Graveyard | Destination$ Hand

View File

@@ -1,7 +1,7 @@
Name:Epiphany at the Drownyard Name:Epiphany at the Drownyard
ManaCost:X U ManaCost:X U
Types:Instant 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: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:DBHand:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Hand | SubAbility$ DBCleanup
SVar:DBGrave:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Graveyard | 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 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. 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: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 DeckHas:Ability$Token
AI:RemoveDeck:All 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. 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 Types:Legendary Creature Vampire Assassin
PT:3/5 PT:3/5
K:Unblockable 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. 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 | RememberTargets$ True | SubAbility$ PutCounter SVar:TrigExile:DB$ ChangeZone | ValidTgts$ Creature.ControlledBy TriggeredDefendingPlayer | TgtPrompt$ Exile target creature that player controls | Origin$ Battlefield | Destination$ Exile | WithCountersType$ HIT | SubAbility$ DBLose
SVar:PutCounter:DB$ PutCounter | Defined$ Remembered | CounterType$ HIT | CounterNum$ 1 | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | SubAbility$ DBLose
SVar:DBLose:DB$ LosesGame | Defined$ TriggeredTarget | ConditionCheckSVar$ CheckExile | ConditionSVarCompare$ GE3 | SubAbility$ DBShuffle SVar:DBLose:DB$ LosesGame | Defined$ TriggeredTarget | ConditionCheckSVar$ CheckExile | ConditionSVarCompare$ GE3 | SubAbility$ DBShuffle
SVar:CheckExile:Count$ValidExile Card.counters_GE1_HIT+ControlledBy TriggeredDefendingPlayer 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. 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 Name:Experimental Pilot
ManaCost:U ManaCost:U
Types:Creature Human Pilot Types:Creature Human Pilot
PT:1/1 PT:1/2
K:Ward: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. 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 SVar:DBMakeCard:DB$ MakeCard | Name$ ChosenName | Zone$ Hand | SubAbility$ DBCleanup

View File

@@ -1,7 +1,7 @@
Name:Fact or Fiction Name:Fact or Fiction
ManaCost:3 U ManaCost:3 U
Types:Instant 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: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:DBHand:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Hand | SubAbility$ DBCleanup
SVar:DBGrave:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Graveyard | 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 ManaCost:3 G
Types:Creature Spirit Types:Creature Spirit
PT:3/2 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$ PeekAndReveal | Cost$ 1 | NoReveal$ 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. A:AB$ PeekAndReveal | Cost$ 2 | ActivationLimit$ 1 | NoPeek$ True | RememberRevealed$ True | SubAbility$ DBPump | SpellDescription$ Reveal the top card of your library.
SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ 2 | NumDef$ 2 | KW$ Trample | ConditionDefined$ Remembered | ConditionPresent$ Card.Land | ConditionCompare$ GE1 | SubAbility$ DBCleanup 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 SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
AI:RemoveDeck:All 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. 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. 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:TrigPut:DB$ PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1
SVar:X:Count$xPaid SVar:X:Count$xPaid
SVar:Y:Count$TotalCounters_P1P1_Creature.YouCtrl SVar:Y:Count$Valid Creature.YouCtrl$CardCounters.P1P1
SVar:NeedsToPlay:Creature.YouCtrl+inZoneBattlefield SVar:NeedsToPlay:Creature.YouCtrl+inZoneBattlefield
DeckHints:Ability$Counters 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. 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 ManaCost:3 R R
Types:Creature Beast Types:Creature Beast
PT:3/3 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. 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:TrigDig:DB$ Dig | DigNum$ 1 | NoMove$ True | SubAbility$ TrigPlay 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 | ConditionCompare$ EQ1 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. 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 ManaCost:2 G
Types:Enchantment 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. 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:TrigReveal:DB$ PeekAndReveal | Defined$ Player | RememberRevealed$ True | SubAbility$ GoToBattlefield
SVar:EachDig:DB$ Dig | Defined$ Remembered | DigNum$ 1 | Reveal$ True | NoMove$ True | RememberRevealed$ True
SVar:GoToBattlefield:DB$ ChangeZoneAll | ChangeType$ Card.TopLibrary | Origin$ Library | Destination$ Battlefield | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ0 | SubAbility$ DBCleanup SVar:GoToBattlefield:DB$ ChangeZoneAll | ChangeType$ Card.TopLibrary | Origin$ Library | Destination$ Battlefield | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ0 | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:X:Count$ValidLibrary Card.nonCreature+IsRemembered SVar:X:Count$ValidLibrary Card.nonCreature+IsRemembered

View File

@@ -1,7 +1,7 @@
Name:Garruk, Wrath of the Wilds Name:Garruk, Wrath of the Wilds
ManaCost:2 G G ManaCost:2 G G
Types:Legendary Planeswalker Garruk 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." 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: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." 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. 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:DBMakeCard:DB$ MakeCard | Name$ ChosenName | Zone$ Battlefield | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearNamedCard$ True | ClearChosenCard$ True 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. 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[-5]: 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 Name:Geist of Regret
ManaCost:4 U ManaCost:4 U
Types:Creature Spirit Types:Creature Spirit
PT:4/5 PT:5/5
K:Flying 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. 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 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 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." 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: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.) 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 Types:Sorcery
K:Suspend:3:R R 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. 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:DBCleanImprint:DB$ Cleanup | ClearImprinted$ True | SubAbility$ ChangePermanent
SVar:WarpX:Imprinted$Amount SVar:WarpX:Imprinted$Amount
SVar:ChangePermanent:DB$ ChangeZoneAll | ChangeType$ Permanent.nonAura+IsRemembered | Origin$ Library | Destination$ Battlefield | ForgetChanged$ True | SubAbility$ ChangeEnchantment 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. 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. A:AB$ Regenerate | Cost$ 1 SubCounter<1/P1P1> | SpellDescription$ Regenerate CARDNAME.
K:Dredge:6 K:Dredge:6
SVar:X:Count$LastStateGraveyard Creature.YouCtrl SVar:X:Count$ValidGraveyard Creature.YouCtrl
SVar:NeedsToPlayVar:X GE3 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.) 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 PT:0/0
K:Haste 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. 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 SVar:NeedsToPlayVar:X GE3
DeckHas:Ability$Counters 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. 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 Name:Guided Passage
ManaCost:U R G ManaCost:U R G
Types:Sorcery 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: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: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 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 Types:Land
K:ETBReplacement:Other:LandTapped 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: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$ 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}.) 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}.) 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 ManaCost:3 W
Types:Creature Spirit Types:Creature Spirit
PT:1/4 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$ PeekAndReveal | Cost$ 1 | NoReveal$ 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. 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 | ConditionCompare$ GE1 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 | ConditionCompare$ GE1 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 SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
AI:RemoveDeck:All 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. 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}. A:AB$ Mana | Cost$ T | Produced$ Combo B R | SpellDescription$ Add {B} or {R}.
K:ETBReplacement:Other:LandTapped 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: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}. 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 Name:Haunting Imitation
ManaCost:2 U ManaCost:2 U
Types:Sorcery 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: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: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 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 Types:Land
K:ETBReplacement:Other:LandTapped 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: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$ 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. 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. 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