mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-17 19:28:01 +00:00
Merge branch 'master' of https://github.com/Card-Forge/forge into adventure
This commit is contained in:
@@ -329,9 +329,6 @@ public class ComputerUtil {
|
||||
}
|
||||
|
||||
AbilityUtils.resolve(sa);
|
||||
|
||||
// destroys creatures if they have lethal damage, etc..
|
||||
//game.getAction().checkStateEffects();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -827,7 +824,7 @@ public class ComputerUtil {
|
||||
}
|
||||
}
|
||||
|
||||
if ("DesecrationDemon".equals(source.getParam("AILogic"))) {
|
||||
if ("DesecrationDemon".equals(logic)) {
|
||||
sacThreshold = SpecialCardAi.DesecrationDemon.getSacThreshold();
|
||||
} else if (considerSacThreshold != -1) {
|
||||
sacThreshold = considerSacThreshold;
|
||||
@@ -1227,12 +1224,12 @@ public class ComputerUtil {
|
||||
final Game game = sa.getActivatingPlayer().getGame();
|
||||
final PhaseHandler ph = game.getPhaseHandler();
|
||||
|
||||
return (sa.getHostCard().isCreature()
|
||||
return sa.getHostCard().isCreature()
|
||||
&& sa.getPayCosts().hasTapCost()
|
||||
&& (ph.getPhase().isBefore(PhaseType.COMBAT_DECLARE_BLOCKERS)
|
||||
&& !ph.getNextTurn().equals(sa.getActivatingPlayer()))
|
||||
&& !sa.getHostCard().hasSVar("EndOfTurnLeavePlay")
|
||||
&& !sa.hasParam("ActivationPhases"));
|
||||
&& !sa.hasParam("ActivationPhases");
|
||||
}
|
||||
|
||||
//returns true if it's better to wait until blockers are declared).
|
||||
@@ -2601,8 +2598,7 @@ public class ComputerUtil {
|
||||
}
|
||||
|
||||
public static CardCollection getSafeTargets(final Player ai, SpellAbility sa, CardCollectionView validCards) {
|
||||
CardCollection safeCards = new CardCollection(validCards);
|
||||
safeCards = CardLists.filter(safeCards, new Predicate<Card>() {
|
||||
CardCollection safeCards = CardLists.filter(validCards, new Predicate<Card>() {
|
||||
@Override
|
||||
public boolean apply(final Card c) {
|
||||
if (c.getController() == ai) {
|
||||
@@ -2615,8 +2611,7 @@ public class ComputerUtil {
|
||||
}
|
||||
|
||||
public static Card getKilledByTargeting(final SpellAbility sa, CardCollectionView validCards) {
|
||||
CardCollection killables = new CardCollection(validCards);
|
||||
killables = CardLists.filter(killables, new Predicate<Card>() {
|
||||
CardCollection killables = CardLists.filter(validCards, new Predicate<Card>() {
|
||||
@Override
|
||||
public boolean apply(final Card c) {
|
||||
return c.getController() != sa.getActivatingPlayer() && c.getSVar("Targeting").equals("Dies");
|
||||
|
||||
@@ -5,6 +5,7 @@ import java.util.Map;
|
||||
import com.google.common.base.Predicate;
|
||||
import com.google.common.base.Predicates;
|
||||
|
||||
import forge.ai.ComputerUtil;
|
||||
import forge.ai.ComputerUtilCard;
|
||||
import forge.ai.SpellAbilityAi;
|
||||
import forge.game.card.Card;
|
||||
@@ -20,6 +21,7 @@ public class MutateAi extends SpellAbilityAi {
|
||||
@Override
|
||||
protected boolean canPlayAI(Player aiPlayer, SpellAbility sa) {
|
||||
CardCollectionView mutateTgts = CardLists.getTargetableCards(aiPlayer.getCreaturesInPlay(), sa);
|
||||
mutateTgts = ComputerUtil.getSafeTargets(aiPlayer, sa, mutateTgts);
|
||||
|
||||
// Filter out some abilities that are useless
|
||||
// TODO: add other stuff useless for Mutate here
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
package forge.ai.ability;
|
||||
|
||||
import forge.ai.AiAttackController;
|
||||
import forge.ai.SpellAbilityAi;
|
||||
import forge.ai.SpellApiToAi;
|
||||
import forge.game.card.Card;
|
||||
import forge.game.phase.PhaseHandler;
|
||||
import forge.game.phase.PhaseType;
|
||||
import forge.game.player.Player;
|
||||
@@ -9,6 +11,7 @@ import forge.game.player.PlayerActionConfirmMode;
|
||||
import forge.game.spellability.AbilityStatic;
|
||||
import forge.game.spellability.AbilitySub;
|
||||
import forge.game.spellability.SpellAbility;
|
||||
import forge.game.zone.ZoneType;
|
||||
|
||||
/**
|
||||
* TODO: Write javadoc for this type.
|
||||
@@ -38,6 +41,28 @@ public class PeekAndRevealAi extends SpellAbilityAi {
|
||||
}
|
||||
// So far this only appears on Triggers, but will expand
|
||||
// once things get converted from Dig + NoMove
|
||||
Player opp = AiAttackController.choosePreferredDefenderPlayer(aiPlayer);
|
||||
final Card host = sa.getHostCard();
|
||||
Player libraryOwner = aiPlayer;
|
||||
|
||||
if (!willPayCosts(aiPlayer, sa, sa.getPayCosts(), host)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (sa.usesTargeting()) {
|
||||
sa.resetTargets();
|
||||
//todo: evaluate valid targets
|
||||
if (!sa.canTarget(opp)) {
|
||||
return false;
|
||||
}
|
||||
sa.getTargets().add(opp);
|
||||
libraryOwner = opp;
|
||||
}
|
||||
|
||||
if (libraryOwner.getCardsIn(ZoneType.Library).isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -133,6 +133,10 @@ public class UntapAi extends SpellAbilityAi {
|
||||
|
||||
CardCollection list = CardLists.getTargetableCards(targetController.getCardsIn(ZoneType.Battlefield), sa);
|
||||
|
||||
if (!sa.isCurse()) {
|
||||
list = ComputerUtil.getSafeTargets(ai, sa, list);
|
||||
}
|
||||
|
||||
if (list.isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
@@ -262,9 +266,7 @@ public class UntapAi extends SpellAbilityAi {
|
||||
|
||||
private boolean untapTargetList(final Card source, final TargetRestrictions tgt, final SpellAbility sa, final boolean mandatory,
|
||||
final CardCollection tapList) {
|
||||
for (final Card c : sa.getTargets().getTargetCards()) {
|
||||
tapList.remove(c);
|
||||
}
|
||||
tapList.removeAll(sa.getTargets().getTargetCards());
|
||||
|
||||
if (tapList.isEmpty()) {
|
||||
return false;
|
||||
|
||||
@@ -577,6 +577,8 @@ public class GameAction {
|
||||
}
|
||||
}
|
||||
|
||||
table.replaceCounterEffect(game, null, true);
|
||||
|
||||
// Need to apply any static effects to produce correct triggers
|
||||
checkStaticAbilities();
|
||||
|
||||
@@ -592,8 +594,6 @@ public class GameAction {
|
||||
}
|
||||
game.getTriggerHandler().registerActiveTrigger(copied, false);
|
||||
|
||||
table.replaceCounterEffect(game, null, true);
|
||||
|
||||
// play the change zone sound
|
||||
game.fireEvent(new GameEventCardChangeZone(c, zoneFrom, zoneTo));
|
||||
|
||||
|
||||
@@ -1851,9 +1851,6 @@ public class AbilityUtils {
|
||||
}
|
||||
}
|
||||
list = CardLists.getValidCards(list, k[1], sa.getActivatingPlayer(), c, sa);
|
||||
if (k[0].contains("TotalToughness")) {
|
||||
return doXMath(Aggregates.sum(list, CardPredicates.Accessors.fnGetNetToughness), expr, c, ctb);
|
||||
}
|
||||
return doXMath(list.size(), expr, c, ctb);
|
||||
}
|
||||
|
||||
@@ -2416,16 +2413,6 @@ public class AbilityUtils {
|
||||
return doXMath(cmc, expr, c, ctb);
|
||||
}
|
||||
|
||||
if (sq[0].startsWith("ColorsCtrl")) {
|
||||
final String restriction = l[0].substring(11);
|
||||
final CardCollection list = CardLists.getValidCards(player.getCardsIn(ZoneType.Battlefield), restriction, player, c, ctb);
|
||||
byte n = 0;
|
||||
for (final Card card : list) {
|
||||
n |= card.getColor().getColor();
|
||||
}
|
||||
return doXMath(ColorSet.fromMask(n).countColors(), expr, c, ctb);
|
||||
}
|
||||
|
||||
// Count$AttackersDeclared
|
||||
if (sq[0].startsWith("AttackersDeclared")) {
|
||||
List<Card> attackers = player.getCreaturesAttackedThisTurn();
|
||||
@@ -2688,20 +2675,6 @@ public class AbilityUtils {
|
||||
return MyRandom.getRandom().nextInt(1+max-min) + min;
|
||||
}
|
||||
|
||||
// Count$TotalCounters.<counterType>_<valid>
|
||||
if (sq[0].startsWith("TotalCounters")) {
|
||||
final String[] restrictions = l[0].split("_");
|
||||
final CounterType cType = CounterType.getType(restrictions[1]);
|
||||
final String[] validFilter = restrictions[2].split(",");
|
||||
CardCollectionView validCards = game.getCardsIn(ZoneType.Battlefield);
|
||||
validCards = CardLists.getValidCards(validCards, validFilter, player, c, ctb);
|
||||
int cCount = 0;
|
||||
for (final Card card : validCards) {
|
||||
cCount += card.getCounters(cType);
|
||||
}
|
||||
return doXMath(cCount, expr, c, ctb);
|
||||
}
|
||||
|
||||
// Count$ThisTurnCast <Valid>
|
||||
// Count$LastTurnCast <Valid>
|
||||
if (sq[0].startsWith("ThisTurnCast") || sq[0].startsWith("LastTurnCast")) {
|
||||
@@ -2756,13 +2729,27 @@ public class AbilityUtils {
|
||||
String[] paidparts = l[0].split("\\$", 2);
|
||||
String[] lparts = paidparts[0].split(" ", 2);
|
||||
|
||||
final CardCollectionView cardsInZones;
|
||||
CardCollectionView cardsInZones = null;
|
||||
if (lparts[0].contains("All")) {
|
||||
cardsInZones = game.getCardsInGame();
|
||||
} else {
|
||||
cardsInZones = lparts[0].length() > 5
|
||||
? game.getCardsIn(ZoneType.listValueOf(lparts[0].substring(5)))
|
||||
: game.getCardsIn(ZoneType.Battlefield);
|
||||
final List<ZoneType> zones = ZoneType.listValueOf(lparts[0].length() > 5 ? lparts[0].substring(5) : "Battlefield");
|
||||
boolean usedLastState = false;
|
||||
if (ctb instanceof SpellAbility && zones.size() == 1) {
|
||||
SpellAbility sa = (SpellAbility) ctb;
|
||||
if (sa.isReplacementAbility()) {
|
||||
if (zones.get(0).equals(ZoneType.Battlefield)) {
|
||||
cardsInZones = sa.getLastStateBattlefield();
|
||||
usedLastState = true;
|
||||
} else if (zones.get(0).equals(ZoneType.Graveyard)) {
|
||||
cardsInZones = sa.getLastStateGraveyard();
|
||||
usedLastState = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!usedLastState) {
|
||||
cardsInZones = game.getCardsIn(zones);
|
||||
}
|
||||
}
|
||||
|
||||
int cnt;
|
||||
@@ -2859,6 +2846,19 @@ public class AbilityUtils {
|
||||
}
|
||||
return doXMath(powers.size(), expr, c, ctb);
|
||||
}
|
||||
if (sq[0].startsWith("DifferentCounterKinds_")) {
|
||||
final List<CounterType> kinds = Lists.newArrayList();
|
||||
final String rest = l[0].substring(22);
|
||||
CardCollection list = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), rest, player, c, ctb);
|
||||
for (final Card card : list) {
|
||||
for (final Map.Entry<CounterType, Integer> map : card.getCounters().entrySet()) {
|
||||
if (!kinds.contains(map.getKey())) {
|
||||
kinds.add(map.getKey());
|
||||
}
|
||||
}
|
||||
}
|
||||
return doXMath(kinds.size(), expr, c, ctb);
|
||||
}
|
||||
|
||||
// Complex counting methods
|
||||
CardCollectionView someCards = getCardListForXCount(c, player, sq, ctb);
|
||||
@@ -3448,10 +3448,6 @@ public class AbilityUtils {
|
||||
return doXMath(player.getNumDiscardedThisTurn(), m, source, ctb);
|
||||
}
|
||||
|
||||
if (value.contains("TokensCreatedThisTurn")) {
|
||||
return doXMath(player.getNumTokensCreatedThisTurn(), m, source, ctb);
|
||||
}
|
||||
|
||||
if (value.contains("AttackersDeclared")) {
|
||||
return doXMath(player.getCreaturesAttackedThisTurn().size(), m, source, ctb);
|
||||
}
|
||||
|
||||
@@ -68,7 +68,9 @@ public class CopyPermanentEffect extends TokenEffectBase {
|
||||
|
||||
if (sa.hasParam("AddTriggers")) {
|
||||
final String oDesc = sa.getDescription();
|
||||
final String trigStg = oDesc.substring(oDesc.indexOf("\""),oDesc.lastIndexOf("\"") + 1);
|
||||
final String trigStg = oDesc.contains("\"") ?
|
||||
oDesc.substring(oDesc.indexOf("\""),oDesc.lastIndexOf("\"") + 1) :
|
||||
"[trigger text parsing error]";
|
||||
if (addKWs) {
|
||||
sb.append(" and ").append(trigStg);
|
||||
} else {
|
||||
|
||||
@@ -2,6 +2,7 @@ package forge.game.ability.effects;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import forge.game.card.*;
|
||||
import org.apache.commons.lang3.tuple.Pair;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
@@ -12,10 +13,6 @@ import forge.game.Game;
|
||||
import forge.game.GameEntity;
|
||||
import forge.game.ability.AbilityUtils;
|
||||
import forge.game.ability.SpellAbilityEffect;
|
||||
import forge.game.card.Card;
|
||||
import forge.game.card.CardCollectionView;
|
||||
import forge.game.card.CardLists;
|
||||
import forge.game.card.CounterType;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.player.PlayerController;
|
||||
import forge.game.spellability.SpellAbility;
|
||||
@@ -126,15 +123,26 @@ public class CountersRemoveEffect extends SpellAbilityEffect {
|
||||
}
|
||||
|
||||
CardCollectionView srcCards = null;
|
||||
String title = Localizer.getInstance().getMessage("lblChooseCardsToTakeTargetCounters", counterType.getName());
|
||||
if (sa.hasParam("ValidSource")) {
|
||||
srcCards = game.getCardsIn(ZoneType.Battlefield);
|
||||
srcCards = CardLists.getValidCards(srcCards, sa.getParam("ValidSource"), player, card, sa);
|
||||
if (num.equals("Any")) {
|
||||
String title = Localizer.getInstance().getMessage("lblChooseCardsToTakeTargetCounters", counterType.getName());
|
||||
Map<String, Object> params = Maps.newHashMap();
|
||||
params.put("CounterType", counterType);
|
||||
srcCards = player.getController().chooseCardsForEffect(srcCards, sa, title, 0, srcCards.size(), true, params);
|
||||
}
|
||||
} else if (sa.hasParam("Choices") && counterType != null) {
|
||||
ZoneType choiceZone = sa.hasParam("ChoiceZone") ? ZoneType.smartValueOf(sa.getParam("ChoiceZone"))
|
||||
: ZoneType.Battlefield;
|
||||
|
||||
CardCollection choices = CardLists.getValidCards(game.getCardsIn(choiceZone), sa.getParam("Choices"),
|
||||
player, card, sa);
|
||||
|
||||
//currently only used by one card, so for now
|
||||
//amount is locked at 1 and choice is mandatory
|
||||
srcCards = pc.chooseCardsForEffect(choices, sa, title, 1, 1,
|
||||
false, null);
|
||||
} else {
|
||||
srcCards = getTargetCards(sa);
|
||||
}
|
||||
@@ -171,7 +179,7 @@ public class CountersRemoveEffect extends SpellAbilityEffect {
|
||||
Map<String, Object> params = Maps.newHashMap();
|
||||
params.put("Target", gameCard);
|
||||
params.put("CounterType", counterType);
|
||||
String title = Localizer.getInstance().getMessage("lblSelectRemoveCountersNumberOfTarget", type);
|
||||
title = Localizer.getInstance().getMessage("lblSelectRemoveCountersNumberOfTarget", type);
|
||||
cntToRemove = pc.chooseNumber(sa, title, 0, cntToRemove, params);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,7 +47,7 @@ public class DigEffect extends SpellAbilityEffect {
|
||||
verb = " exiles ";
|
||||
}
|
||||
sb.append(host.getController()).append(verb).append("the top ");
|
||||
sb.append(numToDig == 1 ? "card" : (Lang.getNumeral(numToDig) + " cards")).append(" of ");
|
||||
sb.append(numToDig == 1 ? "card" : Lang.getNumeral(numToDig) + " cards").append(" of ");
|
||||
|
||||
if (tgtPlayers.contains(host.getController())) {
|
||||
sb.append("their ");
|
||||
|
||||
@@ -40,7 +40,10 @@ public class DrawEffect extends SpellAbilityEffect {
|
||||
sb.append(" each");
|
||||
}
|
||||
sb.append(Lang.joinVerb(tgtPlayers, " draw")).append(" ");
|
||||
sb.append(numCards == 1 ? "a card" : (Lang.getNumeral(numCards) + " cards"));
|
||||
//if NumCards calculation could change between getStackDescription and resolve, use NumCardsDesc to avoid
|
||||
//a "wrong" stack description
|
||||
sb.append(sa.hasParam("NumCardsDesc") ? sa.getParam("NumCardsDesc") : numCards == 1 ? "a card" :
|
||||
(Lang.getNumeral(numCards) + " cards"));
|
||||
sb.append(".");
|
||||
}
|
||||
|
||||
|
||||
@@ -165,7 +165,9 @@ public class FightEffect extends DamageBaseEffect {
|
||||
|
||||
damageMap.put(fighterA, fighterB, dmg1);
|
||||
damageMap.put(fighterB, fighterA, dmg2);
|
||||
fighterB.setFoughtThisTurn(true);
|
||||
}
|
||||
fighterA.setFoughtThisTurn(true);
|
||||
|
||||
if (!usedDamageMap) {
|
||||
sa.getHostCard().getGame().getAction().dealDamage(false, damageMap, preventMap, counterTable, sa);
|
||||
|
||||
@@ -270,9 +270,17 @@ public class ManaEffect extends SpellAbilityEffect {
|
||||
? GameActionUtil.generatedMana(sa) : "mana";
|
||||
sb.append("Add ").append(toManaString(mana)).append(".");
|
||||
if (sa.hasParam("RestrictValid")) {
|
||||
String desc = sa.getDescription();
|
||||
sb.append(" ");
|
||||
final String desc = sa.getDescription();
|
||||
if (desc.contains("Spend this") && desc.contains(".")) {
|
||||
int i = desc.indexOf("Spend this");
|
||||
sb.append(" ").append(desc, i, desc.indexOf(".", i) + 1);
|
||||
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();
|
||||
}
|
||||
|
||||
@@ -29,21 +29,23 @@ public class PeekAndRevealEffect extends SpellAbilityEffect {
|
||||
@Override
|
||||
protected String getStackDescription(SpellAbility sa) {
|
||||
final Player peeker = sa.getActivatingPlayer();
|
||||
|
||||
final int numPeek = sa.hasParam("PeekAmount") ?
|
||||
AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("PeekAmount"), sa) : 1;
|
||||
final String verb = sa.hasParam("NoReveal") || sa.hasParam("RevealOptional") ? " looks at " :
|
||||
" reveals ";
|
||||
final String defined = sa.getParamOrDefault("Defined", "their");
|
||||
String whose;
|
||||
if (defined.equals("Player")) {
|
||||
whose = "each player's";
|
||||
} else { // other else ifs for specific defined can be added above as needs arise
|
||||
whose = Lang.joinHomogenous(getTargetPlayers(sa));
|
||||
}
|
||||
final String defined = sa.getParamOrDefault("Defined", "");
|
||||
final List<Player> libraryPlayers = getDefinedPlayersOrTargeted(sa);
|
||||
final String defString = Lang.joinHomogenous(libraryPlayers);
|
||||
String who = defined.equals("Player") && verb.equals(" reveals ") ? "Each player" :
|
||||
sa.hasParam("NoPeek") && verb.equals(" reveals ") ? defString : "";
|
||||
String whose = defined.equals("Player") && verb.equals(" looks at ") ? "each player's"
|
||||
: libraryPlayers.size() == 1 && libraryPlayers.get(0) == peeker ? "their" :
|
||||
defString + "'s";
|
||||
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
|
||||
sb.append(peeker).append(verb).append("the top ");
|
||||
sb.append(who.equals("") ? peeker : who);
|
||||
sb.append(verb).append("the top ");
|
||||
sb.append(numPeek > 1 ? Lang.getNumeral(numPeek) + " cards " : "card ").append("of ").append(whose);
|
||||
sb.append(" library.");
|
||||
|
||||
@@ -58,11 +60,12 @@ public class PeekAndRevealEffect extends SpellAbilityEffect {
|
||||
final Card source = sa.getHostCard();
|
||||
final boolean rememberRevealed = sa.hasParam("RememberRevealed");
|
||||
final boolean imprintRevealed = sa.hasParam("ImprintRevealed");
|
||||
final boolean noPeek = sa.hasParam("NoPeek");
|
||||
String revealValid = sa.getParamOrDefault("RevealValid", "Card");
|
||||
String peekAmount = sa.getParamOrDefault("PeekAmount", "1");
|
||||
int numPeek = AbilityUtils.calculateAmount(source, peekAmount, sa);
|
||||
|
||||
List<Player> libraryPlayers = AbilityUtils.getDefinedPlayers(source, sa.getParam("Defined"), sa);
|
||||
List<Player> libraryPlayers = getDefinedPlayersOrTargeted(sa);
|
||||
Player peekingPlayer = sa.getActivatingPlayer();
|
||||
|
||||
for (Player libraryToPeek : libraryPlayers) {
|
||||
@@ -77,17 +80,19 @@ public class PeekAndRevealEffect extends SpellAbilityEffect {
|
||||
CardCollectionView revealableCards = CardLists.getValidCards(peekCards, revealValid,
|
||||
sa.getActivatingPlayer(), source, sa);
|
||||
boolean doReveal = !sa.hasParam("NoReveal") && !revealableCards.isEmpty();
|
||||
if (!sa.hasParam("NoPeek")) {
|
||||
if (!noPeek) {
|
||||
peekingPlayer.getController().reveal(peekCards, ZoneType.Library, libraryToPeek,
|
||||
CardTranslation.getTranslatedName(source.getName()) + " - " +
|
||||
Localizer.getInstance().getMessage("lblRevealingCardFrom"));
|
||||
Localizer.getInstance().getMessage("lblLookingCardFrom"));
|
||||
}
|
||||
|
||||
if (doReveal && sa.hasParam("RevealOptional"))
|
||||
doReveal = peekingPlayer.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblRevealCardToOtherPlayers"));
|
||||
|
||||
if (doReveal) {
|
||||
peekingPlayer.getGame().getAction().reveal(revealableCards, peekingPlayer);
|
||||
peekingPlayer.getGame().getAction().reveal(revealableCards, ZoneType.Library, libraryToPeek, !noPeek,
|
||||
CardTranslation.getTranslatedName(source.getName()) + " - " +
|
||||
Localizer.getInstance().getMessage("lblRevealingCardFrom"));
|
||||
|
||||
if (rememberRevealed) {
|
||||
Map<Integer, Card> cachedMap = Maps.newHashMap();
|
||||
|
||||
@@ -185,6 +185,16 @@ public class PumpEffect extends SpellAbilityEffect {
|
||||
keywords.addAll(Arrays.asList(sa.getParam("KW").split(" & ")));
|
||||
}
|
||||
|
||||
if (sa.hasParam("IfDesc")) {
|
||||
if (sa.getParam("IfDesc").equals("True") && sa.hasParam("SpellDescription")) {
|
||||
String ifDesc = sa.getParam("SpellDescription");
|
||||
sb.append(ifDesc, 0, ifDesc.indexOf(",") + 1);
|
||||
} else {
|
||||
sb.append(sa.getParam("IfDesc"));
|
||||
}
|
||||
sb.append(" ");
|
||||
}
|
||||
|
||||
if (sa instanceof AbilitySub & sa.getRootAbility().getTargets().containsAll(tgts)) {
|
||||
//try to avoid having the same long list of targets twice in a StackDescription
|
||||
sb.append(tgts.size() == 1 && tgts.get(0) instanceof Card ? "It " : "They ");
|
||||
|
||||
@@ -196,6 +196,7 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
|
||||
|
||||
private boolean startsGameInPlay = false;
|
||||
private boolean drawnThisTurn = false;
|
||||
private boolean foughtThisTurn = false;
|
||||
private boolean becameTargetThisTurn = false;
|
||||
private boolean startedTheTurnUntapped = false;
|
||||
private boolean cameUnderControlSinceLastUpkeep = true; // for Echo
|
||||
@@ -1863,6 +1864,13 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
|
||||
drawnThisTurn = b;
|
||||
}
|
||||
|
||||
public final boolean getFoughtThisTurn() {
|
||||
return foughtThisTurn;
|
||||
}
|
||||
public final void setFoughtThisTurn(final boolean b) {
|
||||
foughtThisTurn = b;
|
||||
}
|
||||
|
||||
public final CardCollectionView getGainControlTargets() { //used primarily with AbilityFactory_GainControl
|
||||
return CardCollection.getView(gainControlTargets);
|
||||
}
|
||||
@@ -6132,7 +6140,7 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
|
||||
}
|
||||
if (shieldCounterReplaceDestroy == null) {
|
||||
String reStr = "Event$ Destroy | ActiveZones$ Battlefield | ValidCard$ Card.Self | ValidSource$ SpellAbility "
|
||||
+ "| Description$ If this permanent would be destroyed as the result of an effect, instead remove a shield counter from it";
|
||||
+ "| Description$ If this permanent would be destroyed as the result of an effect, instead remove a shield counter from it.";
|
||||
shieldCounterReplaceDestroy = ReplacementHandler.parseReplacement(reStr, this, false, null);
|
||||
shieldCounterReplaceDestroy.setOverridingAbility(AbilityFactory.getAbility(sa, this));
|
||||
}
|
||||
@@ -6223,6 +6231,7 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
|
||||
setRegeneratedThisTurn(0);
|
||||
resetShield();
|
||||
setBecameTargetThisTurn(false);
|
||||
setFoughtThisTurn(false);
|
||||
clearMustBlockCards();
|
||||
getDamageHistory().newTurn();
|
||||
getDamageHistory().setCreatureAttackedLastTurnOf(turn, getDamageHistory().getCreatureAttackedThisTurn());
|
||||
|
||||
@@ -1662,7 +1662,7 @@ public class CardFactoryUtil {
|
||||
|
||||
inst.addTrigger(myTrigger);
|
||||
} else if (keyword.startsWith("Replicate")) {
|
||||
final String trigScript = "Mode$ SpellCast | ValidCard$ Card.Self | CheckSVar$ ReplicateAmount | Secondary$ True | TriggerDescription$ Copy CARDNAME for each time you paid its replicate cost";
|
||||
final String trigScript = "Mode$ SpellCast | ValidCard$ Card.Self | CheckSVar$ ReplicateAmount | Secondary$ True | TriggerDescription$ Copy CARDNAME for each time you paid its replicate cost.";
|
||||
final String abString = "DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | Amount$ ReplicateAmount | MayChooseTarget$ True";
|
||||
|
||||
final Trigger replicateTrigger = TriggerHandler.parseTrigger(trigScript, card, intrinsic);
|
||||
@@ -1678,8 +1678,7 @@ public class CardFactoryUtil {
|
||||
final String actualTrigger = "Mode$ SpellCast | ValidCard$ Card.Self | OptionalDecider$ You | "
|
||||
+ " Secondary$ True | TriggerDescription$ Ripple " + num + " - CARDNAME";
|
||||
|
||||
final String abString = "DB$ Dig | NoMove$ True | DigNum$ " + num +
|
||||
" | Reveal$ True | RememberRevealed$ True";
|
||||
final String abString = "DB$ PeekAndReveal | PeekAmount$ " + num + " | RememberRevealed$ True";
|
||||
|
||||
final String dbCast = "DB$ Play | Valid$ Card.IsRemembered+sameName | " +
|
||||
"ValidZone$ Library | WithoutManaCost$ True | Optional$ True | " +
|
||||
|
||||
@@ -1113,6 +1113,10 @@ public class CardProperty {
|
||||
if (card.getDrawnThisTurn()) {
|
||||
return false;
|
||||
}
|
||||
} else if (property.startsWith("FoughtThisTurn")) {
|
||||
if (!card.getFoughtThisTurn()) {
|
||||
return false;
|
||||
}
|
||||
} else if (property.startsWith("firstTurnControlled")) {
|
||||
if (!card.isFirstTurnControlled()) {
|
||||
return false;
|
||||
|
||||
@@ -899,12 +899,12 @@ public class Cost implements Serializable {
|
||||
part.getType().equals(other.getType()) &&
|
||||
StringUtils.isNumeric(part.getAmount()) &&
|
||||
StringUtils.isNumeric(other.getAmount())) {
|
||||
String amount = String.valueOf(Integer.parseInt(part.getAmount()) + Integer.parseInt(other.getAmount()));
|
||||
String amount = String.valueOf(part.convertAmount() + other.convertAmount());
|
||||
if (part instanceof CostPutCounter) { // path for Carth & Cumulative Upkeep
|
||||
if (other instanceof CostPutCounter && ((CostPutCounter)other).getCounter().equals(((CostPutCounter) part).getCounter())) {
|
||||
costParts.add(new CostPutCounter(amount, ((CostPutCounter) part).getCounter(), part.getType(), part.getTypeDescription()));
|
||||
} else if (other instanceof CostRemoveCounter && ((CostRemoveCounter)other).counter.is(CounterEnumType.LOYALTY)) {
|
||||
Integer counters = Integer.parseInt(other.getAmount()) - Integer.parseInt(part.getAmount());
|
||||
Integer counters = other.convertAmount() - part.convertAmount();
|
||||
// the cost can turn positive if multiple Carth raise it
|
||||
if (counters < 0) {
|
||||
costParts.add(new CostPutCounter(String.valueOf(counters *-1), CounterType.get(CounterEnumType.LOYALTY), part.getType(), part.getTypeDescription()));
|
||||
|
||||
@@ -1526,10 +1526,6 @@ public class Player extends GameEntity implements Comparable<Player> {
|
||||
return newCard;
|
||||
}
|
||||
|
||||
public final int getNumTokensCreatedThisTurn() {
|
||||
return numTokenCreatedThisTurn;
|
||||
}
|
||||
|
||||
public final void addTokensCreatedThisTurn(Card token) {
|
||||
numTokenCreatedThisTurn++;
|
||||
final Map<AbilityKey, Object> runParams = AbilityKey.mapFromPlayer(this);
|
||||
|
||||
@@ -248,6 +248,22 @@ public class TriggerSpellAbilityCastOrCopy extends Trigger {
|
||||
}
|
||||
}
|
||||
|
||||
if (hasParam("ManaFrom")) {
|
||||
boolean found = false;
|
||||
for (Mana m : spellAbility.getPayingMana()) {
|
||||
Card source = m.getSourceCard();
|
||||
if (source != null) {
|
||||
if (matchesValidParam("ManaFrom", source)) {
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!found) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (hasParam("SnowSpentForCardsColor")) {
|
||||
boolean found = false;
|
||||
for (Mana m : spellAbility.getPayingMana()) {
|
||||
|
||||
@@ -91,7 +91,9 @@ public class DeckController<T extends DeckBase> {
|
||||
}
|
||||
public void loadDeck(Deck deck, boolean substituteCurrentDeck) {
|
||||
boolean isStored;
|
||||
if (view.getCatalogManager().isInfinite()) {
|
||||
boolean isInfinite = view.getCatalogManager().isInfinite();
|
||||
|
||||
if (isInfinite) {
|
||||
Deck currentDeck = view.getHumanDeck();
|
||||
if (substituteCurrentDeck || currentDeck.isEmpty()) {
|
||||
newModel();
|
||||
@@ -107,10 +109,14 @@ public class DeckController<T extends DeckBase> {
|
||||
isStored = false;
|
||||
}
|
||||
|
||||
// not the same as before
|
||||
Deck currentDeck = view.getHumanDeck();
|
||||
for (DeckSection section: EnumSet.allOf(DeckSection.class)) {
|
||||
if (view.isSectionImportable(section)) {
|
||||
CardPool sectionCards = currentDeck.getOrCreate(section);
|
||||
if (!isInfinite) {
|
||||
sectionCards.clear();
|
||||
}
|
||||
sectionCards.addAll(deck.getOrCreate(section));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package forge.adventure.data;
|
||||
|
||||
import com.badlogic.gdx.graphics.Color;
|
||||
import com.badlogic.gdx.utils.Array;
|
||||
import forge.util.MyRandom;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
@@ -14,7 +15,7 @@ import java.util.Random;
|
||||
* contains the information for the biomes
|
||||
*/
|
||||
public class BiomeData implements Serializable {
|
||||
private final Random rand = new Random();
|
||||
private final Random rand = MyRandom.getRandom();
|
||||
public float startPointX;
|
||||
public float startPointY;
|
||||
public float noiseWeight;
|
||||
@@ -40,7 +41,7 @@ public class BiomeData implements Serializable {
|
||||
|
||||
public ArrayList<EnemyData> getEnemyList() {
|
||||
if (enemyList == null) {
|
||||
enemyList = new ArrayList<EnemyData>();
|
||||
enemyList = new ArrayList<>();
|
||||
if (enemies == null)
|
||||
return enemyList;
|
||||
for (EnemyData data : new Array.ArrayIterator<>(WorldData.getAllEnemies())) {
|
||||
@@ -68,11 +69,11 @@ public class BiomeData implements Serializable {
|
||||
}
|
||||
|
||||
public EnemyData getEnemy(float difficultyFactor) {
|
||||
EnemyData bestData=null;
|
||||
float biggestNumber=0;
|
||||
EnemyData bestData = null;
|
||||
float biggestNumber = 0.0f;
|
||||
for (EnemyData data : enemyList) {
|
||||
float newNumber=data.spawnRate *rand.nextFloat()*difficultyFactor;
|
||||
if (newNumber>biggestNumber) {
|
||||
float newNumber= ( 1.0f + (data.spawnRate * rand.nextFloat()) ) * difficultyFactor;
|
||||
if (newNumber > biggestNumber) {
|
||||
biggestNumber=newNumber;
|
||||
bestData=data;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
package forge.adventure.data;
|
||||
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Data class that will be used to read Json configuration files
|
||||
* BiomeData
|
||||
@@ -17,4 +19,5 @@ public class ConfigData {
|
||||
public String[] starterDecks;
|
||||
public DifficultyData[] difficulties;
|
||||
public RewardData legalCards;
|
||||
public List<String> restrictedCards;
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@ public class EnemyData {
|
||||
public String name;
|
||||
public String sprite;
|
||||
public String deck;
|
||||
public boolean copyPlayerDeck = false;
|
||||
public String ai;
|
||||
public float spawnRate;
|
||||
public float difficulty;
|
||||
@@ -28,6 +29,7 @@ public class EnemyData {
|
||||
deck = enemyData.deck;
|
||||
ai = enemyData.ai;
|
||||
spawnRate = enemyData.spawnRate;
|
||||
copyPlayerDeck = enemyData.copyPlayerDeck;
|
||||
difficulty = enemyData.difficulty;
|
||||
speed = enemyData.speed;
|
||||
life = enemyData.life;
|
||||
|
||||
@@ -41,11 +41,8 @@ public class RewardData {
|
||||
public String cardText;
|
||||
public boolean matchAllSubTypes;
|
||||
|
||||
public RewardData() { }
|
||||
|
||||
public RewardData()
|
||||
{
|
||||
|
||||
}
|
||||
public RewardData(RewardData rewardData) {
|
||||
type =rewardData.type;
|
||||
probability =rewardData.probability;
|
||||
@@ -68,23 +65,24 @@ public class RewardData {
|
||||
|
||||
private static Iterable<PaperCard> allCards;
|
||||
private static Iterable<PaperCard> allEnemyCards;
|
||||
public Array<Reward> generate(boolean isForEnemy)
|
||||
{
|
||||
|
||||
public Array<Reward> generate(boolean isForEnemy) {
|
||||
return generate(isForEnemy, null);
|
||||
}
|
||||
public Array<Reward> generate(boolean isForEnemy,Iterable<PaperCard> cards)
|
||||
{
|
||||
if(allCards==null)
|
||||
{
|
||||
RewardData legals=Config.instance().getConfigData().legalCards;
|
||||
if(legals==null)
|
||||
{
|
||||
allCards = FModel.getMagicDb().getCommonCards().getUniqueCardsNoAltNoOnline();
|
||||
}
|
||||
else
|
||||
{
|
||||
allCards = Iterables.filter(FModel.getMagicDb().getCommonCards().getUniqueCardsNoAltNoOnline(), new CardUtil.CardPredicate(legals, true));
|
||||
public Array<Reward> generate(boolean isForEnemy, Iterable<PaperCard> cards) {
|
||||
if(allCards==null) {
|
||||
RewardData legals = Config.instance().getConfigData().legalCards;
|
||||
if(legals==null) allCards = FModel.getMagicDb().getCommonCards().getUniqueCardsNoAltNoOnline();
|
||||
else allCards = Iterables.filter(FModel.getMagicDb().getCommonCards().getUniqueCardsNoAltNoOnline(), new CardUtil.CardPredicate(legals, true));
|
||||
//Filter out specific cards.
|
||||
allCards = Iterables.filter(allCards, new Predicate<PaperCard>() {
|
||||
@Override
|
||||
public boolean apply(PaperCard input){
|
||||
if(input == null) return false;
|
||||
return !Config.instance().getConfigData().restrictedCards.contains(input.getName());
|
||||
}
|
||||
});
|
||||
//Filter AI cards for enemies.
|
||||
allEnemyCards=Iterables.filter(allCards, new Predicate<PaperCard>() {
|
||||
@Override
|
||||
public boolean apply(PaperCard input) {
|
||||
@@ -94,11 +92,10 @@ public class RewardData {
|
||||
});
|
||||
}
|
||||
Array<Reward> ret=new Array<>();
|
||||
if(probability==0|| WorldSave.getCurrentSave().getWorld().getRandom().nextFloat()<=probability) {
|
||||
if(type==null||type.isEmpty())
|
||||
if(probability == 0 || WorldSave.getCurrentSave().getWorld().getRandom().nextFloat() <= probability) {
|
||||
if(type==null || type.isEmpty())
|
||||
type="randomCard";
|
||||
int addedCount=(int)((float)(addMaxCount)* WorldSave.getCurrentSave().getWorld().getRandom().nextFloat());
|
||||
|
||||
int addedCount = (int)((float)(addMaxCount)* WorldSave.getCurrentSave().getWorld().getRandom().nextFloat());
|
||||
if( colors != null && colors.length > 0 ) { //Filter special "colorID" case.
|
||||
String C = Current.player().getColorIdentityLong();
|
||||
for(int i = 0; i < colors.length; i++){
|
||||
@@ -128,26 +125,23 @@ public class RewardData {
|
||||
}
|
||||
break;
|
||||
case "item":
|
||||
if(itemName!=null&&!itemName.isEmpty())
|
||||
{
|
||||
for(int i=0;i<count+addedCount;i++)
|
||||
{
|
||||
if(itemName!=null&&!itemName.isEmpty()) {
|
||||
for(int i=0;i<count+addedCount;i++) {
|
||||
ret.add(new Reward(ItemData.getItem(itemName)));
|
||||
}
|
||||
}
|
||||
break;
|
||||
case "deckCard":
|
||||
if(cards==null)return ret;
|
||||
for(PaperCard card: CardUtil.generateCards(cards,this, count+addedCount))
|
||||
{
|
||||
if(cards == null) return ret;
|
||||
for(PaperCard card: CardUtil.generateCards(cards,this, count+addedCount)) {
|
||||
ret.add(new Reward(card));
|
||||
}
|
||||
break;
|
||||
case "gold":
|
||||
ret.add(new Reward(count+addedCount));
|
||||
ret.add(new Reward(count + addedCount));
|
||||
break;
|
||||
case "life":
|
||||
ret.add(new Reward(Reward.Type.Life, count+addedCount));
|
||||
ret.add(new Reward(Reward.Type.Life, count + addedCount));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,19 +11,18 @@ import java.util.HashSet;
|
||||
* Class to save point of interest changes, like sold cards and dead enemies
|
||||
*/
|
||||
public class PointOfInterestChanges implements SaveFileContent {
|
||||
private final HashSet<Integer> deletedObjects=new HashSet<>();
|
||||
private final HashMap<Integer, HashSet<Integer>> cardsBought = new HashMap<>();
|
||||
private java.util.Map<String, Byte> mapFlags = new HashMap<>();
|
||||
|
||||
public static class Map extends HashMap<String,PointOfInterestChanges> implements SaveFileContent
|
||||
{
|
||||
|
||||
public static class Map extends HashMap<String,PointOfInterestChanges> implements SaveFileContent {
|
||||
@Override
|
||||
public void load(SaveFileData data) {
|
||||
|
||||
this.clear();
|
||||
if(data==null||!data.containsKey("keys"))
|
||||
return;
|
||||
if(data==null || !data.containsKey("keys")) return;
|
||||
|
||||
String[] keys= (String[]) data.readObject("keys");
|
||||
for(int i=0;i<keys.length;i++)
|
||||
{
|
||||
for(int i=0;i<keys.length;i++) {
|
||||
SaveFileData elementData = data.readSubData("value_"+i);
|
||||
PointOfInterestChanges newChanges=new PointOfInterestChanges();
|
||||
newChanges.load(elementData);
|
||||
@@ -66,35 +65,21 @@ public class PointOfInterestChanges implements SaveFileContent {
|
||||
return data;
|
||||
}
|
||||
|
||||
private final HashSet<Integer> deletedObjects=new HashSet<>();
|
||||
private final HashMap<Integer, HashSet<Integer>> cardsBought=new HashMap<>();
|
||||
private java.util.Map<String, Byte> mapFlags = new HashMap<>();
|
||||
|
||||
public boolean isObjectDeleted(int objectID)
|
||||
{
|
||||
return deletedObjects.contains(objectID);
|
||||
}
|
||||
public boolean deleteObject(int objectID)
|
||||
{
|
||||
return deletedObjects.add(objectID);
|
||||
}
|
||||
public boolean isObjectDeleted(int objectID) { return deletedObjects.contains(objectID); }
|
||||
public boolean deleteObject(int objectID) { return deletedObjects.add(objectID); }
|
||||
|
||||
public java.util.Map<String, Byte> getMapFlags() {
|
||||
return mapFlags;
|
||||
}
|
||||
|
||||
public void buyCard(int objectID, int cardIndex)
|
||||
{
|
||||
if( !cardsBought.containsKey(objectID))
|
||||
{
|
||||
public void buyCard(int objectID, int cardIndex) {
|
||||
if( !cardsBought.containsKey(objectID)) {
|
||||
cardsBought.put(objectID,new HashSet<>());
|
||||
}
|
||||
cardsBought.get(objectID).add(cardIndex);
|
||||
}
|
||||
public boolean wasCardBought(int objectID, int cardIndex)
|
||||
{
|
||||
if( !cardsBought.containsKey(objectID))
|
||||
{
|
||||
public boolean wasCardBought(int objectID, int cardIndex) {
|
||||
if( !cardsBought.containsKey(objectID)) {
|
||||
return false;
|
||||
}
|
||||
return cardsBought.get(objectID).contains(cardIndex);
|
||||
|
||||
@@ -111,7 +111,8 @@ public class DuelScene extends ForgeScene {
|
||||
playerObject.setAvatarIndex(90001);
|
||||
humanPlayer.setPlayer(playerObject);
|
||||
humanPlayer.setStartingLife(advPlayer.getLife());
|
||||
Current.setLatestDeck(enemy.getData().generateDeck());
|
||||
Deck enemyDeck = ( enemy.getData().copyPlayerDeck ? playerDeck : enemy.getData().generateDeck() );
|
||||
Current.setLatestDeck(enemyDeck);
|
||||
RegisteredPlayer aiPlayer = RegisteredPlayer.forVariants(2, appliedVariants, Current.latestDeck(), null, false, null, null);
|
||||
LobbyPlayer enemyPlayer = GamePlayerUtil.createAiPlayer(this.enemy.getData().name, selectAI(this.enemy.getData().ai));
|
||||
if(!enemy.nameOverride.isEmpty()) enemyPlayer.setName(enemy.nameOverride); //Override name if defined in the map.
|
||||
|
||||
@@ -373,7 +373,7 @@ public class MapStage extends GameStage {
|
||||
case "shop":
|
||||
String shopList = prop.get("shopList").toString();
|
||||
shopList=shopList.replaceAll("\\s","");
|
||||
List possibleShops = Arrays.asList(shopList.split(","));
|
||||
List<String> possibleShops = Arrays.asList(shopList.split(","));
|
||||
Array<ShopData> shops;
|
||||
if (possibleShops.size() == 0 || shopList.equals(""))
|
||||
shops = WorldData.getShopList();
|
||||
@@ -385,8 +385,7 @@ public class MapStage extends GameStage {
|
||||
}
|
||||
}
|
||||
}
|
||||
if (shops.size == 0)
|
||||
continue;
|
||||
if(shops.size == 0) continue;
|
||||
|
||||
ShopData data = shops.get(WorldSave.getCurrentSave().getWorld().getRandom().nextInt(shops.size));
|
||||
Array<Reward> ret = new Array<>();
|
||||
@@ -406,6 +405,8 @@ public class MapStage extends GameStage {
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
System.err.println("Unexpected value: " + type);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -494,16 +495,14 @@ public class MapStage extends GameStage {
|
||||
}
|
||||
currentMob = null;
|
||||
}
|
||||
public void removeAllEnemies()
|
||||
{
|
||||
public void removeAllEnemies() {
|
||||
List<Integer> idsToRemove=new ArrayList<>();
|
||||
for (MapActor actor : new Array.ArrayIterator<>(actors)) {
|
||||
if (actor instanceof EnemySprite) {
|
||||
idsToRemove.add(actor.getObjectId());
|
||||
}
|
||||
}
|
||||
for(Integer i:idsToRemove)
|
||||
deleteObject(i);
|
||||
for(Integer i:idsToRemove) deleteObject(i);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -25,6 +25,7 @@ import forge.adventure.world.WorldSave;
|
||||
import forge.screens.TransitionScreen;
|
||||
import forge.sound.SoundEffectType;
|
||||
import forge.sound.SoundSystem;
|
||||
import forge.util.MyRandom;
|
||||
import org.apache.commons.lang3.tuple.Pair;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -40,7 +41,7 @@ public class WorldStage extends GameStage implements SaveFileContent {
|
||||
|
||||
private static WorldStage instance=null;
|
||||
protected EnemySprite currentMob;
|
||||
protected Random rand = new Random();
|
||||
protected Random rand = MyRandom.getRandom();
|
||||
WorldBackground background;
|
||||
private float spawnDelay = 0;
|
||||
private final float spawnInterval = 4;//todo config
|
||||
@@ -194,32 +195,27 @@ public class WorldStage extends GameStage implements SaveFileContent {
|
||||
}
|
||||
|
||||
private void HandleMonsterSpawn(float delta) {
|
||||
|
||||
|
||||
World world = WorldSave.getCurrentSave().getWorld();
|
||||
int currentBiome = World.highestBiome(world.getBiome((int) player.getX() / world.getTileSize(), (int) player.getY() / world.getTileSize()));
|
||||
List<BiomeData> biomeData = WorldSave.getCurrentSave().getWorld().getData().GetBiomes();
|
||||
if (biomeData.size() <= currentBiome)
|
||||
{
|
||||
if (biomeData.size() <= currentBiome) {
|
||||
player.setMoveModifier(1.5f);
|
||||
return;
|
||||
}
|
||||
player.setMoveModifier(1.0f);
|
||||
BiomeData data = biomeData.get(currentBiome);
|
||||
if (data == null) return;
|
||||
|
||||
spawnDelay -= delta;
|
||||
if(spawnDelay>=0) return;
|
||||
spawnDelay=spawnInterval + ( rand.nextFloat() * 4.0f );
|
||||
|
||||
if (data == null)
|
||||
return;
|
||||
ArrayList<EnemyData> list = data.getEnemyList();
|
||||
if (list == null)
|
||||
return;
|
||||
spawnDelay -= delta;
|
||||
if(spawnDelay>=0)
|
||||
EnemyData enemyData = data.getEnemy( 1.0f );
|
||||
if (enemyData == null)
|
||||
return;
|
||||
spawnDelay=spawnInterval+(rand.nextFloat()*4);
|
||||
EnemyData enemyData = data.getEnemy( 1);
|
||||
if (enemyData == null) {
|
||||
return;
|
||||
}
|
||||
EnemySprite sprite = new EnemySprite(enemyData);
|
||||
float unit = Scene.getIntendedHeight() / 6f;
|
||||
Vector2 spawnPos = new Vector2(1, 1);
|
||||
|
||||
@@ -22,7 +22,7 @@ import forge.adventure.util.Config;
|
||||
import forge.adventure.util.Paths;
|
||||
import forge.adventure.util.SaveFileContent;
|
||||
import forge.adventure.util.SaveFileData;
|
||||
import forge.util.MyRandom;
|
||||
//import forge.util.MyRandom;
|
||||
import org.apache.commons.lang3.tuple.Pair;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -46,7 +46,7 @@ public class World implements Disposable, SaveFileContent {
|
||||
private PointOfInterestMap mapPoiIds;
|
||||
private BiomeTexture[] biomeTexture;
|
||||
private long seed;
|
||||
private final Random random = MyRandom.getRandom();
|
||||
private final Random random = new Random();
|
||||
private boolean worldDataLoaded=false;
|
||||
private Texture globalTexture = null;
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import forge.util.MyRandom;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import com.badlogic.gdx.utils.Align;
|
||||
@@ -195,6 +196,19 @@ public class FDeckChooser extends FScreen {
|
||||
DeckgenUtil.randomSelect(lstDecks);
|
||||
}
|
||||
else {
|
||||
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();
|
||||
|
||||
@@ -129,6 +129,8 @@ public abstract class ItemManager<T extends InventoryItem> extends FContainer im
|
||||
//build display
|
||||
add(searchFilter.getWidget());
|
||||
add(btnSearch);
|
||||
//fixme - AdvanceSearch for Adventure mode needs GUI update on landscape mode, needs onclose override to close internal EditScreen
|
||||
btnSearch.setEnabled(!Forge.isMobileAdventureMode);
|
||||
add(btnView);
|
||||
add(btnAdvancedSearchOptions);
|
||||
btnAdvancedSearchOptions.setSelected(!hideFilters);
|
||||
|
||||
@@ -11,6 +11,17 @@
|
||||
"decks/starter/red.json",
|
||||
"decks/starter/green.json"
|
||||
],
|
||||
"restrictedCards": [
|
||||
"Black Lotus",
|
||||
"Mox Emerald",
|
||||
"Mox Pearl",
|
||||
"Mox Ruby",
|
||||
"Mox Sapphire",
|
||||
"Mox Jet",
|
||||
"Ancestral Recall",
|
||||
"Timetwister",
|
||||
"Time Walk"
|
||||
],
|
||||
"difficulties": [
|
||||
{
|
||||
"name": "Easy",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<map version="1.8" tiledversion="1.8.4" orientation="orthogonal" renderorder="right-down" width="30" height="30" tilewidth="16" tileheight="16" infinite="0" nextlayerid="7" nextobjectid="95">
|
||||
<map version="1.8" tiledversion="1.8.4" orientation="orthogonal" renderorder="right-down" width="30" height="30" tilewidth="16" tileheight="16" infinite="0" nextlayerid="7" nextobjectid="97">
|
||||
<editorsettings>
|
||||
<export format="tmx"/>
|
||||
</editorsettings>
|
||||
@@ -397,5 +397,15 @@
|
||||
<property name="enemy" value="Merfolk Soldier"/>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="95" template="../obj/enemy.tx" x="288" y="224">
|
||||
<properties>
|
||||
<property name="enemy" value="Doppelganger"/>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="96" template="../obj/enemy.tx" x="304" y="224">
|
||||
<properties>
|
||||
<property name="enemy" value="Doppelganger"/>
|
||||
</properties>
|
||||
</object>
|
||||
</objectgroup>
|
||||
</map>
|
||||
|
||||
68
forge-gui/res/adventure/Shandalar/sprites/doppelganger.atlas
Normal file
68
forge-gui/res/adventure/Shandalar/sprites/doppelganger.atlas
Normal 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
|
||||
BIN
forge-gui/res/adventure/Shandalar/sprites/doppelganger.png
Normal file
BIN
forge-gui/res/adventure/Shandalar/sprites/doppelganger.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 12 KiB |
@@ -23,7 +23,7 @@
|
||||
"height": 0.7,
|
||||
"color": "10a2e0",
|
||||
"spriteNames":["IslandTree" ,"Coral" ,"Shell" ],
|
||||
"enemies":[ "Bird","Djinn","Elemental","Merfolk","Merfolk Avatar","Merfolk Fighter","Merfolk Lord","Merfolk Soldier","Merfolk warrior","Blue Wiz1","Blue Wiz2","Blue Wiz3","Geist","Rogue","Sea Monster","Tarkir Djinn" ] ,
|
||||
"enemies":[ "Bird","Djinn","Elemental","Merfolk","Merfolk Avatar","Merfolk Fighter","Merfolk Lord","Merfolk Soldier","Merfolk warrior","Blue Wiz1","Blue Wiz2","Blue Wiz3","Geist","Rogue","Sea Monster","Tarkir Djinn","Doppelganger" ] ,
|
||||
"pointsOfInterest":[
|
||||
"Blue Castle",
|
||||
"Island Town",
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"name": "Adventurer",
|
||||
"sprite": "sprites/swordsman_3.atlas",
|
||||
"deck": "decks/adventurer.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 25,
|
||||
"life": 13,
|
||||
@@ -27,7 +27,7 @@
|
||||
"name": "Amonkhet Minotaur",
|
||||
"sprite": "sprites/warden.atlas",
|
||||
"deck": "decks/amonkhet_minotaur.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 25,
|
||||
"life": 16,
|
||||
@@ -51,7 +51,7 @@
|
||||
"name": "Ape",
|
||||
"sprite": "sprites/behemoth.atlas",
|
||||
"deck": "decks/ape.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 24,
|
||||
"life": 16,
|
||||
@@ -75,7 +75,7 @@
|
||||
"name": "Archer",
|
||||
"sprite": "sprites/archer_2.atlas",
|
||||
"deck": "decks/human_archer.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 25,
|
||||
"life": 11,
|
||||
@@ -99,7 +99,7 @@
|
||||
"name": "Ashmouth Devil",
|
||||
"sprite": "sprites/devil.atlas",
|
||||
"deck": "decks/ashmouth_devil.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 31,
|
||||
"life": 18,
|
||||
@@ -123,7 +123,7 @@
|
||||
"name": "Axgard Dwarf",
|
||||
"sprite": "sprites/dwarf_8.atlas",
|
||||
"deck": "decks/axgard_dwarf.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 22,
|
||||
"life": 13,
|
||||
@@ -147,7 +147,7 @@
|
||||
"name": "Bandit",
|
||||
"sprite": "sprites/dwarf_7.atlas",
|
||||
"deck": "decks/bandit.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 24,
|
||||
"life": 13,
|
||||
@@ -171,7 +171,7 @@
|
||||
"name": "Bear",
|
||||
"sprite": "sprites/bear.atlas",
|
||||
"deck": "decks/bear.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 25,
|
||||
"life": 16,
|
||||
@@ -195,7 +195,7 @@
|
||||
"name": "Beholder",
|
||||
"sprite": "sprites/beholder.atlas",
|
||||
"deck": "decks/beholder.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 31,
|
||||
"life": 15,
|
||||
@@ -219,7 +219,7 @@
|
||||
"name": "Berserker",
|
||||
"sprite": "sprites/dwarf_5.atlas",
|
||||
"deck": "decks/berserker.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 22,
|
||||
"life": 13,
|
||||
@@ -243,7 +243,7 @@
|
||||
"name": "Big Zombie",
|
||||
"sprite": "sprites/zombie_2.atlas",
|
||||
"deck": "decks/zombie_bad.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 15,
|
||||
"life": 13,
|
||||
@@ -278,7 +278,7 @@
|
||||
"name": "Bird",
|
||||
"sprite": "sprites/griffin_2.atlas",
|
||||
"deck": "decks/bird_blue.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 31,
|
||||
"life": 11,
|
||||
@@ -302,7 +302,7 @@
|
||||
"name": "Black Wiz1",
|
||||
"sprite": "sprites/black_wizard.atlas",
|
||||
"deck": "decks/black_bad.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 24,
|
||||
"life": 10,
|
||||
@@ -326,7 +326,7 @@
|
||||
"name": "Black Wiz2",
|
||||
"sprite": "sprites/black_wiz2.atlas",
|
||||
"deck": "decks/fear.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 24,
|
||||
"life": 10,
|
||||
@@ -350,7 +350,7 @@
|
||||
"name": "Black Wiz3",
|
||||
"sprite": "sprites/black_wiz3.atlas",
|
||||
"deck": "decks/black_wiz3.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 24,
|
||||
"life": 10,
|
||||
@@ -374,7 +374,7 @@
|
||||
"name": "Blue Wiz1",
|
||||
"sprite": "sprites/mage.atlas",
|
||||
"deck": "decks/blue_bad.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 31,
|
||||
"life": 10,
|
||||
@@ -398,7 +398,7 @@
|
||||
"name": "Blue Wiz2",
|
||||
"sprite": "sprites/blue_wiz2.atlas",
|
||||
"deck": "decks/mill.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 24,
|
||||
"life": 10,
|
||||
@@ -422,7 +422,7 @@
|
||||
"name": "Blue Wiz3",
|
||||
"sprite": "sprites/mage_2.atlas",
|
||||
"deck": "decks/counter.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 31,
|
||||
"life": 10,
|
||||
@@ -446,7 +446,7 @@
|
||||
"name": "Boggart",
|
||||
"sprite": "sprites/goblin_2.atlas",
|
||||
"deck": "decks/eyeblight.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 27,
|
||||
"life": 8,
|
||||
@@ -481,7 +481,7 @@
|
||||
"name": "Cat",
|
||||
"sprite": "sprites/lion.atlas",
|
||||
"deck": "decks/cat.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 27,
|
||||
"life": 15,
|
||||
@@ -505,7 +505,7 @@
|
||||
"name": "Cathar",
|
||||
"sprite": "sprites/cathar.atlas",
|
||||
"deck": "decks/cathar.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 25,
|
||||
"life": 13,
|
||||
@@ -529,7 +529,7 @@
|
||||
"name": "Centaur",
|
||||
"sprite": "sprites/centaur.atlas",
|
||||
"deck": "decks/centaur.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 30,
|
||||
"life": 16,
|
||||
@@ -553,7 +553,7 @@
|
||||
"name": "Centaur Warrior",
|
||||
"sprite": "sprites/centaur_2.atlas",
|
||||
"deck": "decks/centaur_warrior.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 30,
|
||||
"life": 16,
|
||||
@@ -577,7 +577,7 @@
|
||||
"name": "ClayGolem",
|
||||
"sprite": "sprites/golem_2.atlas",
|
||||
"deck": "decks/golem_good.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 19,
|
||||
"life": 12,
|
||||
@@ -610,7 +610,7 @@
|
||||
"name": "Cleric",
|
||||
"sprite": "sprites/cleric.atlas",
|
||||
"deck": "decks/cleric.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 24,
|
||||
"life": 10,
|
||||
@@ -634,7 +634,7 @@
|
||||
"name": "Construct",
|
||||
"sprite": "sprites/golem_3.atlas",
|
||||
"deck": "decks/artificer.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 21,
|
||||
"life": 14,
|
||||
@@ -658,7 +658,7 @@
|
||||
"name": "Cyclops",
|
||||
"sprite": "sprites/cyclops.atlas",
|
||||
"deck": "decks/cyclops.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 16,
|
||||
"life": 19,
|
||||
@@ -682,7 +682,7 @@
|
||||
"name": "Dark Knight",
|
||||
"sprite": "sprites/death_knight.atlas",
|
||||
"deck": "decks/death_knight.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 30,
|
||||
"life": 15,
|
||||
@@ -706,7 +706,7 @@
|
||||
"name": "Dawnhart Witch",
|
||||
"sprite": "sprites/dawnhart_witch.atlas",
|
||||
"deck": "decks/dawnhart_witch.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 24,
|
||||
"life": 10,
|
||||
@@ -730,7 +730,7 @@
|
||||
"name": "Death Knight",
|
||||
"sprite": "sprites/death_knight_2.atlas",
|
||||
"deck": "decks/death_knight.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 30,
|
||||
"life": 15,
|
||||
@@ -754,7 +754,7 @@
|
||||
"name": "Demon",
|
||||
"sprite": "sprites/demon_3.atlas",
|
||||
"deck": "decks/demon.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 31,
|
||||
"life": 18,
|
||||
@@ -778,7 +778,7 @@
|
||||
"name": "Devil",
|
||||
"sprite": "sprites/imp.atlas",
|
||||
"deck": "decks/devil.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 24,
|
||||
"life": 11,
|
||||
@@ -802,7 +802,7 @@
|
||||
"name": "Dino",
|
||||
"sprite": "sprites/ancient.atlas",
|
||||
"deck": "decks/dinosaurs.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 15,
|
||||
"life": 19,
|
||||
@@ -839,7 +839,7 @@
|
||||
"name": "Dinosaur",
|
||||
"sprite": "sprites/ancient_2.atlas",
|
||||
"deck": "decks/dinosaur_w_r.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 15,
|
||||
"life": 19,
|
||||
@@ -876,7 +876,7 @@
|
||||
"name": "Djinn",
|
||||
"sprite": "sprites/djinn.atlas",
|
||||
"deck": "decks/djinn.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 32,
|
||||
"life": 18,
|
||||
@@ -896,11 +896,34 @@
|
||||
],
|
||||
"colors": "RU"
|
||||
},
|
||||
{
|
||||
"name": "Doppelganger",
|
||||
"sprite": "sprites/doppelganger.atlas",
|
||||
"deck": "decks/mimic.dck",
|
||||
"copyPlayerDeck": true,
|
||||
"spawnRate": 0.95,
|
||||
"difficulty": 0.1,
|
||||
"speed": 30,
|
||||
"life": 20,
|
||||
"rewards": [
|
||||
{
|
||||
"type": "deckCard",
|
||||
"probability": 1,
|
||||
"count": 1
|
||||
},{
|
||||
"type": "gold",
|
||||
"probability": 0.3,
|
||||
"count": 100,
|
||||
"addMaxCount": 150
|
||||
}
|
||||
],
|
||||
"colors": "C"
|
||||
},
|
||||
{
|
||||
"name": "Dragon",
|
||||
"sprite": "sprites/dragon.atlas",
|
||||
"deck": "decks/dragon.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 0.95,
|
||||
"difficulty": 0.1,
|
||||
"speed": 31,
|
||||
"life": 19,
|
||||
@@ -924,7 +947,7 @@
|
||||
"name": "Dwarf",
|
||||
"sprite": "sprites/dwarf_2.atlas",
|
||||
"deck": "decks/dwarf.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 22,
|
||||
"life": 13,
|
||||
@@ -948,7 +971,7 @@
|
||||
"name": "Efreet",
|
||||
"sprite": "sprites/efreet_2.atlas",
|
||||
"deck": "decks/efreet.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 31,
|
||||
"life": 18,
|
||||
@@ -972,7 +995,7 @@
|
||||
"name": "Eldraine Faerie",
|
||||
"sprite": "sprites/pixie.atlas",
|
||||
"deck": "decks/eldraine_faerie.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 31,
|
||||
"life": 8,
|
||||
@@ -996,7 +1019,7 @@
|
||||
"name": "Eldraine Knight",
|
||||
"sprite": "sprites/paladin_2.atlas",
|
||||
"deck": "decks/eldraine_knight.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 30,
|
||||
"life": 14,
|
||||
@@ -1020,7 +1043,7 @@
|
||||
"name": "Eldrazi",
|
||||
"sprite": "sprites/mindelemental.atlas",
|
||||
"deck": "decks/eldrazi.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 15,
|
||||
"life": 19,
|
||||
@@ -1044,7 +1067,7 @@
|
||||
"name": "Elemental",
|
||||
"sprite": "sprites/crystalelemental.atlas",
|
||||
"deck": "decks/elemental_blue.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 31,
|
||||
"life": 16,
|
||||
@@ -1068,7 +1091,7 @@
|
||||
"name": "Elf",
|
||||
"sprite": "sprites/druid.atlas",
|
||||
"deck": "decks/elf_bad.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 24,
|
||||
"life": 10,
|
||||
@@ -1103,7 +1126,7 @@
|
||||
"name": "Elf warrior",
|
||||
"sprite": "sprites/hunter.atlas",
|
||||
"deck": "decks/elf_mid.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 25,
|
||||
"life": 11,
|
||||
@@ -1138,7 +1161,7 @@
|
||||
"name": "Elk",
|
||||
"sprite": "sprites/deer_2.atlas",
|
||||
"deck": "decks/elk.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 29,
|
||||
"life": 11,
|
||||
@@ -1162,7 +1185,7 @@
|
||||
"name": "Faerie",
|
||||
"sprite": "sprites/pixie_2.atlas",
|
||||
"deck": "decks/faerie.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 31,
|
||||
"life": 8,
|
||||
@@ -1186,7 +1209,7 @@
|
||||
"name": "Fire Elemental",
|
||||
"sprite": "sprites/fireelemental.atlas",
|
||||
"deck": "decks/fire_elemental.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 24,
|
||||
"life": 16,
|
||||
@@ -1210,7 +1233,7 @@
|
||||
"name": "Flame Elemental",
|
||||
"sprite": "sprites/magmaelemental.atlas",
|
||||
"deck": "decks/flame_elemental.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 23,
|
||||
"life": 17,
|
||||
@@ -1234,7 +1257,7 @@
|
||||
"name": "Gargoyle",
|
||||
"sprite": "sprites/gargoyle.atlas",
|
||||
"deck": "decks/gargoyle.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 31,
|
||||
"life": 17,
|
||||
@@ -1258,7 +1281,7 @@
|
||||
"name": "Gargoyle 2",
|
||||
"sprite": "sprites/gargoyle_2.atlas",
|
||||
"deck": "decks/gargoyle.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 31,
|
||||
"life": 16,
|
||||
@@ -1282,7 +1305,7 @@
|
||||
"name": "Geist",
|
||||
"sprite": "sprites/ghost.atlas",
|
||||
"deck": "decks/ghost_blue.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 32,
|
||||
"life": 15,
|
||||
@@ -1306,7 +1329,7 @@
|
||||
"name": "Ghoul",
|
||||
"sprite": "sprites/ghoul.atlas",
|
||||
"deck": "decks/ghoul.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 15,
|
||||
"life": 13,
|
||||
@@ -1330,7 +1353,7 @@
|
||||
"name": "Ghost",
|
||||
"sprite": "sprites/ghost_2.atlas",
|
||||
"deck": "decks/ghost.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 31,
|
||||
"life": 14,
|
||||
@@ -1354,7 +1377,7 @@
|
||||
"name": "Giant Spider",
|
||||
"sprite": "sprites/spider_2.atlas",
|
||||
"deck": "decks/spider_token.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 23,
|
||||
"life": 15,
|
||||
@@ -1378,7 +1401,7 @@
|
||||
"name": "Goblin",
|
||||
"sprite": "sprites/goblin.atlas",
|
||||
"deck": "decks/goblin_bad.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 27,
|
||||
"life": 8,
|
||||
@@ -1421,7 +1444,7 @@
|
||||
"name": "Goblin Chief",
|
||||
"sprite": "sprites/wolf_rider_2.atlas",
|
||||
"deck": "decks/goblin_good.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 29,
|
||||
"life": 10,
|
||||
@@ -1456,7 +1479,7 @@
|
||||
"name": "Goblin Warrior",
|
||||
"sprite": "sprites/wolf_rider.atlas",
|
||||
"deck": "decks/goblin_mid.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 28,
|
||||
"life": 9,
|
||||
@@ -1581,7 +1604,7 @@
|
||||
"name": "Gorgon",
|
||||
"sprite": "sprites/gorgone.atlas",
|
||||
"deck": "decks/gorgon.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 25,
|
||||
"life": 14,
|
||||
@@ -1605,7 +1628,7 @@
|
||||
"name": "Gorgon 2",
|
||||
"sprite": "sprites/gorgonen.atlas",
|
||||
"deck": "decks/gorgon_2.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 25,
|
||||
"life": 14,
|
||||
@@ -1629,7 +1652,7 @@
|
||||
"name": "Green Beast",
|
||||
"sprite": "sprites/basilisk.atlas",
|
||||
"deck": "decks/beast_green.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 22,
|
||||
"life": 18,
|
||||
@@ -1653,7 +1676,7 @@
|
||||
"name": "Green Wiz1",
|
||||
"sprite": "sprites/green_wiz1.atlas",
|
||||
"deck": "decks/green_bad.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 24,
|
||||
"life": 10,
|
||||
@@ -1677,7 +1700,7 @@
|
||||
"name": "Green Wiz2",
|
||||
"sprite": "sprites/green_wiz2.atlas",
|
||||
"deck": "decks/trample.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 24,
|
||||
"life": 10,
|
||||
@@ -1701,7 +1724,7 @@
|
||||
"name": "Green Wiz3",
|
||||
"sprite": "sprites/green_wiz3.atlas",
|
||||
"deck": "decks/ramp.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 24,
|
||||
"life": 10,
|
||||
@@ -1725,7 +1748,7 @@
|
||||
"name": "Griffin",
|
||||
"sprite": "sprites/griffin.atlas",
|
||||
"deck": "decks/griffin.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 32,
|
||||
"life": 15,
|
||||
@@ -1749,7 +1772,7 @@
|
||||
"name": "Harpy",
|
||||
"sprite": "sprites/harpy.atlas",
|
||||
"deck": "decks/harpy.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 31,
|
||||
"life": 13,
|
||||
@@ -1773,7 +1796,7 @@
|
||||
"name": "Harpy 2",
|
||||
"sprite": "sprites/harpy_2.atlas",
|
||||
"deck": "decks/harpy_2.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 31,
|
||||
"life": 13,
|
||||
@@ -1797,7 +1820,7 @@
|
||||
"name": "Hellhound",
|
||||
"sprite": "sprites/hellhound_2.atlas",
|
||||
"deck": "decks/hellhound.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 25,
|
||||
"life": 17,
|
||||
@@ -1821,7 +1844,7 @@
|
||||
"name": "High Elf",
|
||||
"sprite": "sprites/druid_2.atlas",
|
||||
"deck": "decks/elf_good.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 26,
|
||||
"life": 12,
|
||||
@@ -1856,7 +1879,7 @@
|
||||
"name": "High Vampire",
|
||||
"sprite": "sprites/vampire_2.atlas",
|
||||
"deck": "decks/vampire.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 32,
|
||||
"life": 18,
|
||||
@@ -1880,7 +1903,7 @@
|
||||
"name": "Horseman",
|
||||
"sprite": "sprites/cavalier_2.atlas",
|
||||
"deck": "decks/horsemanship.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 30,
|
||||
"life": 14,
|
||||
@@ -1915,7 +1938,7 @@
|
||||
"name": "Human",
|
||||
"sprite": "sprites/pikeman.atlas",
|
||||
"deck": "decks/human_bad.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 23,
|
||||
"life": 11,
|
||||
@@ -1950,7 +1973,7 @@
|
||||
"name": "Human elite",
|
||||
"sprite": "sprites/legionite.atlas",
|
||||
"deck": "decks/human_good.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 25,
|
||||
"life": 13,
|
||||
@@ -1985,7 +2008,7 @@
|
||||
"name": "Human guard",
|
||||
"sprite": "sprites/swordsman.atlas",
|
||||
"deck": "decks/human_mid.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 24,
|
||||
"life": 12,
|
||||
@@ -2020,7 +2043,7 @@
|
||||
"name": "Hydra",
|
||||
"sprite": "sprites/hydra.atlas",
|
||||
"deck": "decks/hydra.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 15,
|
||||
"life": 19,
|
||||
@@ -2055,7 +2078,7 @@
|
||||
"name": "Immersturm Demon",
|
||||
"sprite": "sprites/devil_2.atlas",
|
||||
"deck": "decks/immersturm_demon.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 31,
|
||||
"life": 17,
|
||||
@@ -2079,7 +2102,7 @@
|
||||
"name": "Khan",
|
||||
"sprite": "sprites/cavalier.atlas",
|
||||
"deck": "decks/mardu.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 30,
|
||||
"life": 14,
|
||||
@@ -2103,7 +2126,7 @@
|
||||
"name": "Knight",
|
||||
"sprite": "sprites/paladin.atlas",
|
||||
"deck": "decks/knight.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 30,
|
||||
"life": 14,
|
||||
@@ -2138,7 +2161,7 @@
|
||||
"name": "Lich",
|
||||
"sprite": "sprites/lich_2.atlas",
|
||||
"deck": "decks/lich.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 20,
|
||||
"life": 17,
|
||||
@@ -2162,7 +2185,7 @@
|
||||
"name": "Merfolk",
|
||||
"sprite": "sprites/waterelemental.atlas",
|
||||
"deck": "decks/merfolk_bad.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 23,
|
||||
"life": 12,
|
||||
@@ -2197,7 +2220,7 @@
|
||||
"name": "Merfolk Avatar",
|
||||
"sprite": "sprites/iceelemental.atlas",
|
||||
"deck": "decks/merfolk_good.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 25,
|
||||
"life": 14,
|
||||
@@ -2232,7 +2255,7 @@
|
||||
"name": "Merfolk Fighter",
|
||||
"sprite": "sprites/merfolk.atlas",
|
||||
"deck": "decks/merfolk_lords.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 22,
|
||||
"life": 13,
|
||||
@@ -2267,7 +2290,7 @@
|
||||
"name": "Merfolk Lord",
|
||||
"sprite": "sprites/merfolk_lord.atlas",
|
||||
"deck": "decks/merfolk_lord2.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 25,
|
||||
"life": 14,
|
||||
@@ -2291,7 +2314,7 @@
|
||||
"name": "Merfolk Soldier",
|
||||
"sprite": "sprites/mermaid.atlas",
|
||||
"deck": "decks/merfolk_v_goblins.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 22,
|
||||
"life": 13,
|
||||
@@ -2326,7 +2349,7 @@
|
||||
"name": "Merfolk warrior",
|
||||
"sprite": "sprites/airelemental.atlas",
|
||||
"deck": "decks/merfolk_mid.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 24,
|
||||
"life": 13,
|
||||
@@ -2361,7 +2384,7 @@
|
||||
"name": "Mimic",
|
||||
"sprite": "sprites/mimic.atlas",
|
||||
"deck": "decks/mimic.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 15,
|
||||
"life": 12,
|
||||
@@ -2385,7 +2408,7 @@
|
||||
"name": "Minotaur",
|
||||
"sprite": "sprites/minotaur.atlas",
|
||||
"deck": "decks/minotaur.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 25,
|
||||
"life": 16,
|
||||
@@ -2409,7 +2432,7 @@
|
||||
"name": "Minotaur Flayer",
|
||||
"sprite": "sprites/warden_2.atlas",
|
||||
"deck": "decks/minotaur.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 25,
|
||||
"life": 16,
|
||||
@@ -2433,7 +2456,7 @@
|
||||
"name": "Monk",
|
||||
"sprite": "sprites/monk.atlas",
|
||||
"deck": "decks/angel.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 24,
|
||||
"life": 10,
|
||||
@@ -2457,7 +2480,7 @@
|
||||
"name": "Rakdos Devil",
|
||||
"sprite": "sprites/juggler.atlas",
|
||||
"deck": "decks/rakdos_devil.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 24,
|
||||
"life": 11,
|
||||
@@ -2481,7 +2504,7 @@
|
||||
"name": "Red Beast",
|
||||
"sprite": "sprites/basilisk_2.atlas",
|
||||
"deck": "decks/beast_red.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 23,
|
||||
"life": 17,
|
||||
@@ -2505,7 +2528,7 @@
|
||||
"name": "Red Wiz1",
|
||||
"sprite": "sprites/enchanter.atlas",
|
||||
"deck": "decks/red_bad.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 24,
|
||||
"life": 10,
|
||||
@@ -2529,7 +2552,7 @@
|
||||
"name": "Red Wiz2",
|
||||
"sprite": "sprites/red_wiz2.atlas",
|
||||
"deck": "decks/haste_burn.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 24,
|
||||
"life": 10,
|
||||
@@ -2553,7 +2576,7 @@
|
||||
"name": "Red Wiz3",
|
||||
"sprite": "sprites/red_wiz3.atlas",
|
||||
"deck": "decks/lava_axe.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 24,
|
||||
"life": 10,
|
||||
@@ -2577,7 +2600,7 @@
|
||||
"name": "Rogue",
|
||||
"sprite": "sprites/rogue.atlas",
|
||||
"deck": "decks/rogue.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 25,
|
||||
"life": 11,
|
||||
@@ -2601,7 +2624,7 @@
|
||||
"name": "Satyr",
|
||||
"sprite": "sprites/satyr.atlas",
|
||||
"deck": "decks/satyr.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 25,
|
||||
"life": 8,
|
||||
@@ -2625,7 +2648,7 @@
|
||||
"name": "Sea Monster",
|
||||
"sprite": "sprites/leech_2.atlas",
|
||||
"deck": "decks/sea_monster.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 15,
|
||||
"life": 19,
|
||||
@@ -2649,7 +2672,7 @@
|
||||
"name": "Shaman",
|
||||
"sprite": "sprites/shaman_2.atlas",
|
||||
"deck": "decks/shaman.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 24,
|
||||
"life": 10,
|
||||
@@ -2673,7 +2696,7 @@
|
||||
"name": "Skeleton",
|
||||
"sprite": "sprites/skeleton.atlas",
|
||||
"deck": "decks/skeleton.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 20,
|
||||
"life": 11,
|
||||
@@ -2696,7 +2719,7 @@
|
||||
"name": "Skeleton Soldier",
|
||||
"sprite": "sprites/skeleton_2.atlas",
|
||||
"deck": "decks/skeleton_2.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 20,
|
||||
"life": 11,
|
||||
@@ -2719,7 +2742,7 @@
|
||||
"name": "Sliver",
|
||||
"sprite": "sprites/sliver.atlas",
|
||||
"deck": "decks/sliver.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 24,
|
||||
"life": 14,
|
||||
@@ -2742,7 +2765,7 @@
|
||||
"name": "Snake",
|
||||
"sprite": "sprites/big_snake.atlas",
|
||||
"deck": "decks/snake.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 25,
|
||||
"life": 10,
|
||||
@@ -2766,7 +2789,7 @@
|
||||
"name": "Spider",
|
||||
"sprite": "sprites/spider.atlas",
|
||||
"deck": "decks/spider.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 22,
|
||||
"life": 10,
|
||||
@@ -2790,7 +2813,7 @@
|
||||
"name": "Tarkir Djinn",
|
||||
"sprite": "sprites/djinn_2.atlas",
|
||||
"deck": "decks/djinn_tarkir.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 31,
|
||||
"life": 18,
|
||||
@@ -2814,7 +2837,7 @@
|
||||
"name": "Treefolk",
|
||||
"sprite": "sprites/treant.atlas",
|
||||
"deck": "decks/treefolk.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 16,
|
||||
"life": 17,
|
||||
@@ -2838,7 +2861,7 @@
|
||||
"name": "Treefolk Guardian",
|
||||
"sprite": "sprites/treant_2.atlas",
|
||||
"deck": "decks/treefolk.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 16,
|
||||
"life": 17,
|
||||
@@ -2862,7 +2885,7 @@
|
||||
"name": "Troll",
|
||||
"sprite": "sprites/troll.atlas",
|
||||
"deck": "decks/troll.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 25,
|
||||
"life": 18,
|
||||
@@ -2886,7 +2909,7 @@
|
||||
"name": "Vampire",
|
||||
"sprite": "sprites/vampire.atlas",
|
||||
"deck": "decks/vampire.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 31,
|
||||
"life": 17,
|
||||
@@ -2903,7 +2926,7 @@
|
||||
"name": "Vampire Lord",
|
||||
"sprite": "sprites/vampire_3.atlas",
|
||||
"deck": "decks/vampire_blood_token_fly.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 31,
|
||||
"life": 18,
|
||||
@@ -2920,7 +2943,7 @@
|
||||
"name": "Viashino",
|
||||
"sprite": "sprites/battler.atlas",
|
||||
"deck": "decks/viashino.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 25,
|
||||
"life": 11,
|
||||
@@ -2944,7 +2967,7 @@
|
||||
"name": "Viper",
|
||||
"sprite": "sprites/big_snake_2.atlas",
|
||||
"deck": "decks/snake.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 25,
|
||||
"life": 10,
|
||||
@@ -2968,7 +2991,7 @@
|
||||
"name": "Werewolf",
|
||||
"sprite": "sprites/hellhound.atlas",
|
||||
"deck": "decks/werewolf.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 26,
|
||||
"life": 16,
|
||||
@@ -2991,7 +3014,7 @@
|
||||
"name": "White Dwarf",
|
||||
"sprite": "sprites/dwarf_6.atlas",
|
||||
"deck": "decks/white_dwarf.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 22,
|
||||
"life": 13,
|
||||
@@ -3015,7 +3038,7 @@
|
||||
"name": "White Wiz1",
|
||||
"sprite": "sprites/priest.atlas",
|
||||
"deck": "decks/white_bad.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 24,
|
||||
"life": 10,
|
||||
@@ -3039,7 +3062,7 @@
|
||||
"name": "White Wiz2",
|
||||
"sprite": "sprites/white_wiz2.atlas",
|
||||
"deck": "decks/basri.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 24,
|
||||
"life": 10,
|
||||
@@ -3063,7 +3086,7 @@
|
||||
"name": "White Wiz3",
|
||||
"sprite": "sprites/white_wiz3.atlas",
|
||||
"deck": "decks/human_soldier_token.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 24,
|
||||
"life": 10,
|
||||
@@ -3088,7 +3111,7 @@
|
||||
"sprite": "sprites/leech.atlas",
|
||||
"deck": "decks/wurm.json",
|
||||
"ai": "reckless",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 15,
|
||||
"life": 19,
|
||||
@@ -3123,7 +3146,7 @@
|
||||
"name": "Yeti",
|
||||
"sprite": "sprites/yeti_2.atlas",
|
||||
"deck": "decks/yeti.dck",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 25,
|
||||
"life": 16,
|
||||
@@ -3147,7 +3170,7 @@
|
||||
"name": "Zombie",
|
||||
"sprite": "sprites/zombie.atlas",
|
||||
"deck": "decks/zombie_bad.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 15,
|
||||
"life": 12,
|
||||
@@ -3182,7 +3205,7 @@
|
||||
"name": "Zombie Lord",
|
||||
"sprite": "sprites/lich.atlas",
|
||||
"deck": "decks/zombie_good.json",
|
||||
"spawnRate": 0.2,
|
||||
"spawnRate": 1.0,
|
||||
"difficulty": 0.1,
|
||||
"speed": 21,
|
||||
"life": 18,
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
"height": 0.85,
|
||||
"color": "aeaeae",
|
||||
"spriteNames":[ "WasteTree","Stone","WasteRock"] ,
|
||||
"enemies":[ "Bandit","ClayGolem","Construct","Eldrazi","Gargoyle","Gargoyle 2","Golem","Sliver","Black Wiz1","Black Wiz2","Black Wiz3","Blue Wiz1","Blue Wiz2","Blue Wiz3","Green Wiz1","Green Wiz2","Green Wiz3","Red Wiz1","Red Wiz2","Red Wiz3","White Wiz1","White Wiz2","White Wiz3" ] ,
|
||||
"enemies":[ "Bandit","ClayGolem","Construct","Eldrazi","Gargoyle","Gargoyle 2","Golem","Sliver","Black Wiz1","Black Wiz2","Black Wiz3","Blue Wiz1","Blue Wiz2","Blue Wiz3","Green Wiz1","Green Wiz2","Green Wiz3","Red Wiz1","Red Wiz2","Red Wiz3","White Wiz1","White Wiz2","White Wiz3","Doppelganger" ] ,
|
||||
"pointsOfInterest":[
|
||||
"Final Castle",
|
||||
"Colorless Castle",
|
||||
|
||||
@@ -4,6 +4,8 @@ Types:Legendary Creature Bird Dinosaur
|
||||
PT:3/4
|
||||
K:Flying
|
||||
T:Mode$ TokenCreated | ValidPlayer$ You | OnlyFirst$ True | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever you create one or more tokens for the first time each turn, create a 1/1 white Bird creature token with flying.
|
||||
SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ w_1_1_bird_flying | TokenOwner$ You
|
||||
SVar:TrigToken:DB$ Token | TokenScript$ w_1_1_bird_flying
|
||||
A:AB$ PumpAll | Cost$ 3 U R W | ValidCards$ Creature.token+YouCtrl | KW$ Double Strike | SpellDescription$ Creature tokens you control gain double strike until end of turn.
|
||||
DeckHas:Ability$Token
|
||||
DeckNeeds:Ability$Token
|
||||
Oracle:Flying\nWhenever you create one or more tokens for the first time each turn, create a 1/1 white Bird creature token with flying.\n{3}{U}{R}{W}: Creature tokens you control gain double strike until end of turn.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Name:Artillery Enthusiast
|
||||
ManaCost:R
|
||||
Types:Creature Goblin Artificer
|
||||
PT:1/1
|
||||
PT:1/2
|
||||
S:Mode$ Continuous | Affected$ Creature.modified+YouCtrl | AddKeyword$ Menace | Description$ Modified creatures you control have menace.
|
||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigSeek | TriggerDescription$ When CARDNAME enters the battlefield, you may discard a card. If you do, seek a card with mana value equal to that card's mana value.
|
||||
SVar:TrigSeek:AB$ ChangeZone | Cost$ Discard<1/Card> | Origin$ Library | Destination$ Hand | AtRandom$ True | NoShuffle$ True | Mandatory$ True | NoLooking$ True | NoReveal$ True | ChangeType$ Card.cmcEQX | ChangeNum$ 1
|
||||
|
||||
@@ -5,7 +5,7 @@ PT:1/1
|
||||
K:etbCounter:P1P1:X:no Condition:CARDNAME enters the battlefield with a +1/+1 counter on it for each +1/+1 counter among other creatures you control.
|
||||
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigDouble | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, double the number of +1/+1 counters on CARDNAME.
|
||||
SVar:TrigDouble:DB$ MultiplyCounter | Defined$ Self | CounterType$ P1P1
|
||||
SVar:X:Count$TotalCounters_P1P1_Creature.YouCtrl+Other
|
||||
SVar:X:Count$Valid Creature.YouCtrl+Other$CardCounters.P1P1
|
||||
SVar:NeedsToPlay:Creature.YouCtrl+counters_GE1_P1P1
|
||||
DeckHas:Ability$Counters
|
||||
Oracle:Ascendant Acolyte enters the battlefield with a +1/+1 counter on it for each +1/+1 counter among other creatures you control.\nAt the beginning of your upkeep, double the number of +1/+1 counters on Ascendant Acolyte.
|
||||
|
||||
@@ -5,6 +5,6 @@ PT:3/2
|
||||
K:Reach
|
||||
K:Trample
|
||||
K:etbCounter:P1P1:X:no Condition:CARDNAME enters the battlefield with a +1/+1 counter on it for each other creature you control with a +1/+1 counter on it.
|
||||
SVar:X:Count$LastStateBattlefield Creature.Other+YouCtrl+counters_GE1_P1P1
|
||||
SVar:X:Count$Valid Creature.Other+YouCtrl+counters_GE1_P1P1
|
||||
DeckHints:Ability$Counters
|
||||
Oracle:Reach, trample\nAvatar of the Resolute enters the battlefield with a +1/+1 counter on it for each other creature you control with a +1/+1 counter on it.
|
||||
|
||||
@@ -3,6 +3,6 @@ ManaCost:3 U U
|
||||
Types:Creature Bird Soldier Wizard
|
||||
PT:3/3
|
||||
K:Flying
|
||||
A:AB$ Dig | Cost$ 1 U | DigNum$ 1 | ValidTgts$ Player | TgtPrompt$ Select target player | Reveal$ True | NoMove$ True | SpellDescription$ Target player reveals the top card of their library.
|
||||
A:AB$ PeekAndReveal | Cost$ 1 U | ValidTgts$ Player | TgtPrompt$ Select target player | NoPeek$ True | SpellDescription$ Target player reveals the top card of their library.
|
||||
AI:RemoveDeck:All
|
||||
Oracle:Flying (This creature can't be blocked except by creatures with flying or reach.)\n{1}{U}: Target player reveals the top card of their library.
|
||||
|
||||
6
forge-gui/res/cardsfolder/b/banes_invoker.txt
Normal file
6
forge-gui/res/cardsfolder/b/banes_invoker.txt
Normal 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.
|
||||
6
forge-gui/res/cardsfolder/b/bhaals_invoker.txt
Normal file
6
forge-gui/res/cardsfolder/b/bhaals_invoker.txt
Normal 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.
|
||||
@@ -4,7 +4,7 @@ Types:Creature Hydra Mutant
|
||||
PT:4/4
|
||||
K:Trample
|
||||
K:etbCounter:P1P1:Y:no Condition:CARDNAME enters the battlefield with a +1/+1 counter on it for each loyalty counter on planeswalkers you control.
|
||||
SVar:Y:Count$TotalCounters_LOYALTY_Planeswalker.YouCtrl
|
||||
SVar:Y:Count$Valid Planeswalker.YouCtrl$CardCounters.LOYALTY
|
||||
T:Mode$ CounterAddedAll | CounterType$ LOYALTY | Valid$ Planeswalker.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever one or more loyalty counters are put on planeswalkers you control, put that many +1/+1 counters on CARDNAME.
|
||||
SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ Z
|
||||
SVar:Z:TriggerCount$Amount
|
||||
|
||||
@@ -3,6 +3,6 @@ ManaCost:no cost
|
||||
Types:Land
|
||||
K:ETBReplacement:Other:LandTapped
|
||||
SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionCheckSVar$ ETBCheckSVar2 | ConditionSVarCompare$ GT2 | SpellDescription$ CARDNAME enters the battlefield tapped unless you control two or fewer other lands.
|
||||
SVar:ETBCheckSVar2:Count$LastStateBattlefield Land.YouCtrl
|
||||
SVar:ETBCheckSVar2:Count$Valid Land.YouCtrl
|
||||
A:AB$ Mana | Cost$ T | Produced$ Combo B R | SpellDescription$ Add {B} or {R}.
|
||||
Oracle:Blackcleave Cliffs enters the battlefield tapped unless you control two or fewer other lands.\n{T}: Add {B} or {R}.
|
||||
|
||||
@@ -3,6 +3,6 @@ ManaCost:no cost
|
||||
Types:Land
|
||||
K:ETBReplacement:Other:LandTapped
|
||||
SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionCheckSVar$ ETBCheckSVar2 | ConditionSVarCompare$ GT2 | SpellDescription$ CARDNAME enters the battlefield tapped unless you control two or fewer other lands.
|
||||
SVar:ETBCheckSVar2:Count$LastStateBattlefield Land.YouCtrl
|
||||
SVar:ETBCheckSVar2:Count$Valid Land.YouCtrl
|
||||
A:AB$ Mana | Cost$ T | Produced$ Combo B G | SpellDescription$ Add {B} or {G}.
|
||||
Oracle:Blooming Marsh enters the battlefield tapped unless you control two or fewer other lands.\n{T}: Add {B} or {G}.
|
||||
|
||||
@@ -3,6 +3,6 @@ ManaCost:no cost
|
||||
Types:Land
|
||||
K:ETBReplacement:Other:LandTapped
|
||||
SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionCheckSVar$ ETBCheckSVar2 | ConditionSVarCompare$ GT2 | SpellDescription$ CARDNAME enters the battlefield tapped unless you control two or fewer other lands.
|
||||
SVar:ETBCheckSVar2:Count$LastStateBattlefield Land.YouCtrl
|
||||
SVar:ETBCheckSVar2:Count$Valid Land.YouCtrl
|
||||
A:AB$ Mana | Cost$ T | Produced$ Combo G U | SpellDescription$ Add {G} or {U}.
|
||||
Oracle:Botanical Sanctum enters the battlefield tapped unless you control two or fewer other lands.\n{T}: Add {G} or {U}.
|
||||
|
||||
@@ -2,9 +2,9 @@ Name:Brutal Deceiver
|
||||
ManaCost:2 R
|
||||
Types:Creature Spirit
|
||||
PT:2/2
|
||||
A:AB$ Dig | Cost$ 1 | DigNum$ 1 | DestinationZone$ Library | LibraryPosition$ 0 | LibraryPosition2$ 0 | NoMove$ True | SpellDescription$ Look at the top card of your library.
|
||||
A:AB$ Dig | Cost$ 2 | DigNum$ 1 | ActivationLimit$ 1 | Reveal$ True | DestinationZone$ Library | LibraryPosition$ 0 | LibraryPosition2$ 0 | NoMove$ True | RememberRevealed$ True | SubAbility$ TrigPump | SpellDescription$ Reveal the top card of your library. If it's a land card, CARDNAME gets +1/+0 and gains first strike until end of turn. Activate only once each turn.
|
||||
SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ 1 | KW$ First Strike | ConditionDefined$ Remembered | ConditionPresent$ Card.Land | ConditionCompare$ GE1 | SubAbility$ DBCleanup
|
||||
A:AB$ PeekAndReveal | Cost$ 1 | NoReveal$ True | SpellDescription$ Look at the top card of your library.
|
||||
A:AB$ PeekAndReveal | Cost$ 2 | ActivationLimit$ 1 | NoPeek$ True | RememberRevealed$ True | SubAbility$ DBPump | SpellDescription$ Reveal the top card of your library.
|
||||
SVar:DBPump:DB$ Pump | Defined$ Self | NumAtt$ 1 | KW$ First Strike | ConditionDefined$ Remembered | ConditionPresent$ Card.Land | SubAbility$ DBCleanup | IfDesc$ True | SpellDescription$ If it's a land card, CARDNAME gets +1/+0 and gains first strike until end of turn. Activate only once each turn.
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
AI:RemoveDeck:All
|
||||
Oracle:{1}: Look at the top card of your library.\n{2}: Reveal the top card of your library. If it's a land card, Brutal Deceiver gets +1/+0 and gains first strike until end of turn. Activate only once each turn.
|
||||
|
||||
@@ -2,9 +2,9 @@ Name:Callous Deceiver
|
||||
ManaCost:2 U
|
||||
Types:Creature Spirit
|
||||
PT:1/3
|
||||
A:AB$ Dig | Cost$ 1 | DigNum$ 1 | DestinationZone$ Library | LibraryPosition$ 0 | LibraryPosition2$ 0 | NoMove$ True | SpellDescription$ Look at the top card of your library.
|
||||
A:AB$ Dig | Cost$ 2 | DigNum$ 1 | ActivationLimit$ 1 | Reveal$ True | DestinationZone$ Library | LibraryPosition$ 0 | LibraryPosition2$ 0 | NoMove$ True | RememberRevealed$ True | SubAbility$ TrigPump | SpellDescription$ Reveal the top card of your library. If it's a land card, CARDNAME gets +1/+0 and gains flying until end of turn. Activate only once each turn.
|
||||
SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ 1 | KW$ Flying | ConditionDefined$ Remembered | ConditionPresent$ Card.Land | ConditionCompare$ GE1 | SubAbility$ DBCleanup
|
||||
A:AB$ PeekAndReveal | Cost$ 1 | NoReveal$ True | SpellDescription$ Look at the top card of your library.
|
||||
A:AB$ PeekAndReveal | Cost$ 2 | ActivationLimit$ 1 | NoPeek$ True | RememberRevealed$ True | SubAbility$ DBPump | SpellDescription$ Reveal the top card of your library.
|
||||
SVar:DBPump:DB$ Pump | Defined$ Self | NumAtt$ 1 | KW$ Flying | ConditionDefined$ Remembered | ConditionPresent$ Card.Land | SubAbility$ DBCleanup | IfDesc$ True | SpellDescription$ If it's a land card, CARDNAME gets +1/+0 and gains flying until end of turn. Activate only once each turn.
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
AI:RemoveDeck:All
|
||||
Oracle:{1}: Look at the top card of your library.\n{2}: Reveal the top card of your library. If it's a land card, Callous Deceiver gets +1/+0 and gains flying until end of turn. Activate only once each turn.
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
Name:Candles of Leng
|
||||
ManaCost:2
|
||||
Types:Artifact
|
||||
A:AB$ Dig | Cost$ 4 T | DigNum$ 1 | Reveal$ True | NoMove$ True | RememberRevealed$ True | SubAbility$ DBCandlesChangeZone | SpellDescription$ Reveal the top card of your library. If it has the same name as a card in your graveyard, put it into your graveyard. Otherwise, draw a card.
|
||||
SVar:DBCandlesChangeZone:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Graveyard | ConditionDefined$ Remembered | ConditionPresent$ Card.sharesNameWith YourGraveyard | ConditionCompare$ GE1 | SubAbility$ DBCandlesDraw
|
||||
SVar:DBCandlesDraw:DB$ Draw | NumCards$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Card.sharesNameWith YourGraveyard | ConditionCompare$ EQ0 | SubAbility$ DBCandlesCleanup
|
||||
A:AB$ PeekAndReveal | Cost$ 4 T | NoPeek$ True | RememberRevealed$ True | SubAbility$ DBCandlesChangeZone | SpellDescription$ Reveal the top card of your library.
|
||||
SVar:DBCandlesChangeZone:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Graveyard | ConditionDefined$ Remembered | ConditionPresent$ Card.sharesNameWith YourGraveyard | SubAbility$ DBCandlesDraw | StackDescription$ If it has the same name as a card in their graveyard, they put it into their graveyard. | SpellDescription$ If it has the same name as a card in your graveyard, put it into your graveyard.
|
||||
SVar:DBCandlesDraw:DB$ Draw | ConditionDefined$ Remembered | ConditionPresent$ Card.sharesNameWith YourGraveyard | ConditionCompare$ EQ0 | SubAbility$ DBCandlesCleanup | StackDescription$ Otherwise, they draw a card. | SpellDescription$ Otherwise, draw a card.
|
||||
SVar:DBCandlesCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
Oracle:{4}, {T}: Reveal the top card of your library. If it has the same name as a card in your graveyard, put it into your graveyard. Otherwise, draw a card.
|
||||
|
||||
@@ -4,5 +4,5 @@ Types:Land Forest Plains
|
||||
R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplaceWith$ LandTapped | Description$ CARDNAME enters the battlefield tapped unless you control two or more basic lands.
|
||||
SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionCheckSVar$ ETBCheckSVar | ConditionSVarCompare$ LE1 | SubAbility$ MoveToPlay
|
||||
SVar:MoveToPlay:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard
|
||||
SVar:ETBCheckSVar:Count$LastStateBattlefield Land.Basic+YouCtrl
|
||||
SVar:ETBCheckSVar:Count$Valid Land.Basic+YouCtrl
|
||||
Oracle:({T}: Add {G} or {W}.)\nCanopy Vista enters the battlefield tapped unless you control two or more basic lands.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Name:Captain Eberhart
|
||||
ManaCost:1 W
|
||||
Types:Legendary Creature Human Soldier
|
||||
PT:1/1
|
||||
PT:1/2
|
||||
K:Double Strike
|
||||
S:Mode$ ReduceCost | ValidCard$ Card.YouOwn+DrawnThisTurn | Type$ Spell | Amount$ 1 | Description$ Spells cast from among cards you drew this turn cost {1} less to cast.
|
||||
S:Mode$ RaiseCost | ValidCard$ Card.OppOwn+DrawnThisTurn | Type$ Spell | Amount$ 1 | Description$ Spells cast from among cards your opponents drew this turn cost {1} more to cast.
|
||||
|
||||
@@ -3,7 +3,7 @@ ManaCost:no cost
|
||||
Types:Land
|
||||
K:ETBReplacement:Other:LandTapped
|
||||
SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionCheckSVar$ ETBCheckSVar2 | ConditionSVarCompare$ GE2 | SpellDescription$ If you control two or more other lands, CARDNAME enters the battlefield tapped.
|
||||
SVar:ETBCheckSVar2:Count$LastStateBattlefield Land.YouCtrl
|
||||
SVar:ETBCheckSVar2:Count$Valid Land.YouCtrl
|
||||
A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add {W}.
|
||||
A:AB$ Animate | Cost$ 4 W | Defined$ Self | Power$ 3 | Toughness$ 4 | Types$ Creature,Dragon | Colors$ White | Keywords$ Flying | SpellDescription$ CARDNAME becomes a 3/4 white Dragon creature with flying until end of turn. It's still a land.
|
||||
Oracle:If you control two or more other lands, Cave of the Frost Dragon enters the battlefield tapped.\n{T}: Add {W}.\n{4}{W}: Cave of the Frost Dragon becomes a 3/4 white Dragon creature with flying until end of turn. It's still a land.
|
||||
|
||||
@@ -6,6 +6,6 @@ K:Trample
|
||||
K:etbCounter:P1P1:X:no Condition:CARDNAME enters the battlefield with a +1/+1 counter on it for each land card in all graveyards.
|
||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Graveyard | TriggerZones$ Graveyard | ValidCard$ Card.nonToken+Land | Execute$ TrigReturn | TriggerDescription$ Whenever a land card is put into a graveyard from anywhere, you may pay {G}{G}. If you do, return CARDNAME from your graveyard to your hand.
|
||||
SVar:TrigReturn:AB$ ChangeZone | Cost$ G G | Defined$ Self | Origin$ Graveyard | Destination$ Hand
|
||||
SVar:X:Count$LastStateGraveyard Land
|
||||
SVar:X:Count$ValidGraveyard Land
|
||||
AI:RemoveDeck:Random
|
||||
Oracle:Trample\nCentaur Vinecrasher enters the battlefield with a number of +1/+1 counters on it equal to the number of land cards in all graveyards.\nWhenever a land card is put into a graveyard from anywhere, you may pay {G}{G}. If you do, return Centaur Vinecrasher from your graveyard to your hand.
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
Name:Cerebral Eruption
|
||||
ManaCost:2 R R
|
||||
Types:Sorcery
|
||||
A:SP$ Dig | Cost$ 2 R R | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | DigNum$ 1 | Reveal$ True | NoMove$ True | RememberRevealed$ True | SubAbility$ DBDamage | SpellDescription$ Target opponent reveals the top card of their library. Cerebral Eruption deals damage equal to the revealed card's mana value to that player and each creature they control. If a land card is revealed this way, return Cerebral Eruption to its owner's hand.
|
||||
SVar:DBDamage:DB$ DamageAll | ValidCards$ Creature.TargetedPlayerCtrl | ValidPlayers$ Targeted | ValidDescription$ that player and each creature they control. | NumDmg$ X | SubAbility$ DBReturn
|
||||
SVar:DBReturn:DB$ ChangeZone | Defined$ Parent | Origin$ Stack | Destination$ Hand | ConditionDefined$ Remembered | ConditionPresent$ Land | ConditionCompare$ EQ1 | ConditionDescription$ If a land card is revealed this way, | SubAbility$ DBCleanup
|
||||
A:SP$ PeekAndReveal | ValidTgts$ Opponent | NoPeek$ True | RememberRevealed$ True | SubAbility$ DBDamage | SpellDescription$ Target opponent reveals the top card of their library.
|
||||
SVar:DBDamage:DB$ DamageAll | ValidCards$ Creature.TargetedPlayerCtrl | ValidPlayers$ Targeted | NumDmg$ X | SubAbility$ DBReturn | StackDescription$ SpellDescription | SpellDescription$ CARDNAME deals damage equal to the revealed card's mana value to that player and each creature that player controls.
|
||||
SVar:DBReturn:DB$ ChangeZone | Defined$ Parent | Origin$ Stack | Destination$ Hand | ConditionDefined$ Remembered | ConditionPresent$ Land | StackDescription$ SpellDescription | SubAbility$ DBCleanup | SpellDescription$ If a land card is revealed this way, return CARDNAME to its owner's hand.
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
SVar:X:Remembered$CardManaCost
|
||||
Oracle:Target opponent reveals the top card of their library. Cerebral Eruption deals damage equal to the revealed card's mana value to that player and each creature that player controls. If a land card is revealed this way, return Cerebral Eruption to its owner's hand.
|
||||
|
||||
@@ -4,5 +4,5 @@ Types:Land Mountain Forest
|
||||
R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplaceWith$ LandTapped | Description$ CARDNAME enters the battlefield tapped unless you control two or more basic lands.
|
||||
SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionCheckSVar$ ETBCheckSVar | ConditionSVarCompare$ LE1 | SubAbility$ MoveToPlay
|
||||
SVar:MoveToPlay:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard
|
||||
SVar:ETBCheckSVar:Count$LastStateBattlefield Land.Basic+YouCtrl
|
||||
SVar:ETBCheckSVar:Count$Valid Land.Basic+YouCtrl
|
||||
Oracle:({T}: Add {R} or {G}.)\nCinder Glade enters the battlefield tapped unless you control two or more basic lands.
|
||||
|
||||
@@ -3,9 +3,9 @@ ManaCost:3 B
|
||||
Types:Creature Vampire
|
||||
PT:3/3
|
||||
K:Deathtouch
|
||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, target opponent discards a card with the greatest mana value among cards in their hand. Create a Blood token.
|
||||
SVar:TrigDiscard:DB$ Discard | ValidTgts$ Opponent | TgtPrompt$ Select an opponent | NumCards$ 1 | DiscardValid$ Card.cmcEQX | Mode$ TgtChoose | SubAbility$ DBToken
|
||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, target opponent discards a nonland card with the greatest mana value among cards in their hand. Create a Blood token.
|
||||
SVar:TrigDiscard:DB$ Discard | ValidTgts$ Opponent | TgtPrompt$ Select an opponent | NumCards$ 1 | DiscardValid$ Card.nonLand+cmcEQX | Mode$ TgtChoose | SubAbility$ DBToken
|
||||
SVar:DBToken:DB$ Token | TokenScript$ c_a_blood_draw
|
||||
SVar:X:Count$HighestCMC_Card.TargetedPlayerOwn+inZoneHand
|
||||
DeckHas:Ability$Token|Sacrifice & Type$Blood
|
||||
Oracle:Deathtouch\nWhen Citystalker Connoisseur enters the battlefield, target opponent discards a card with the greatest mana value among cards in their hand. Create a Blood token.
|
||||
DeckHas:Ability$Token|Sacrifice & Type$Artifact|Blood
|
||||
Oracle:Deathtouch\nWhen Citystalker Connoisseur enters the battlefield, target opponent discards a nonland card with the greatest mana value among cards in their hand. Create a Blood token.
|
||||
|
||||
@@ -3,6 +3,6 @@ ManaCost:no cost
|
||||
Types:Land
|
||||
K:ETBReplacement:Other:LandTapped
|
||||
SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionCheckSVar$ ETBCheckSVar2 | ConditionSVarCompare$ GT2 | SpellDescription$ CARDNAME enters the battlefield tapped unless you control two or fewer other lands.
|
||||
SVar:ETBCheckSVar2:Count$LastStateBattlefield Land.YouCtrl
|
||||
SVar:ETBCheckSVar2:Count$Valid Land.YouCtrl
|
||||
A:AB$ Mana | Cost$ T | Produced$ Combo W B | SpellDescription$ Add {W} or {B}.
|
||||
Oracle:Concealed Courtyard enters the battlefield tapped unless you control two or fewer other lands.\n{T}: Add {W} or {B}.
|
||||
|
||||
@@ -8,7 +8,7 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | E
|
||||
SVar:TrigPutCounter:DB$ PutCounter | Defined$ Enchanted | CounterType$ P1P0 | CounterNum$ 1 | SubAbility$ DBDmg
|
||||
SVar:DBDmg:DB$ DealDamage | Defined$ TriggeredPlayer | DamageSource$ Enchanted | NumDmg$ X | ConditionCheckSVar$ Y | ConditionSVarCompare$ GE3 | SubAbility$ DBDes
|
||||
SVar:DBDes:DB$ Destroy | Defined$ Enchanted | NoRegen$ True | ConditionCheckSVar$ Y | ConditionSVarCompare$ GE3
|
||||
SVar:Y:Count$TotalCounters_P1P0_Creature.EnchantedBy
|
||||
SVar:Y:Count$Valid Creature.EnchantedBy$CardCounters.P1P0
|
||||
SVar:X:Enchanted$CardPower
|
||||
AI:RemoveDeck:All
|
||||
Oracle:Enchant non-Wall creature\nEnchanted creature gets +1/+0.\nAt the beginning of your upkeep, put a +1/+0 counter on enchanted creature. If that creature has three or more +1/+0 counters on it, it deals damage equal to its power to its controller, then destroy that creature and it can't be regenerated.
|
||||
|
||||
@@ -3,6 +3,6 @@ ManaCost:no cost
|
||||
Types:Land
|
||||
K:ETBReplacement:Other:LandTapped
|
||||
SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionCheckSVar$ ETBCheckSVar2 | ConditionSVarCompare$ GT2 | SpellDescription$ CARDNAME enters the battlefield tapped unless you control two or fewer other lands.
|
||||
SVar:ETBCheckSVar2:Count$LastStateBattlefield Land.YouCtrl
|
||||
SVar:ETBCheckSVar2:Count$Valid Land.YouCtrl
|
||||
A:AB$ Mana | Cost$ T | Produced$ Combo R G | SpellDescription$ Add {R} or {G}.
|
||||
Oracle:Copperline Gorge enters the battlefield tapped unless you control two or fewer other lands.\n{T}: Add {R} or {G}.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Name:Covenant of Minds
|
||||
ManaCost:4 U
|
||||
Types:Sorcery
|
||||
A:SP$ Dig | Cost$ 4 U | DigNum$ 3 | NoMove$ True | Reveal$ True | DestinationZone$ Library | LibraryPosition$ 0 | LibraryPosition2$ 0 | SubAbility$ DBChoice | RememberRevealed$ True | SpellDescription$ Reveal the top three cards of your library. Target opponent may choose to put those cards into your hand. If they don't, put those cards into your graveyard and draw five cards.
|
||||
A:SP$ PeekAndReveal | PeekAmount$ 3 | NoPeek$ True | SubAbility$ DBChoice | RememberRevealed$ True | StackDescription$ SpellDescription | SpellDescription$ Reveal the top three cards of your library. Target opponent may choose to put those cards into your hand. If they don't, put those cards into your graveyard and draw five cards.
|
||||
SVar:DBChoice:DB$ GenericChoice | ValidTgts$ Opponent | Choices$ CovenantPutIntoHand,CovenantMillDraw | SubAbility$ DBCleanup
|
||||
SVar:CovenantPutIntoHand:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Hand | SpellDescription$ You may choose to put those cards into that player's hand.
|
||||
SVar:CovenantMillDraw:DB$ Mill | Defined$ SourceController | NumCards$ X | SubAbility$ DBDraw | SpellDescription$ If you don't, put those cards into that player's graveyard and that player draws five cards.
|
||||
|
||||
@@ -2,10 +2,10 @@ Name:Cruel Deceiver
|
||||
ManaCost:1 B
|
||||
Types:Creature Spirit
|
||||
PT:2/1
|
||||
A:AB$ Dig | Cost$ 1 | DigNum$ 1 | DestinationZone$ Library | LibraryPosition$ 0 | LibraryPosition2$ 0 | NoMove$ True | SpellDescription$ Look at the top card of your library.
|
||||
A:AB$ Dig | Cost$ 2 | DigNum$ 1 | ActivationLimit$ 1 | Reveal$ True | DestinationZone$ Library | LibraryPosition$ 0 | LibraryPosition2$ 0 | NoMove$ True | RememberRevealed$ True | SubAbility$ TrigAnimate | SpellDescription$ Reveal the top card of your library. If it's a land card, CARDNAME gains "Whenever CARDNAME deals damage to a creature, destroy that creature" until end of turn. Activate only once each turn.
|
||||
SVar:TrigAnimate:DB$ Animate | Defined$ Self | Triggers$ TrigDamage | sVars$ TrigDestroy | ConditionDefined$ Remembered | ConditionPresent$ Card.Land | ConditionCompare$ GE1 | SubAbility$ DBCleanup
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
A:AB$ PeekAndReveal | Cost$ 1 | NoReveal$ True | SpellDescription$ Look at the top card of your library.
|
||||
A:AB$ PeekAndReveal | Cost$ 2 | ActivationLimit$ 1 | NoPeek$ True | RememberRevealed$ True | SubAbility$ DBAnimate | SpellDescription$ Reveal the top card of your library.
|
||||
SVar:DBAnimate:DB$ Animate | Defined$ Self | Triggers$ TrigDamage | sVars$ TrigDestroy | ConditionDefined$ Remembered | ConditionPresent$ Card.Land | SubAbility$ DBCleanup | StackDescription$ SpellDescription | SpellDescription$ If it's a land card, CARDNAME gains "Whenever CARDNAME deals damage to a creature, destroy that creature" until end of turn.
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | StackDescription$ None | SpellDescription$ Activate only once each turn.
|
||||
SVar:TrigDamage:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Creature | TriggerZones$ Battlefield | Execute$ TrigDestroy | TriggerDescription$ Whenever CARDNAME deals damage to a creature, destroy that creature.
|
||||
SVar:TrigDestroy:DB$ Destroy | Defined$ TriggeredTargetLKICopy
|
||||
AI:RemoveDeck:All
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Name:Cycle of Life
|
||||
ManaCost:1 G G
|
||||
Types:Enchantment
|
||||
A:AB$ Animate | Cost$ Return<1/CARDNAME> | ValidTgts$ Creature.ThisTurnCast+YouOwn | TgtPrompt$ Select target creature you cast this turn | Power$ 0 | Toughness$ 1 | Duration$ UntilYourNextUpkeep | SubAbility$ DelTrig | SpellDescription$ Target creature you cast this turn has base power and toughness 0/1 until your next upkeep. At the beginning of your next upkeep, put a +1/+1 counter on that creature.
|
||||
A:AB$ Animate | Cost$ Return<1/CARDNAME> | ValidTgts$ Creature.wasCastByYou+ThisTurnCast | TgtPrompt$ Select target creature you cast this turn | Power$ 0 | Toughness$ 1 | Duration$ UntilYourNextUpkeep | SubAbility$ DelTrig | SpellDescription$ Target creature you cast this turn has base power and toughness 0/1 until your next upkeep. At the beginning of your next upkeep, put a +1/+1 counter on that creature.
|
||||
SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | RememberObjects$ Targeted | Execute$ TrigGrowth | TriggerDescription$ Put a +1/+1 counter on that creature.
|
||||
SVar:TrigGrowth:DB$ PutCounter | Defined$ DelayTriggerRemembered | CounterType$ P1P1 | CounterNum$ 1
|
||||
Oracle:Return Cycle of Life to its owner's hand: Target creature you cast this turn has base power and toughness 0/1 until your next upkeep. At the beginning of your next upkeep, put a +1/+1 counter on that creature.
|
||||
|
||||
@@ -2,9 +2,9 @@ Name:Dakra Mystic
|
||||
ManaCost:U
|
||||
Types:Creature Merfolk Wizard
|
||||
PT:1/1
|
||||
A:AB$ Dig | Cost$ U T | DigNum$ 1 | Defined$ Player | Reveal$ True | NoMove$ True | RememberRevealed$ True | SubAbility$ DBPutRevealed | SpellDescription$ Each player reveals the top card of their library. You may put the revealed cards into their owners' graveyards. If you don't, each player draws a card.
|
||||
A:AB$ PeekAndReveal | Cost$ U T | Defined$ Player | RememberRevealed$ True | SubAbility$ DBPutRevealed | SpellDescription$ Each player reveals the top card of their library. You may put the revealed cards into their owners' graveyards. If you don't, each player draws a card.
|
||||
SVar:DBPutRevealed:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Graveyard | Optional$ True | Imprint$ True | SubAbility$ DBDraw
|
||||
SVar:DBDraw:DB$ Draw | Defined$ Player | NumCards$ 1 | ConditionDefined$ Imprinted | ConditionPresent$ Card | ConditionCompare$ EQ0 | SubAbility$ DBCleanup
|
||||
SVar:DBDraw:DB$ Draw | Defined$ Player | ConditionDefined$ Imprinted | ConditionPresent$ Card | ConditionCompare$ EQ0 | SubAbility$ DBCleanup
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True
|
||||
AI:RemoveDeck:All
|
||||
Oracle:{U}, {T}: Each player reveals the top card of their library. You may put the revealed cards into their owners' graveyards. If you don't, each player draws a card.
|
||||
|
||||
@@ -3,6 +3,6 @@ ManaCost:no cost
|
||||
Types:Land
|
||||
K:ETBReplacement:Other:LandTapped
|
||||
SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionCheckSVar$ ETBCheckSVar2 | ConditionSVarCompare$ GT2 | SpellDescription$ CARDNAME enters the battlefield tapped unless you control two or fewer other lands.
|
||||
SVar:ETBCheckSVar2:Count$LastStateBattlefield Land.YouCtrl
|
||||
SVar:ETBCheckSVar2:Count$Valid Land.YouCtrl
|
||||
A:AB$ Mana | Cost$ T | Produced$ Combo U B | SpellDescription$ Add {U} or {B}.
|
||||
Oracle:Darkslick Shores enters the battlefield tapped unless you control two or fewer other lands.\n{T}: Add {U} or {B}.
|
||||
|
||||
@@ -4,5 +4,5 @@ Types:Land
|
||||
A:AB$ Mana | Cost$ T | Produced$ Combo B G | SpellDescription$ Add {B} or {G}.
|
||||
K:ETBReplacement:Other:LandTapped
|
||||
SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionCheckSVar$ ETBCheckSVar2 | ConditionSVarCompare$ LT2 | SpellDescription$ CARDNAME enters the battlefield tapped unless you control two or more other lands.
|
||||
SVar:ETBCheckSVar2:Count$LastStateBattlefield Land.YouCtrl
|
||||
SVar:ETBCheckSVar2:Count$Valid Land.YouCtrl
|
||||
Oracle:Deathcap Glade enters the battlefield tapped unless you control two or more other lands.\n{T}: Add {B} or {G}.
|
||||
|
||||
@@ -4,6 +4,6 @@ Types:Creature Elf Warrior
|
||||
PT:3/2
|
||||
K:Vigilance
|
||||
A:AB$ Draw | Cost$ 5 G T | Defined$ You | NumCards$ 1 | ReduceCost$ X | SpellDescription$ Draw a card. This ability costs {1} less to activate for each +1/+1 counter on creatures you control.
|
||||
SVar:X:Count$TotalCounters_P1P1_Creature.YouCtrl
|
||||
SVar:X:Count$Valid Creature.YouCtrl$CardCounters.P1P1
|
||||
DeckHints:Ability$Counters
|
||||
Oracle:Vigilance\n{5}{G}, {T}: Draw a card. This ability costs {1} less to activate for each +1/+1 counter on creatures you control.
|
||||
|
||||
@@ -3,7 +3,7 @@ ManaCost:no cost
|
||||
Types:Land
|
||||
K:ETBReplacement:Other:LandTapped
|
||||
SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionCheckSVar$ ETBCheckSVar2 | ConditionSVarCompare$ GT1 | SpellDescription$ If you control two or more other lands, CARDNAME enters the battlefield tapped.
|
||||
SVar:ETBCheckSVar2:Count$LastStateBattlefield Land.YouCtrl
|
||||
SVar:ETBCheckSVar2:Count$Valid Land.YouCtrl
|
||||
A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}.
|
||||
A:AB$ Animate | Cost$ 3 R | Defined$ Self | Power$ 3 | Toughness$ 2 | Types$ Creature,Goblin | Colors$ Red | Triggers$ TrigAttack | SpellDescription$ Until end of turn, CARDNAME becomes a 3/2 red Goblin creature with "Whenever this creature attacks, create a 1/1 red Goblin creature token that's tapped and attacking." It's still a land.
|
||||
SVar:TrigAttack:Mode$ Attacks | ValidCard$ Creature.Self | Execute$ TrigToken | TriggerDescription$ Whenever CARDNAME attacks, create a 1/1 red Goblin creature token that's tapped and attacking.
|
||||
|
||||
@@ -3,6 +3,6 @@ ManaCost:no cost
|
||||
Types:Land
|
||||
K:ETBReplacement:Other:LandTapped
|
||||
SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionCheckSVar$ ETBCheckSVar2 | ConditionSVarCompare$ LT2 | SpellDescription$ CARDNAME enters the battlefield tapped unless you control two or more other lands.
|
||||
SVar:ETBCheckSVar2:Count$LastStateBattlefield Land.YouCtrl
|
||||
SVar:ETBCheckSVar2:Count$Valid Land.YouCtrl
|
||||
A:AB$ Mana | Cost$ T | Produced$ Combo W U | SpellDescription$ Add {W} or {U}.
|
||||
Oracle:Deserted Beach enters the battlefield tapped unless you control two or more other lands.\n{T}: Add {W} or {U}.
|
||||
|
||||
@@ -3,7 +3,7 @@ ManaCost:2 B
|
||||
Types:Creature Zombie Giant
|
||||
PT:2/2
|
||||
K:etbCounter:P1P1:X:no Condition:CARDNAME enters the battlefield with a +1/+1 counter on it for each Zombie card in your graveyard.
|
||||
SVar:X:Count$LastStateGraveyard Zombie.YouCtrl
|
||||
SVar:X:Count$ValidGraveyard Zombie.YouCtrl
|
||||
T:Mode$ SpellCast | ValidCard$ Zombie | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever you cast a Zombie spell, create a tapped 2/2 black Zombie creature token.
|
||||
SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ b_2_2_zombie | TokenTapped$ True | TokenOwner$ You
|
||||
SVar:BuffedBy:Zombie
|
||||
|
||||
@@ -4,9 +4,9 @@ Types:Creature Djinn
|
||||
PT:4/4
|
||||
K:Flying
|
||||
K:etbCounter:WISH:3
|
||||
A:AB$ Dig | Cost$ 2 U U SubCounter<1/WISH> | DigNum$ 1 | Reveal$ True | NoMove$ True | ImprintRevealed$ True | SubAbility$ DBPlay | StackDescription$ {p:You} reveals the top card of their library. {p:You} may play that card without paying its mana cost or exile it. | SpellDescription$ Reveal the top card of your library. You may play that card without paying its mana cost. If you don't, exile it.
|
||||
SVar:DBPlay:DB$ Play | Defined$ Imprinted | Controller$ You | WithoutManaCost$ True | Optional$ True | RememberPlayed$ True | SubAbility$ DBExileIfNotPlayed | StackDescription$ None
|
||||
SVar:DBExileIfNotPlayed:DB$ ChangeZone | Origin$ Library | Destination$ Exile | Defined$ Imprinted | DefinedPlayer$ You | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ EQ0 | SubAbility$ DBCleanup | StackDescription$ None
|
||||
A:AB$ PeekAndReveal | Cost$ 2 U U SubCounter<1/WISH> | NoPeek$ True | ImprintRevealed$ True | SubAbility$ DBPlay | | SpellDescription$ Reveal the top card of your library.
|
||||
SVar:DBPlay:DB$ Play | Defined$ Imprinted | Controller$ You | WithoutManaCost$ True | Optional$ True | RememberPlayed$ True | SubAbility$ DBExileIfNotPlayed | StackDescription$ {p:You} may play that card without paying its mana cost. | SpellDescription$ You may play that card without paying its mana cost.
|
||||
SVar:DBExileIfNotPlayed:DB$ ChangeZone | Origin$ Library | Destination$ Exile | Defined$ Imprinted | DefinedPlayer$ You | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ EQ0 | SubAbility$ DBCleanup | StackDescription$ If they don't, they exile it. | SpellDescription$ If you don't, exile it.
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True
|
||||
AI:RemoveDeck:All
|
||||
Oracle:Flying\nDjinn of Wishes enters the battlefield with three wish counters on it.\n{2}{U}{U}, Remove a wish counter from Djinn of Wishes: Reveal the top card of your library. You may play that card without paying its mana cost. If you don't, exile it.
|
||||
|
||||
@@ -3,7 +3,7 @@ ManaCost:4 B
|
||||
Types:Creature Zombie
|
||||
PT:0/0
|
||||
K:etbCounter:P1P1:X:no Condition:CARDNAME enters the battlefield with X +1/+1 counters on it, where X is the number of creature cards in all graveyards.
|
||||
SVar:X:Count$LastStateGraveyard Creature
|
||||
SVar:X:Count$ValidGraveyard Creature
|
||||
SVar:NeedsToPlayVar:X GE4
|
||||
A:AB$ Pump | Cost$ 2 B SubCounter<1/P1P1> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True | SpellDescription$ Target creature gets -1/-1 until end of turn.
|
||||
Oracle:Drakestown Forgotten enters the battlefield with X +1/+1 counters on it, where X is the number of creature cards in all graveyards.\n{2}{B}, Remove a +1/+1 counter from Drakestown Forgotten: Target creature gets -1/-1 until end of turn.
|
||||
|
||||
@@ -4,5 +4,5 @@ Types:Land
|
||||
A:AB$ Mana | Cost$ T | Produced$ Combo G U | SpellDescription$ Add {G} or {U}.
|
||||
K:ETBReplacement:Other:LandTapped
|
||||
SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionCheckSVar$ ETBCheckSVar2 | ConditionSVarCompare$ LT2 | SpellDescription$ CARDNAME enters the battlefield tapped unless you control two or more other lands.
|
||||
SVar:ETBCheckSVar2:Count$LastStateBattlefield Land.YouCtrl
|
||||
SVar:ETBCheckSVar2:Count$Valid Land.YouCtrl
|
||||
Oracle:Dreamroot Cascade enters the battlefield tapped unless you control two or more other lands.\n{T}: Add {G} or {U}.
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
Name:Druidic Satchel
|
||||
ManaCost:3
|
||||
Types:Artifact
|
||||
A:AB$ Dig | Cost$ 2 T | DigNum$ 1 | DestinationZone$ Library | LibraryPosition$ 0 | LibraryPosition2$ 0 | Reveal$ True | NoMove$ True | RememberRevealed$ True | SubAbility$ DBToken | SpellDescription$ Reveal the top card of your library. If it's a creature card, create a 1/1 green Saproling creature token. If it's a land card, put that card onto the battlefield under your control. If it's a noncreature, nonland card, you gain 2 life.
|
||||
SVar:DBToken:DB$ Token | ConditionDefined$ Remembered | ConditionPresent$ Card.Creature | ConditionCompare$ EQ1 | TokenAmount$ 1 | TokenScript$ g_1_1_saproling | TokenOwner$ You | SubAbility$ DBMove | StackDescription$ If it's a creature card, create a 1/1 green Saproling creature token.
|
||||
SVar:DBMove:DB$ ChangeZone | ConditionDefined$ Remembered | ConditionPresent$ Card.Land | ConditionCompare$ EQ1 | Defined$ Remembered | Origin$ Library | Destination$ Battlefield | SubAbility$ DBGainLife | StackDescription$ If it's a land card, put that card onto the battlefield under your control.
|
||||
SVar:DBGainLife:DB$ GainLife | LifeAmount$ 2 | ConditionDefined$ Remembered | ConditionPresent$ Card.nonLand+nonCreature | ConditionCompare$ EQ1 | SubAbility$ DBCleanup | StackDescription$ If it's a noncreature, nonland card, you gain 2 life.
|
||||
A:AB$ PeekAndReveal | Cost$ 2 T | RememberRevealed$ True | SubAbility$ DBToken | SpellDescription$ Reveal the top card of your library. If it's a creature card, create a 1/1 green Saproling creature token. If it's a land card, put that card onto the battlefield under your control. If it's a noncreature, nonland card, you gain 2 life.
|
||||
SVar:DBToken:DB$ Token | ConditionDefined$ Remembered | ConditionPresent$ Card.Creature | TokenAmount$ 1 | TokenScript$ g_1_1_saproling | TokenOwner$ You | SubAbility$ DBMove | StackDescription$ If it's a creature card, create a 1/1 green Saproling creature token.
|
||||
SVar:DBMove:DB$ ChangeZone | ConditionDefined$ Remembered | ConditionPresent$ Card.Land | Defined$ Remembered | Origin$ Library | Destination$ Battlefield | SubAbility$ DBGainLife | StackDescription$ If it's a land card, put that card onto the battlefield under your control.
|
||||
SVar:DBGainLife:DB$ GainLife | LifeAmount$ 2 | ConditionDefined$ Remembered | ConditionPresent$ Card.nonLand+nonCreature | SubAbility$ DBCleanup | StackDescription$ If it's a noncreature, nonland card, you gain 2 life.
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
DeckHas:Ability$Token|LifeGain
|
||||
DeckHas:Ability$Token|LifeGain & Type$Saproling
|
||||
Oracle:{2}, {T}: Reveal the top card of your library. If it's a creature card, create a 1/1 green Saproling creature token. If it's a land card, put that card onto the battlefield under your control. If it's a noncreature, nonland card, you gain 2 life.
|
||||
|
||||
@@ -3,9 +3,9 @@ ManaCost:2 W W
|
||||
Types:Enchantment
|
||||
S:Mode$ Continuous | AffectedZone$ Hand | Affected$ Card.YouOwn | MayLookAt$ Player | Description$ Play with your hand revealed.
|
||||
R:Event$ Draw | ActiveZones$ Battlefield | ValidPlayer$ You | ReplaceWith$ EnduringRevealTop | Description$ If you would draw a card, reveal the top card of your library instead. If it's a creature card, put it into your graveyard. Otherwise, draw a card.
|
||||
SVar:EnduringRevealTop:DB$ Dig | DigNum$ 1 | Reveal$ True | NoMove$ True | RememberRevealed$ True | SubAbility$ DBEnduringGraveyard
|
||||
SVar:DBEnduringGraveyard:DB$ ChangeZone | Defined$ Remembered | ConditionDefined$ Remembered | ConditionPresent$ Creature | ConditionCompare$ GE1 | Origin$ Library | Destination$ Graveyard | SubAbility$ DBEnduringDraw
|
||||
SVar:DBEnduringDraw:DB$ Draw | NumCards$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Creature | ConditionCompare$ EQ0 | SubAbility$ DBEnduringCleanup
|
||||
SVar:EnduringRevealTop:DB$ PeekAndReveal | NoPeek$ True | RememberRevealed$ True | SubAbility$ DBEnduringGraveyard
|
||||
SVar:DBEnduringGraveyard:DB$ ChangeZone | Defined$ Remembered | ConditionDefined$ Remembered | ConditionPresent$ Creature | Origin$ Library | Destination$ Graveyard | SubAbility$ DBEnduringDraw
|
||||
SVar:DBEnduringDraw:DB$ Draw | ConditionDefined$ Remembered | ConditionPresent$ Creature | ConditionCompare$ EQ0 | SubAbility$ DBEnduringCleanup
|
||||
SVar:DBEnduringCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
T:Mode$ ChangesZone | ValidCard$ Creature.YouOwn | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigEnduringBounce | TriggerZones$ Battlefield | TriggerDescription$ Whenever a creature is put into your graveyard from the battlefield, return it to your hand.
|
||||
SVar:TrigEnduringBounce:DB$ ChangeZone | Defined$ TriggeredNewCardLKICopy | Origin$ Graveyard | Destination$ Hand
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Name:Epiphany at the Drownyard
|
||||
ManaCost:X U
|
||||
Types:Instant
|
||||
A:SP$ Dig | Cost$ X U | DigNum$ Y | Reveal$ True | RememberRevealed$ True | NoMove$ True | SubAbility$ DBTwoPiles | AILogic$ PayX | SpellDescription$ Reveal the top X+1 cards of your library and separate them into two piles. An opponent chooses one of those piles. Put that pile into your hand and the other into your graveyard.
|
||||
A:SP$ PeekAndReveal | Cost$ X U | PeekAmount$ Y | RememberRevealed$ True | NoPeek$ True | SubAbility$ DBTwoPiles | AILogic$ PayX | SpellDescription$ Reveal the top X plus one cards of your library and separate them into two piles. An opponent chooses one of those piles. Put that pile into your hand and the other into your graveyard.
|
||||
SVar:DBTwoPiles:DB$ TwoPiles | Chooser$ Opponent | DefinedCards$ Remembered | Separator$ You | ChosenPile$ DBHand | UnchosenPile$ DBGrave | AILogic$ Worst
|
||||
SVar:DBHand:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Hand | SubAbility$ DBCleanup
|
||||
SVar:DBGrave:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Graveyard | SubAbility$ DBCleanup
|
||||
|
||||
@@ -5,7 +5,7 @@ PT:4/4
|
||||
K:Flying
|
||||
R:Event$ CreateToken | ActiveZones$ Battlefield | CheckSVar$ X | SVarCompare$ EQ0 | ValidPlayer$ You | PlayerTurn$ True | Optional$ True | ReplaceWith$ DBCopy | Description$ The first time you would create one or more tokens during each of your turns, you may instead choose a creature other than CARDNAME and create that many tokens that are copies of that creature.
|
||||
SVar:DBCopy:DB$ ReplaceToken | Type$ ReplaceToken | ValidChoices$ Creature.Other | TokenScript$ Chosen
|
||||
SVar:X:PlayerCountPropertyYou$TokensCreatedThisTurn
|
||||
SVar:X:Count$ThisTurnEntered_Battlefield_Card.token+YouOwn
|
||||
DeckHas:Ability$Token
|
||||
AI:RemoveDeck:All
|
||||
Oracle:Flying\nThe first time you would create one or more tokens during each of your turns, you may instead choose a creature other than Esix, Fractal Bloom and create that many tokens that are copies of that creature.
|
||||
|
||||
@@ -3,11 +3,10 @@ ManaCost:2 U B
|
||||
Types:Legendary Creature Vampire Assassin
|
||||
PT:3/5
|
||||
K:Unblockable
|
||||
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigExile | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, exile target creature that player controls and put a hit counter on that card. That player loses the game if they own three or more exiled card with counters on them. CARDNAME's owner shuffles CARDNAME into their library.
|
||||
SVar:TrigExile:DB$ ChangeZone | ValidTgts$ Creature.ControlledBy TriggeredDefendingPlayer | TgtPrompt$ Exile target creature that player controls | Origin$ Battlefield | Destination$ Exile | RememberTargets$ True | SubAbility$ PutCounter
|
||||
SVar:PutCounter:DB$ PutCounter | Defined$ Remembered | CounterType$ HIT | CounterNum$ 1 | SubAbility$ DBCleanup
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | SubAbility$ DBLose
|
||||
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigExile | TriggerDescription$ Whenever NICKNAME deals combat damage to a player, exile target creature that player controls and put a hit counter on that card. That player loses the game if they own three or more exiled cards with hit counters on them. NICKNAME's owner shuffles NICKNAME into their library.
|
||||
SVar:TrigExile:DB$ ChangeZone | ValidTgts$ Creature.ControlledBy TriggeredDefendingPlayer | TgtPrompt$ Exile target creature that player controls | Origin$ Battlefield | Destination$ Exile | WithCountersType$ HIT | SubAbility$ DBLose
|
||||
SVar:DBLose:DB$ LosesGame | Defined$ TriggeredTarget | ConditionCheckSVar$ CheckExile | ConditionSVarCompare$ GE3 | SubAbility$ DBShuffle
|
||||
SVar:CheckExile:Count$ValidExile Card.counters_GE1_HIT+ControlledBy TriggeredDefendingPlayer
|
||||
SVar:DBShuffle:DB$ ChangeZone | ConditionPresent$ Card.Self | ConditionCompare$ GE1 | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Library | Shuffle$ True
|
||||
SVar:DBShuffle:DB$ ChangeZone | ConditionPresent$ Card.Self | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Library | Shuffle$ True
|
||||
DeckHints:Name$Mari, the Killing Quill
|
||||
Oracle:Etrata, the Silencer can't be blocked.\nWhenever Etrata deals combat damage to a player, exile target creature that player controls and put a hit counter on that card. That player loses the game if they own three or more exiled cards with hit counters on them. Etrata's owner shuffles Etrata into their library.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Name:Experimental Pilot
|
||||
ManaCost:U
|
||||
Types:Creature Human Pilot
|
||||
PT:1/1
|
||||
PT:1/2
|
||||
K:Ward:2
|
||||
A:AB$ NameCard | Cost$ U Discard<2/Card> | Draft$ True | Defined$ You | ChooseFromList$ Cultivator's Caravan,Bomat Bazaar Barge,Raiders' Karve,Demolition Stomper,Futurist Sentinel,Mechtitan Core,Reckoner Bankbuster,High-Speed Hoverbike,Mindlink Mech,Silent Submersible,Mobile Garrison,Untethered Express,Ovalchase Dragster,Daredevil Dragster,Thundering Chariot | SubAbility$ DBMakeCard | SpellDescription$ Draft a card from CARDNAME's spellbook.
|
||||
SVar:DBMakeCard:DB$ MakeCard | Name$ ChosenName | Zone$ Hand | SubAbility$ DBCleanup
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Name:Fact or Fiction
|
||||
ManaCost:3 U
|
||||
Types:Instant
|
||||
A:SP$ Dig | DigNum$ 5 | Reveal$ True | RememberRevealed$ True | NoMove$ True | SubAbility$ DBTwoPiles | SpellDescription$ Reveal the top five cards of your library. An opponent separates those cards into two piles. Put one pile into your hand and the other into your graveyard.
|
||||
A:SP$ PeekAndReveal | PeekAmount$ 5 | RememberRevealed$ True | NoPeek$ True | SubAbility$ DBTwoPiles | SpellDescription$ Reveal the top five cards of your library. An opponent separates those cards into two piles. Put one pile into your hand and the other into your graveyard.
|
||||
SVar:DBTwoPiles:DB$ TwoPiles | Defined$ You | DefinedCards$ Remembered | Separator$ Opponent | ChosenPile$ DBHand | UnchosenPile$ DBGrave | StackDescription$ An opponent separates those cards into two piles. {p:You} puts one pile into their hand and the other into their graveyard.
|
||||
SVar:DBHand:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Hand | SubAbility$ DBCleanup
|
||||
SVar:DBGrave:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Graveyard | SubAbility$ DBCleanup
|
||||
|
||||
@@ -2,9 +2,9 @@ Name:Feral Deceiver
|
||||
ManaCost:3 G
|
||||
Types:Creature Spirit
|
||||
PT:3/2
|
||||
A:AB$ Dig | Cost$ 1 | DigNum$ 1 | DestinationZone$ Library | LibraryPosition$ 0 | LibraryPosition2$ 0 | NoMove$ True | SpellDescription$ Look at the top card of your library.
|
||||
A:AB$ Dig | Cost$ 2 | DigNum$ 1 | ActivationLimit$ 1 | Reveal$ True | DestinationZone$ Library | LibraryPosition$ 0 | LibraryPosition2$ 0 | NoMove$ True | RememberRevealed$ True | SubAbility$ TrigPump | SpellDescription$ Reveal the top card of your library. If it's a land card, CARDNAME gets +2/+2 and gains trample until end of turn. Activate only once each turn.
|
||||
SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ 2 | NumDef$ 2 | KW$ Trample | ConditionDefined$ Remembered | ConditionPresent$ Card.Land | ConditionCompare$ GE1 | SubAbility$ DBCleanup
|
||||
A:AB$ PeekAndReveal | Cost$ 1 | NoReveal$ True | SpellDescription$ Look at the top card of your library.
|
||||
A:AB$ PeekAndReveal | Cost$ 2 | ActivationLimit$ 1 | NoPeek$ True | RememberRevealed$ True | SubAbility$ DBPump | SpellDescription$ Reveal the top card of your library.
|
||||
SVar:DBPump:DB$ Pump | Defined$ Self | NumAtt$ 2 | NumDef$ 2 | KW$ Trample | ConditionDefined$ Remembered | ConditionPresent$ Card.Land | SubAbility$ DBCleanup | IfDesc$ True | SpellDescription$ If it's a land card, CARDNAME gets +2/+2 and gains trample until end of turn. Activate only once each turn.
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
AI:RemoveDeck:All
|
||||
Oracle:{1}: Look at the top card of your library.\n{2}: Reveal the top card of your library. If it's a land card, Feral Deceiver gets +2/+2 and gains trample until end of turn. Activate only once each turn.
|
||||
|
||||
@@ -8,7 +8,7 @@ K:Suspend:X:XCantBe0 X G G
|
||||
T:Mode$ CounterRemoved | ValidCard$ Card.Self | TriggerZones$ Exile | CounterType$ TIME | Execute$ TrigPut | OptionalDecider$ You | TriggerDescription$ Whenever a time counter is removed from CARDNAME while it's exiled, you may put a +1/+1 counter on target creature.
|
||||
SVar:TrigPut:DB$ PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1
|
||||
SVar:X:Count$xPaid
|
||||
SVar:Y:Count$TotalCounters_P1P1_Creature.YouCtrl
|
||||
SVar:Y:Count$Valid Creature.YouCtrl$CardCounters.P1P1
|
||||
SVar:NeedsToPlay:Creature.YouCtrl+inZoneBattlefield
|
||||
DeckHints:Ability$Counters
|
||||
Oracle:Fungal Behemoth's power and toughness are each equal to the number of +1/+1 counters on creatures you control.\nSuspend X—{X}{G}{G}. X can't be 0. (Rather than cast this card from your hand, you may pay {X}{G}{G} and exile it with X time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.)\nWhenever a time counter is removed from Fungal Behemoth while it's exiled, you may put a +1/+1 counter on target creature.
|
||||
|
||||
@@ -2,7 +2,8 @@ Name:Galvanoth
|
||||
ManaCost:3 R R
|
||||
Types:Creature Beast
|
||||
PT:3/3
|
||||
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDig | OptionalDecider$ You | TriggerDescription$ At the beginning of your upkeep, you may look at the top card of your library. You may cast it without paying its mana cost if it's an instant or sorcery spell.
|
||||
SVar:TrigDig:DB$ Dig | DigNum$ 1 | NoMove$ True | SubAbility$ TrigPlay
|
||||
SVar:TrigPlay:DB$ Play | Defined$ TopOfLibrary | WithoutManaCost$ True | ValidSA$ Spell | Optional$ True | ConditionDefined$ TopOfLibrary | ConditionPresent$ Instant,Sorcery | ConditionCompare$ EQ1
|
||||
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPeek | OptionalDecider$ You | TriggerDescription$ At the beginning of your upkeep, you may look at the top card of your library. You may cast it without paying its mana cost if it's an instant or sorcery spell.
|
||||
SVar:TrigPeek:DB$ PeekAndReveal | NoReveal$ True | SubAbility$ TrigPlay
|
||||
SVar:TrigPlay:DB$ Play | Defined$ TopOfLibrary | WithoutManaCost$ True | ValidSA$ Spell | Optional$ True | ConditionDefined$ TopOfLibrary | ConditionPresent$ Instant,Sorcery
|
||||
DeckNeeds:Type$Instant|Sorcery
|
||||
Oracle:At the beginning of your upkeep, you may look at the top card of your library. You may cast it without paying its mana cost if it's an instant or sorcery spell.
|
||||
|
||||
@@ -2,8 +2,7 @@ Name:Game Preserve
|
||||
ManaCost:2 G
|
||||
Types:Enchantment
|
||||
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigReveal | TriggerDescription$ At the beginning of your upkeep, each player reveals the top card of their library. If all cards revealed this way are creature cards, put those cards onto the battlefield under their owners'control.
|
||||
SVar:TrigReveal:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ EachDig | SubAbility$ GoToBattlefield
|
||||
SVar:EachDig:DB$ Dig | Defined$ Remembered | DigNum$ 1 | Reveal$ True | NoMove$ True | RememberRevealed$ True
|
||||
SVar:TrigReveal:DB$ PeekAndReveal | Defined$ Player | RememberRevealed$ True | SubAbility$ GoToBattlefield
|
||||
SVar:GoToBattlefield:DB$ ChangeZoneAll | ChangeType$ Card.TopLibrary | Origin$ Library | Destination$ Battlefield | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ0 | SubAbility$ DBCleanup
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
SVar:X:Count$ValidLibrary Card.nonCreature+IsRemembered
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Name:Garruk, Wrath of the Wilds
|
||||
ManaCost:2 G G
|
||||
Types:Legendary Planeswalker Garruk
|
||||
Loyalty:3
|
||||
Loyalty:4
|
||||
A:AB$ ChooseCard | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | ChoiceZone$ Hand | Choices$ Card.Creature+YouOwn | ChoiceTitle$ Choose up to one creature card in your hand | Amount$ 1 | SubAbility$ DBEffect | StackDescription$ SpellDescription | SpellDescription$ Choose a creature card in your hand. It perpetually gets +1/+1 and perpetually gains "This spell costs {1} less to cast."
|
||||
SVar:DBEffect:DB$ Effect | StaticAbilities$ PerpetualAbility,PerpetualP1P1 | Duration$ Permanent | Name$ Garruk, Wrath of the Wilds's Perpetual Effect | SubAbility$ DBCleanup
|
||||
SVar:PerpetualAbility:Mode$ Continuous | Affected$ Card.ChosenCard | AddStaticAbility$ ReduceCost | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ The chosen card perpetually gets +1/+1 and perpetually gains "This spell costs {1} less to cast."
|
||||
@@ -10,5 +10,5 @@ SVar:ReduceCost:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$
|
||||
A:AB$ NameCard | Cost$ SubCounter<1/LOYALTY> | Planeswalker$ True | Draft$ True | Defined$ You | ChooseFromList$ Mosscoat Goriak,Sylvan Brushstrider,Murasa Rootgrazer,Dire Wolf Prowler,Ferocious Pup,Pestilent Wolf,Garruk's Uprising,Dawntreader Elk,Nessian Hornbeetle,Territorial Scythecat,Trufflesnout,Wary Okapi,Scurrid Colony,Barkhide Troll,Underdark Basilisk | SubAbility$ DBMakeCard | StackDescription$ SpellDescription | SpellDescription$ Draft a card from CARDNAME's spellbook and put it onto the battlefield.
|
||||
SVar:DBMakeCard:DB$ MakeCard | Name$ ChosenName | Zone$ Battlefield | SubAbility$ DBCleanup
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearNamedCard$ True | ClearChosenCard$ True
|
||||
A:AB$ PumpAll | Cost$ SubCounter<5/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidCards$ Creature.YouCtrl | NumAtt$ +3 | NumDef$ +3 | KW$ Trample | SpellDescription$ Until end of turn, creatures you control get +3/+3 and gain trample.
|
||||
Oracle:[+1]: Choose a creature card in your hand. It perpetually gets +1/+1 and perpetually gains "This spell costs {1} less to cast."\n[-1]: Draft a card from Garruk, Wrath of the Wild's spellbook and put it onto the battlefield.\n[-5]: Until end of turn, creatures you control get +3/+3 and gain trample.
|
||||
A:AB$ PumpAll | Cost$ SubCounter<6/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidCards$ Creature.YouCtrl | NumAtt$ +3 | NumDef$ +3 | KW$ Trample | SpellDescription$ Until end of turn, creatures you control get +3/+3 and gain trample.
|
||||
Oracle:[+1]: Choose a creature card in your hand. It perpetually gets +1/+1 and perpetually gains "This spell costs {1} less to cast."\n[-1]: Draft a card from Garruk, Wrath of the Wild's spellbook and put it onto the battlefield.\n[-6]: Until end of turn, creatures you control get +3/+3 and gain trample.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Name:Geist of Regret
|
||||
ManaCost:4 U
|
||||
Types:Creature Spirit
|
||||
PT:4/5
|
||||
PT:5/5
|
||||
K:Flying
|
||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeInstant | TriggerDescription$ When CARDNAME enters the battlefield, put a random instant card from your library into your graveyard. Then put a random sorcery card from your library into your graveyard.
|
||||
SVar:TrigChangeInstant:DB$ ChangeZone | Origin$ Library | Destination$ Graveyard | ChangeType$ Instant.YouOwn | ChangeNum$ 1 | Hidden$ True | AtRandom$ True | NoShuffle$ True | Mandatory$ True | NoLooking$ True | SubAbility$ DBChangeSorcery
|
||||
|
||||
@@ -5,5 +5,5 @@ K:Enchant creature
|
||||
A:SP$ Attach | Cost$ 1 W | ValidTgts$ Creature | AILogic$ Pump
|
||||
S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ Vigilance | AddAbility$ ABBolster | AddPower$ X | AddToughness$ X | Description$ Enchanted creature gets +1/+1 for each +1/+1 counter on other creatures you control. Enchanted creature has vigilance and "{W}, {T}: Bolster 1."
|
||||
SVar:ABBolster:AB$ PutCounter | Cost$ W T | Bolster$ True | CounterNum$ 1 | CounterType$ P1P1 | SpellDescription$ Bolster 1.
|
||||
SVar:X:Count$TotalCounters_P1P1_Creature.YouCtrl+NotEnchantedBy
|
||||
SVar:X:Count$Valid Creature.YouCtrl+NotEnchantedBy$CardCounters.P1P1
|
||||
Oracle:Enchant creature\nEnchanted creature gets +1/+1 for each +1/+1 counter on other creatures you control.\nEnchanted creature has vigilance and "{W}, {T}: Bolster 1." (To bolster 1, choose a creature with the least toughness among creatures you control and put a +1/+1 counter on it.)
|
||||
|
||||
@@ -4,7 +4,7 @@ Colors:red
|
||||
Types:Sorcery
|
||||
K:Suspend:3:R R
|
||||
A:SP$ ChangeZoneAll | ChangeType$ Permanent.YouOwn | Imprint$ True | Origin$ Battlefield | Destination$ Library | Shuffle$ True | SubAbility$ DBDig | SpellDescription$ Shuffle all permanents you own into your library, then reveal that many cards from the top of your library. Put all non-Aura permanent cards revealed this way onto the battlefield, then do the same for Aura cards, then put the rest on the bottom of your library in a random order.
|
||||
SVar:DBDig:DB$ Dig | Defined$ You | NoMove$ True | DigNum$ WarpX | RememberRevealed$ True | Reveal$ True | SubAbility$ DBCleanImprint
|
||||
SVar:DBDig:DB$ PeekAndReveal | NoPeek$ True | PeekAmount$ WarpX | RememberRevealed$ True | SubAbility$ DBCleanImprint
|
||||
SVar:DBCleanImprint:DB$ Cleanup | ClearImprinted$ True | SubAbility$ ChangePermanent
|
||||
SVar:WarpX:Imprinted$Amount
|
||||
SVar:ChangePermanent:DB$ ChangeZoneAll | ChangeType$ Permanent.nonAura+IsRemembered | Origin$ Library | Destination$ Battlefield | ForgetChanged$ True | SubAbility$ ChangeEnchantment
|
||||
|
||||
@@ -5,6 +5,6 @@ PT:0/0
|
||||
K:etbCounter:P1P1:X:no Condition:CARDNAME enters the battlefield with a +1/+1 counter on it for each creature card in your graveyard.
|
||||
A:AB$ Regenerate | Cost$ 1 SubCounter<1/P1P1> | SpellDescription$ Regenerate CARDNAME.
|
||||
K:Dredge:6
|
||||
SVar:X:Count$LastStateGraveyard Creature.YouCtrl
|
||||
SVar:X:Count$ValidGraveyard Creature.YouCtrl
|
||||
SVar:NeedsToPlayVar:X GE3
|
||||
Oracle:Golgari Grave-Troll enters the battlefield with a +1/+1 counter on it for each creature card in your graveyard.\n{1}, Remove a +1/+1 counter from Golgari Grave-Troll: Regenerate Golgari Grave-Troll.\nDredge 6 (If you would draw a card, you may mill six cards instead. If you do, return this card from your graveyard to your hand.)
|
||||
|
||||
@@ -4,7 +4,7 @@ Types:Creature Elf Warrior
|
||||
PT:0/0
|
||||
K:Haste
|
||||
K:etbCounter:P1P1:X:no Condition:Undergrowth - CARDNAME enters the battlefield with a +1/+1 counter on it for each creature card in your graveyard.
|
||||
SVar:X:Count$LastStateGraveyard Creature.YouCtrl
|
||||
SVar:X:Count$ValidGraveyard Creature.YouCtrl
|
||||
SVar:NeedsToPlayVar:X GE3
|
||||
DeckHas:Ability$Counters
|
||||
Oracle:Haste\nUndergrowth — Golgari Raiders enters the battlefield with a +1/+1 counter on it for each creature card in your graveyard.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Name:Guided Passage
|
||||
ManaCost:U R G
|
||||
Types:Sorcery
|
||||
A:SP$ Dig | Cost$ U R G | NumCards$ X | Reveal$ True | NoMove$ True | DestinationZone$ Library | LibraryPosition$ 0 | LibraryPosition2$ 0 | SubAbility$ DBCreature | SpellDescription$ Reveal the cards in your library. An opponent chooses from among them a creature card, a land card, and a noncreature, nonland card. You put the chosen cards into your hand. Then shuffle.
|
||||
A:SP$ PeekAndReveal | PeekAmount$ X | NoPeek$ True | SubAbility$ DBCreature | SpellDescription$ Reveal the cards in your library. An opponent chooses from among them a creature card, a land card, and a noncreature, nonland card. You put the chosen cards into your hand. Then shuffle.
|
||||
SVar:DBCreature:DB$ ChangeZone | ChangeType$ Creature.YouOwn | ChangeNum$ 1 | Chooser$ Opponent | Origin$ Library | Destination$ Hand | SubAbility$ DBLand
|
||||
SVar:DBLand:DB$ ChangeZone | ChangeType$ Land.YouOwn | ChangeNum$ 1 | Chooser$ Opponent | Origin$ Library | Destination$ Hand | SubAbility$ DBNonCreatureNonLand
|
||||
SVar:DBNonCreatureNonLand:DB$ ChangeZone | ChangeType$ Card.nonCreature+nonLand+YouOwn | ChangeNum$ 1 | Chooser$ Opponent | Origin$ Library | Destination$ Hand | Shuffle$ True
|
||||
|
||||
@@ -3,7 +3,7 @@ ManaCost:no cost
|
||||
Types:Land
|
||||
K:ETBReplacement:Other:LandTapped
|
||||
SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionCheckSVar$ ETBCheckSVar2 | ConditionSVarCompare$ GE2 | SpellDescription$ If you control two or more other lands, CARDNAME enters the battlefield tapped.
|
||||
SVar:ETBCheckSVar2:Count$LastStateBattlefield Land.YouCtrl
|
||||
SVar:ETBCheckSVar2:Count$Valid Land.YouCtrl
|
||||
A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}.
|
||||
A:AB$ Animate | Cost$ 5 U | Defined$ Self | Power$ 7 | Toughness$ 7 | Types$ Creature,Giant | Colors$ Blue | Keywords$ Ward:3 | SpellDescription$ Until end of turn, CARDNAME becomes a 7/7 blue Giant creature with ward {3}. It's still a land. (Whenever it becomes the target of a spell or ability an opponent controls, counter it unless that player pays {3}.)
|
||||
Oracle:If you control two or more other lands, Hall of Storm Giants enters the battlefield tapped.\n{T}: Add {U}.\n{5}{U}: Until end of turn, Hall of Storm Giants becomes a 7/7 blue Giant creature with ward {3}. It's still a land. (Whenever it becomes the target of a spell or ability an opponent controls, counter it unless that player pays {3}.)
|
||||
|
||||
@@ -2,10 +2,10 @@ Name:Harsh Deceiver
|
||||
ManaCost:3 W
|
||||
Types:Creature Spirit
|
||||
PT:1/4
|
||||
A:AB$ Dig | Cost$ 1 | DigNum$ 1 | DestinationZone$ Library | LibraryPosition$ 0 | LibraryPosition2$ 0 | NoMove$ True | SpellDescription$ Look at the top card of your library.
|
||||
A:AB$ Dig | Cost$ 2 | DigNum$ 1 | ActivationLimit$ 1 | Reveal$ True | DestinationZone$ Library | LibraryPosition$ 0 | LibraryPosition2$ 0 | NoMove$ True | RememberRevealed$ True | SubAbility$ DBUntap | SpellDescription$ Reveal the top card of your library. If it's a land card, untap CARDNAME and it gets +1/+1 until end of turn. Activate only once each turn.
|
||||
SVar:DBUntap:DB$ Untap | Defined$ Self | SubAbility$ DBPump | ConditionDefined$ Remembered | ConditionPresent$ Card.Land | ConditionCompare$ GE1
|
||||
SVar:DBPump:DB$ Pump | Defined$ Self | NumAtt$ 1 | NumDef$ 1 | SubAbility$ DBCleanup | ConditionDefined$ Remembered | ConditionPresent$ Card.Land | ConditionCompare$ GE1
|
||||
A:AB$ PeekAndReveal | Cost$ 1 | NoReveal$ True | SpellDescription$ Look at the top card of your library.
|
||||
A:AB$ PeekAndReveal | Cost$ 2 | ActivationLimit$ 1 | NoPeek$ True | RememberRevealed$ True | SubAbility$ DBUntap | SpellDescription$ Reveal the top card of your library.
|
||||
SVar:DBUntap:DB$ Untap | Defined$ Self | SubAbility$ DBPump | ConditionDefined$ Remembered | ConditionPresent$ Card.Land | StackDescription$ SpellDescription | SpellDescription$ If it's a land card, untap CARDNAME
|
||||
SVar:DBPump:DB$ Pump | Defined$ Self | NumAtt$ 1 | NumDef$ 1 | SubAbility$ DBCleanup | ConditionDefined$ Remembered | ConditionPresent$ Card.Land | StackDescription$ and it gets +1/+1 until end of turn. | SpellDescription$ and it gets +1/+1 until end of turn. Activate only once each turn.
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
AI:RemoveDeck:All
|
||||
Oracle:{1}: Look at the top card of your library.\n{2}: Reveal the top card of your library. If it's a land card, untap Harsh Deceiver and it gets +1/+1 until end of turn. Activate only once each turn.
|
||||
|
||||
@@ -4,5 +4,5 @@ Types:Land
|
||||
A:AB$ Mana | Cost$ T | Produced$ Combo B R | SpellDescription$ Add {B} or {R}.
|
||||
K:ETBReplacement:Other:LandTapped
|
||||
SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionCheckSVar$ ETBCheckSVar2 | ConditionSVarCompare$ LT2 | SpellDescription$ CARDNAME enters the battlefield tapped unless you control two or more other lands.
|
||||
SVar:ETBCheckSVar2:Count$LastStateBattlefield Land.YouCtrl
|
||||
SVar:ETBCheckSVar2:Count$Valid Land.YouCtrl
|
||||
Oracle:Haunted Ridge enters the battlefield tapped unless you control two or more other lands.\n{T}: Add {B} or {R}.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Name:Haunting Imitation
|
||||
ManaCost:2 U
|
||||
Types:Sorcery
|
||||
A:SP$ Dig | Defined$ Player | DigNum$ 1 | Reveal$ True | NoMove$ True | RememberRevealed$ True | SubAbility$ DBRepeatEach | StackDescription$ SpellDescription | SpellDescription$ Each player reveals the top card of their library. For each creature card revealed this way, create a token that's a copy of that card, except it's 1/1, it's a Spirit in addition to its other types, and it has flying. If no creature cards were revealed this way, return Haunting Imitation to its owner's hand.
|
||||
A:SP$ PeekAndReveal | Defined$ Player | RememberRevealed$ True | SubAbility$ DBRepeatEach | StackDescription$ SpellDescription | SpellDescription$ Each player reveals the top card of their library. For each creature card revealed this way, create a token that's a copy of that card, except it's 1/1, it's a Spirit in addition to its other types, and it has flying. If no creature cards were revealed this way, return Haunting Imitation to its owner's hand.
|
||||
SVar:DBRepeatEach:DB$ RepeatEach | RepeatCards$ Creature.IsRemembered | Zone$ Library | UseImprinted$ True | RepeatSubAbility$ DBToken | SubAbility$ DBReturn
|
||||
SVar:DBToken:DB$ CopyPermanent | Defined$ Imprinted | SetPower$ 1 | SetToughness$ 1 | AddTypes$ Spirit | AddKeywords$ Flying
|
||||
SVar:DBReturn:DB$ ChangeZone | Defined$ Parent | Origin$ Stack | Destination$ Hand | ConditionDefined$ Remembered | ConditionPresent$ Creature | ConditionCompare$ EQ0 | SubAbility$ DBCleanup | StackDescription$ None
|
||||
|
||||
@@ -3,7 +3,7 @@ ManaCost:no cost
|
||||
Types:Land
|
||||
K:ETBReplacement:Other:LandTapped
|
||||
SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionCheckSVar$ ETBCheckSVar2 | ConditionSVarCompare$ GE2 | SpellDescription$ If you control two or more other lands, CARDNAME enters the battlefield tapped.
|
||||
SVar:ETBCheckSVar2:Count$LastStateBattlefield Land.YouCtrl
|
||||
SVar:ETBCheckSVar2:Count$Valid Land.YouCtrl
|
||||
A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}.
|
||||
A:AB$ Animate | Cost$ 3 B | Defined$ Self | Power$ 3 | Toughness$ 3 | Types$ Creature,Beholder | Colors$ Black | Keywords$ Menace | Triggers$ TrigAttack | SpellDescription$ Until end of turn, CARDNAME becomes a 3/3 black Beholder creature with menace and "Whenever this creature attacks, exile target card from defending player's graveyard." It's still a land.
|
||||
SVar:TrigAttack:Mode$ Attacks | ValidCard$ Creature.Self | Execute$ TrigChangeZone | TriggerDescription$ Whenever this creature attacks, exile target card from defending player's graveyard.
|
||||
|
||||
@@ -3,6 +3,6 @@ ManaCost:no cost
|
||||
Types:Land
|
||||
K:ETBReplacement:Other:LandTapped
|
||||
SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionCheckSVar$ ETBCheckSVar2 | ConditionSVarCompare$ GT2 | SpellDescription$ CARDNAME enters the battlefield tapped unless you control two or fewer other lands.
|
||||
SVar:ETBCheckSVar2:Count$LastStateBattlefield Land.YouCtrl
|
||||
SVar:ETBCheckSVar2:Count$Valid Land.YouCtrl
|
||||
A:AB$ Mana | Cost$ T | Produced$ Combo R W | SpellDescription$ Add {R} or {W}.
|
||||
Oracle:Inspiring Vantage enters the battlefield tapped unless you control two or fewer other lands.\n{T}: Add {R} or {W}.
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user