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