() {
+ @Override
+ public boolean apply(Card card) {
+ for (final Trigger tr : card.getTriggers()) {
+ if (tr.getMode() == TriggerType.AttackerBlocked) {
+ SpellAbility ab = tr.getOverridingAbility();
+ if (ab != null) {
+ if (ab.getApi() == ApiType.Pump && "Self".equals(ab.getParam("Defined"))) {
+ String rawP = ab.getParam("NumAtt");
+ String rawT = ab.getParam("NumDef");
+ if ("+X".equals(rawP) && "+X".equals(rawT) && "TriggerCount$NumBlockers".equals(card.getSVar("X"))) {
+ return true;
+ }
+ // TODO: maybe also predict calculated bonus above certain threshold?
+ } else if (ab.getApi() == ApiType.PumpAll && ab.hasParam("ValidCards")
+ && ab.getParam("ValidCards").startsWith("Creature.blockingSource")) {
+ int pBonus = AbilityUtils.calculateAmount(card, ab.getParam("NumAtt"), ab);
+ int tBonus = AbilityUtils.calculateAmount(card, ab.getParam("NumDef"), ab);
+ return (!onlyForDefVsTrample && pBonus < 0) || tBonus < 0;
+ }
+ }
+ }
+ }
+ return false;
+ }
+ };
+ }
+
// Good Gang Blocks means a good trade or no trade
/**
*
@@ -725,8 +757,9 @@ public class AiBlockController {
List tramplingAttackers = CardLists.getKeyword(attackers, Keyword.TRAMPLE);
tramplingAttackers = CardLists.filter(tramplingAttackers, Predicates.not(rampagesOrNeedsManyToBlock(combat)));
- // TODO - should check here for a "rampage-like" trigger that replaced the keyword:
- // "Whenever CARDNAME becomes blocked, it gets +1/+1 until end of turn for each creature blocking it."
+ // TODO - Instead of filtering out rampage-like and similar triggers, make the AI properly count P/T and
+ // reinforce when actually possible without losing material.
+ tramplingAttackers = CardLists.filter(tramplingAttackers, Predicates.not(changesPTWhenBlocked(true)));
for (final Card attacker : tramplingAttackers) {
if (CombatUtil.getMinNumBlockersForAttacker(attacker, combat.getDefenderPlayerByAttacker(attacker)) > combat.getBlockers(attacker).size()
@@ -755,8 +788,9 @@ public class AiBlockController {
List blockers;
List targetAttackers = CardLists.filter(blockedButUnkilled, Predicates.not(rampagesOrNeedsManyToBlock(combat)));
- // TODO - should check here for a "rampage-like" trigger that replaced
- // the keyword: "Whenever CARDNAME becomes blocked, it gets +1/+1 until end of turn for each creature blocking it."
+ // TODO - Instead of filtering out rampage-like and similar triggers, make the AI properly count P/T and
+ // reinforce when actually possible without losing material.
+ targetAttackers = CardLists.filter(targetAttackers, Predicates.not(changesPTWhenBlocked(false)));
for (final Card attacker : targetAttackers) {
blockers = getPossibleBlockers(combat, attacker, blockersLeft, false);
diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java
index 94d3d425adc..9777d7f9bf2 100644
--- a/forge-ai/src/main/java/forge/ai/AiController.java
+++ b/forge-ai/src/main/java/forge/ai/AiController.java
@@ -1929,9 +1929,13 @@ public class AiController {
int cardsInPlay = player.getCardsIn(ZoneType.Battlefield).size();
return Math.min(chosenMax, cardsInPlay);
} else if ("OptionalDraw".equals(logic)) {
+ int cardsInLib = player.getCardsIn(ZoneType.Library).size();
+ if (cardsInLib >= max && player.isCardInPlay("Laboratory Maniac")) {
+ return max;
+ }
int cardsInHand = player.getCardsIn(ZoneType.Hand).size();
int maxDraw = Math.min(player.getMaxHandSize() + 2 - cardsInHand, max);
- int maxCheckLib = Math.min(maxDraw, player.getCardsIn(ZoneType.Library).size());
+ int maxCheckLib = Math.min(maxDraw, cardsInLib);
return Math.max(min, maxCheckLib);
} else if ("RepeatDraw".equals(logic)) {
int remaining = player.getMaxHandSize() - player.getCardsIn(ZoneType.Hand).size()
diff --git a/forge-ai/src/main/java/forge/ai/AiCostDecision.java b/forge-ai/src/main/java/forge/ai/AiCostDecision.java
index 060a1a34231..88b4bcef48a 100644
--- a/forge-ai/src/main/java/forge/ai/AiCostDecision.java
+++ b/forge-ai/src/main/java/forge/ai/AiCostDecision.java
@@ -145,13 +145,20 @@ public class AiCostDecision extends CostDecisionMakerBase {
@Override
public PaymentDecision visit(CostDraw cost) {
+ if (!cost.canPay(ability, player)) {
+ return null;
+ }
Integer c = cost.convertAmount();
if (c == null) {
c = AbilityUtils.calculateAmount(source, cost.getAmount(), ability);
}
- return PaymentDecision.number(c);
+ List res = cost.getPotentialPlayers(player, ability);
+
+ PaymentDecision decision = PaymentDecision.players(res);
+ decision.c = c;
+ return decision;
}
@Override
diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java
index a69292585c1..4d43e0f39d4 100644
--- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java
+++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java
@@ -1044,8 +1044,7 @@ public class ComputerUtil {
if (ai.getManaPool().willManaBeLostAtEndOfPhase()) {
boolean canUseToPayCost = false;
for (byte color : MagicColor.WUBRGC) {
- if (ai.getManaPool().getAmountOfColor(color) > 0
- && ((card.getManaCost().getColorProfile() & color) == color)) {
+ if (ai.getManaPool().getAmountOfColor(color) > 0 && card.getManaCost().canBePaidWithAvailable(color)) {
canUseToPayCost = true;
break;
}
diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java
index 4aca406531a..9c3ce229079 100644
--- a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java
+++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java
@@ -1326,7 +1326,7 @@ public class ComputerUtilCard {
// will the creature attack (only relevant for sorcery speed)?
if (phase.getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS)
&& phase.isPlayerTurn(ai)
- && SpellAbilityAi.isSorcerySpeed(sa) || main1Preferred
+ && (SpellAbilityAi.isSorcerySpeed(sa) || main1Preferred)
&& power > 0
&& doesCreatureAttackAI(ai, c)) {
return true;
diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java
index ff5b74a1a03..cce3219276d 100644
--- a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java
+++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java
@@ -20,6 +20,7 @@ import forge.game.phase.PhaseType;
import forge.game.player.Player;
import forge.game.spellability.Spell;
import forge.game.spellability.SpellAbility;
+import forge.game.trigger.WrappedAbility;
import forge.game.zone.ZoneType;
import forge.util.MyRandom;
import forge.util.TextUtil;
@@ -590,7 +591,7 @@ public class ComputerUtilCost {
}
// Ward - will be accounted for when rechecking a targeted ability
- if (sa.usesTargeting()) {
+ if (!(sa instanceof WrappedAbility) && sa.usesTargeting()) {
for (Card tgt : sa.getTargets().getTargetCards()) {
if (tgt.hasKeyword(Keyword.WARD) && tgt.isInPlay() && tgt.getController().isOpponentOf(sa.getHostCard().getController())) {
Cost wardCost = ComputerUtilCard.getTotalWardCost(tgt);
@@ -662,7 +663,7 @@ public class ComputerUtilCost {
}
} else if ("RiskFactor".equals(aiLogic)) {
final Player activator = sa.getActivatingPlayer();
- if (!activator.canDraw() || activator.hasKeyword("You can't draw more than one card each turn.")) {
+ if (!activator.canDraw()) {
return false;
}
} else if ("MorePowerful".equals(aiLogic)) {
diff --git a/forge-ai/src/main/java/forge/ai/SpecialCardAi.java b/forge-ai/src/main/java/forge/ai/SpecialCardAi.java
index 459b4714a5d..7584678db2e 100644
--- a/forge-ai/src/main/java/forge/ai/SpecialCardAi.java
+++ b/forge-ai/src/main/java/forge/ai/SpecialCardAi.java
@@ -545,6 +545,32 @@ public class SpecialCardAi {
}
}
+ // Fell the Mighty
+ public static class FellTheMighty {
+ public static boolean consider(final Player ai, final SpellAbility sa) {
+ CardCollection aiList = ai.getCreaturesInPlay();
+ if (aiList.isEmpty()) {
+ return false;
+ }
+ CardLists.sortByPowerAsc(aiList);
+ Card lowest = aiList.get(0);
+ if (!sa.canTarget(lowest)) {
+ return false;
+ }
+
+ CardCollection oppList = CardLists.filter(ai.getGame().getCardsIn(ZoneType.Battlefield),
+ CardPredicates.Presets.CREATURES, CardPredicates.isControlledByAnyOf(ai.getOpponents()));
+
+ oppList = CardLists.filterPower(oppList, lowest.getNetPower() + 1);
+ if (ComputerUtilCard.evaluateCreatureList(oppList) > 200) {
+ sa.resetTargets();
+ sa.getTargets().add(lowest);
+ return true;
+ }
+ return false;
+ }
+ }
+
// Force of Will
public static class ForceOfWill {
public static boolean consider(final Player ai, final SpellAbility sa) {
diff --git a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java
index f9c97cf30f5..2b621d1003a 100644
--- a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java
@@ -1,32 +1,12 @@
package forge.ai.ability;
-import java.util.*;
-
-import forge.game.card.*;
-import forge.game.keyword.Keyword;
-import org.apache.commons.lang3.StringUtils;
-
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
-
-import forge.ai.AiAttackController;
-import forge.ai.AiCardMemory;
-import forge.ai.AiController;
-import forge.ai.AiProps;
-import forge.ai.ComputerUtil;
-import forge.ai.ComputerUtilAbility;
-import forge.ai.ComputerUtilCard;
-import forge.ai.ComputerUtilCombat;
-import forge.ai.ComputerUtilCost;
-import forge.ai.ComputerUtilMana;
-import forge.ai.PlayerControllerAi;
-import forge.ai.SpecialAiLogic;
-import forge.ai.SpecialCardAi;
-import forge.ai.SpellAbilityAi;
-import forge.ai.SpellApiToAi;
+import forge.ai.*;
+import forge.card.CardType;
import forge.card.MagicColor;
import forge.game.Game;
import forge.game.GameEntity;
@@ -35,12 +15,14 @@ import forge.game.GlobalRuleChange;
import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType;
+import forge.game.card.*;
import forge.game.card.CardPredicates.Presets;
import forge.game.combat.Combat;
import forge.game.cost.Cost;
import forge.game.cost.CostDiscard;
import forge.game.cost.CostPart;
import forge.game.cost.CostPutCounter;
+import forge.game.keyword.Keyword;
import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType;
import forge.game.player.Player;
@@ -50,8 +32,12 @@ import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
import forge.game.staticability.StaticAbilityMustTarget;
import forge.game.zone.ZoneType;
+import forge.util.Aggregates;
import forge.util.MyRandom;
import forge.util.collect.FCollection;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.*;
public class ChangeZoneAi extends SpellAbilityAi {
/*
@@ -1211,7 +1197,6 @@ public class ChangeZoneAi extends SpellAbilityAi {
if (choice == null) { // Could not find a creature.
if (ai.getLife() <= 5) { // Desperate?
// Get something AI can cast soon.
- System.out.println("5 Life or less, trying to find something castable.");
CardLists.sortByCmcDesc(nonLands);
for (Card potentialCard : nonLands) {
if (ComputerUtilMana.hasEnoughManaSourcesToCast(potentialCard.getFirstSpellAbility(), ai)) {
@@ -1221,7 +1206,6 @@ public class ChangeZoneAi extends SpellAbilityAi {
}
} else {
// Get the best card in there.
- System.out.println("No creature and lots of life, finding something good.");
choice = ComputerUtilCard.getBestAI(nonLands);
}
}
@@ -1487,7 +1471,6 @@ public class ChangeZoneAi extends SpellAbilityAi {
if (choice == null) { // Could not find a creature.
if (ai.getLife() <= 5) { // Desperate?
// Get something AI can cast soon.
- System.out.println("5 Life or less, trying to find something castable.");
CardLists.sortByCmcDesc(nonLands);
for (Card potentialCard : nonLands) {
if (ComputerUtilMana.hasEnoughManaSourcesToCast(potentialCard.getFirstSpellAbility(), ai)) {
@@ -1497,7 +1480,6 @@ public class ChangeZoneAi extends SpellAbilityAi {
}
} else {
// Get the best card in there.
- System.out.println("No creature and lots of life, finding something good.");
choice = ComputerUtilCard.getBestAI(nonLands);
}
}
@@ -1544,11 +1526,9 @@ public class ChangeZoneAi extends SpellAbilityAi {
if ("DeathgorgeScavenger".equals(logic)) {
return SpecialCardAi.DeathgorgeScavenger.consider(ai, sa);
- }
- if ("ExtraplanarLens".equals(logic)) {
+ } else if ("ExtraplanarLens".equals(logic)) {
return SpecialCardAi.ExtraplanarLens.consider(ai, sa);
- }
- if ("ExileCombatThreat".equals(logic)) {
+ } else if ("ExileCombatThreat".equals(logic)) {
return doExileCombatThreatLogic(ai, sa);
}
@@ -1574,7 +1554,7 @@ public class ChangeZoneAi extends SpellAbilityAi {
return null;
}
if (sa.hasParam("AILogic")) {
- String logic = sa.getParam("AILogic");
+ String logic = sa.getParamOrDefault("AILogic", "");
if ("NeverBounceItself".equals(logic)) {
Card source = sa.getHostCard();
if (fetchList.contains(source) && (fetchList.size() > 1 || !sa.getRootAbility().isMandatory())) {
@@ -1597,6 +1577,8 @@ public class ChangeZoneAi extends SpellAbilityAi {
multipleCardsToChoose.remove(0);
return choice;
}
+ } else if (logic.startsWith("ExilePreference")) {
+ return doExilePreferenceLogic(decider, sa, fetchList);
}
}
if (fetchList.isEmpty()) {
@@ -1680,12 +1662,10 @@ public class ChangeZoneAi extends SpellAbilityAi {
canCastSomething = canCastSomething || ComputerUtilMana.hasEnoughManaSourcesToCast(cardInHand.getFirstSpellAbility(), decider);
}
if (!canCastSomething) {
- System.out.println("Pulling a land as there are none in hand, less than 4 on the board, and nothing in hand is castable.");
c = basicManaFixing(decider, fetchList);
}
}
if (c == null) {
- System.out.println("Don't need a land or none available; trying for a creature.");
fetchList = CardLists.getNotType(fetchList, "Land");
// Prefer to pull a creature, generally more useful for AI.
c = chooseCreature(decider, CardLists.filter(fetchList, CardPredicates.Presets.CREATURES));
@@ -1693,7 +1673,6 @@ public class ChangeZoneAi extends SpellAbilityAi {
if (c == null) { // Could not find a creature.
if (decider.getLife() <= 5) { // Desperate?
// Get something AI can cast soon.
- System.out.println("5 Life or less, trying to find something castable.");
CardLists.sortByCmcDesc(fetchList);
for (Card potentialCard : fetchList) {
if (ComputerUtilMana.hasEnoughManaSourcesToCast(potentialCard.getFirstSpellAbility(), decider)) {
@@ -1703,7 +1682,6 @@ public class ChangeZoneAi extends SpellAbilityAi {
}
} else {
// Get the best card in there.
- System.out.println("No creature and lots of life, finding something good.");
c = ComputerUtilCard.getBestAI(fetchList);
}
}
@@ -1786,7 +1764,7 @@ public class ChangeZoneAi extends SpellAbilityAi {
@Override
public Player chooseSinglePlayer(Player ai, SpellAbility sa, Iterable options, Map params) {
// Called when attaching Aura to player or adding creature to combat
- if (params.containsKey("Attacker")) {
+ if (params != null && params.containsKey("Attacker")) {
return (Player) ComputerUtilCombat.addAttackerToCombat(sa, (Card) params.get("Attacker"), new FCollection(options));
}
return AttachAi.attachToPlayerAIPreferences(ai, sa, true, (List)options);
@@ -1794,7 +1772,7 @@ public class ChangeZoneAi extends SpellAbilityAi {
@Override
protected GameEntity chooseSinglePlayerOrPlaneswalker(Player ai, SpellAbility sa, Iterable options, Map params) {
- if (params.containsKey("Attacker")) {
+ if (params != null && params.containsKey("Attacker")) {
return ComputerUtilCombat.addAttackerToCombat(sa, (Card) params.get("Attacker"), new FCollection(options));
}
// should not be reached
@@ -2037,6 +2015,143 @@ public class ChangeZoneAi extends SpellAbilityAi {
return false;
}
+ public static Card doExilePreferenceLogic(final Player aiPlayer, final SpellAbility sa, CardCollection fetchList) {
+ // Filter by preference. If nothing is preferred, choose the best/worst/random target for the opponent
+ // or for the AI depending on the settings. This logic must choose at least something if at all possible,
+ // since it's called from chooseSingleCard.
+ if (fetchList.isEmpty()) {
+ return null; // there was nothing to choose at all
+ }
+
+ final Card host = sa.getHostCard();
+ final String logic = sa.getParamOrDefault("AILogic", "");
+ final String valid = logic.split(":")[1];
+ final boolean isCurse = logic.contains("Curse");
+ final boolean isOwnOnly = logic.contains("OwnOnly");
+ final boolean isWorstChoice = logic.contains("Worst");
+ final boolean isRandomChoice = logic.contains("Random");
+
+ if (logic.endsWith("HighestCMC")) {
+ return ComputerUtilCard.getMostExpensivePermanentAI(fetchList);
+ } else if (logic.contains("MostProminent")) {
+ CardCollection scanList = new CardCollection();
+ if (logic.endsWith("OwnType")) {
+ scanList.addAll(aiPlayer.getCardsIn(ZoneType.Library));
+ scanList.addAll(aiPlayer.getCardsIn(ZoneType.Hand));
+ } else if (logic.endsWith("OppType")) {
+ // this assumes that the deck list is known to the AI before the match starts,
+ // so it's possible to figure out what remains in library/hand if you know what's
+ // in graveyard, exile, etc.
+ scanList.addAll(aiPlayer.getOpponents().getCardsIn(ZoneType.Library));
+ scanList.addAll(aiPlayer.getOpponents().getCardsIn(ZoneType.Hand));
+ }
+
+ if (logic.contains("NonLand")) {
+ scanList = CardLists.filter(scanList, Predicates.not(Presets.LANDS));
+ }
+
+ if (logic.contains("NonExiled")) {
+ CardCollection exiledBy = new CardCollection();
+ for (Card exiled : aiPlayer.getGame().getCardsIn(ZoneType.Exile)) {
+ if (exiled.getExiledWith() != null && exiled.getExiledWith().getName().equals(host.getName())) {
+ exiledBy.add(exiled);
+ }
+ }
+ scanList = CardLists.filter(scanList, new Predicate() {
+ @Override
+ public boolean apply(Card card) {
+ if (exiledBy.isEmpty()) {
+ return true;
+ }
+ for (Card c : exiledBy) {
+ return !c.getType().sharesCardTypeWith(card.getType());
+ }
+ return true;
+ }
+ });
+ }
+
+ CardCollectionView graveyardList = aiPlayer.getGame().getCardsIn(ZoneType.Graveyard);
+ Set presentTypes = new HashSet<>();
+ for (Card inGrave : graveyardList) {
+ for(CardType.CoreType type : inGrave.getType().getCoreTypes()) {
+ presentTypes.add(type);
+ }
+ }
+
+ final Map typesInDeck = Maps.newHashMap();
+ for (final Card c : scanList) {
+ for (CardType.CoreType ct : c.getType().getCoreTypes()) {
+ if (presentTypes.contains(ct)) {
+ Integer count = typesInDeck.get(ct);
+ if (count == null) {
+ count = 0;
+ }
+ typesInDeck.put(ct, count + 1);
+ }
+ }
+ }
+ int max = 0;
+ CardType.CoreType maxType = CardType.CoreType.Land;
+
+ for (final Map.Entry entry : typesInDeck.entrySet()) {
+ final CardType.CoreType type = entry.getKey();
+
+ if (max < entry.getValue()) {
+ max = entry.getValue();
+ maxType = type;
+ }
+ }
+
+ final CardType.CoreType determinedMaxType = maxType;
+ CardCollection preferredList = CardLists.filter(fetchList, new Predicate() {
+ @Override
+ public boolean apply(Card card) {
+ return card.getType().hasType(determinedMaxType);
+ }
+ });
+ CardCollection preferredOppList = CardLists.filter(preferredList, CardPredicates.isControlledByAnyOf(aiPlayer.getOpponents()));
+
+ if (!preferredOppList.isEmpty()) {
+ return Aggregates.random(preferredOppList);
+ } else if (!preferredList.isEmpty()) {
+ return Aggregates.random(preferredList);
+ }
+
+ return Aggregates.random(fetchList);
+ }
+
+ CardCollection preferredList = CardLists.filter(fetchList, new Predicate() {
+ @Override
+ public boolean apply(Card card) {
+ boolean playerPref = true;
+ if (isCurse) {
+ playerPref = card.getController().isOpponentOf(aiPlayer);
+ } else if (isOwnOnly) {
+ playerPref = card.getController().equals(aiPlayer) || !card.getController().isOpponentOf(aiPlayer);
+ }
+
+ if (!playerPref) {
+ return false;
+ }
+
+ return card.isValid(valid, aiPlayer, host, sa); // for things like ExilePreference:Land.Basic
+ }
+ });
+
+ if (!preferredList.isEmpty()) {
+ if (isRandomChoice) {
+ return Aggregates.random(preferredList);
+ }
+ return isWorstChoice ? ComputerUtilCard.getWorstAI(preferredList) : ComputerUtilCard.getBestAI(preferredList);
+ } else {
+ if (isRandomChoice) {
+ return Aggregates.random(preferredList);
+ }
+ return isWorstChoice ? ComputerUtilCard.getWorstAI(fetchList) : ComputerUtilCard.getBestAI(fetchList);
+ }
+ }
+
private static CardCollection getSafeTargetsIfUnlessCostPaid(Player ai, SpellAbility sa, Iterable potentialTgts) {
// Determines if the controller of each potential target can negate the ChangeZone effect
// by paying the Unless cost. Returns the list of targets that can be saved that way.
diff --git a/forge-ai/src/main/java/forge/ai/ability/CopyPermanentAi.java b/forge-ai/src/main/java/forge/ai/ability/CopyPermanentAi.java
index e17bdd279ec..f5a60501da9 100644
--- a/forge-ai/src/main/java/forge/ai/ability/CopyPermanentAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/CopyPermanentAi.java
@@ -247,7 +247,7 @@ public class CopyPermanentAi extends SpellAbilityAi {
@Override
protected Player chooseSinglePlayer(Player ai, SpellAbility sa, Iterable options, Map params) {
- if (params.containsKey("Attacker")) {
+ if (params != null && params.containsKey("Attacker")) {
return (Player) ComputerUtilCombat.addAttackerToCombat(sa, (Card) params.get("Attacker"), new FCollection(options));
}
final List cards = new PlayerCollection(options).getCreaturesInPlay();
@@ -257,7 +257,7 @@ public class CopyPermanentAi extends SpellAbilityAi {
@Override
protected GameEntity chooseSinglePlayerOrPlaneswalker(Player ai, SpellAbility sa, Iterable options, Map params) {
- if (params.containsKey("Attacker")) {
+ if (params != null && params.containsKey("Attacker")) {
return ComputerUtilCombat.addAttackerToCombat(sa, (Card) params.get("Attacker"), new FCollection(options));
}
// should not be reached
diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java
index 9c8570e9cef..18f216f31b1 100644
--- a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java
@@ -488,6 +488,9 @@ public class CountersPutAi extends CountersAi {
}
});
+ // Filter AI-specific targets if provided
+ list = ComputerUtil.filterAITgts(sa, ai, list, false);
+
if (abCost.hasSpecificCostType(CostSacrifice.class)) {
Card sacTarget = ComputerUtil.getCardPreference(ai, source, "SacCost", list);
// this card is planned to be sacrificed during cost payment, so don't target it
@@ -805,6 +808,9 @@ public class CountersPutAi extends CountersAi {
}
list = CardLists.getTargetableCards(list, sa);
+ // Filter AI-specific targets if provided
+ list = ComputerUtil.filterAITgts(sa, ai, list, false);
+
int totalTargets = list.size();
sa.resetTargets();
diff --git a/forge-ai/src/main/java/forge/ai/ability/DestroyAllAi.java b/forge-ai/src/main/java/forge/ai/ability/DestroyAllAi.java
index 990db0b9757..17701bc2d77 100644
--- a/forge-ai/src/main/java/forge/ai/ability/DestroyAllAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/DestroyAllAi.java
@@ -2,13 +2,7 @@ package forge.ai.ability;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
-
-import forge.ai.AiBlockController;
-import forge.ai.ComputerUtil;
-import forge.ai.ComputerUtilCard;
-import forge.ai.ComputerUtilCombat;
-import forge.ai.ComputerUtilCost;
-import forge.ai.SpellAbilityAi;
+import forge.ai.*;
import forge.card.MagicColor;
import forge.game.card.Card;
import forge.game.card.CardCollection;
@@ -66,7 +60,13 @@ public class DestroyAllAi extends SpellAbilityAi {
if (ComputerUtil.preventRunAwayActivations(sa)) {
return false;
}
-
+
+ final String aiLogic = sa.getParamOrDefault("AILogic", "");
+
+ if ("FellTheMighty".equals(aiLogic)) {
+ return SpecialCardAi.FellTheMighty.consider(ai, sa);
+ }
+
return doMassRemovalLogic(ai, sa);
}
diff --git a/forge-ai/src/main/java/forge/ai/ability/DigAi.java b/forge-ai/src/main/java/forge/ai/ability/DigAi.java
index 25602dc9d98..e16d8ce48df 100644
--- a/forge-ai/src/main/java/forge/ai/ability/DigAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/DigAi.java
@@ -121,6 +121,12 @@ public class DigAi extends SpellAbilityAi {
return !ComputerUtil.preventRunAwayActivations(sa);
}
+ @Override
+ public boolean chkAIDrawback(SpellAbility sa, Player aiPlayer) {
+ // TODO: improve this check in ways that may be specific to a subability
+ return canPlayAI(aiPlayer, sa);
+ }
+
@Override
protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) {
final SpellAbility root = sa.getRootAbility();
@@ -183,7 +189,7 @@ public class DigAi extends SpellAbilityAi {
*/
@Override
public Player chooseSinglePlayer(Player ai, SpellAbility sa, Iterable options, Map params) {
- if (params.containsKey("Attacker")) {
+ if (params != null && params.containsKey("Attacker")) {
return (Player) ComputerUtilCombat.addAttackerToCombat(sa, (Card) params.get("Attacker"), new FCollection(options));
}
// an opponent choose a card from
@@ -192,7 +198,7 @@ public class DigAi extends SpellAbilityAi {
@Override
protected GameEntity chooseSinglePlayerOrPlaneswalker(Player ai, SpellAbility sa, Iterable options, Map params) {
- if (params.containsKey("Attacker")) {
+ if (params != null && params.containsKey("Attacker")) {
return ComputerUtilCombat.addAttackerToCombat(sa, (Card) params.get("Attacker"), new FCollection(options));
}
// should not be reached
diff --git a/forge-ai/src/main/java/forge/ai/ability/DrawAi.java b/forge-ai/src/main/java/forge/ai/ability/DrawAi.java
index e5a747f1ebf..48a3dcce9a0 100644
--- a/forge-ai/src/main/java/forge/ai/ability/DrawAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/DrawAi.java
@@ -224,7 +224,7 @@ public class DrawAi extends SpellAbilityAi {
final Game game = ai.getGame();
final String logic = sa.getParamOrDefault("AILogic", "");
final boolean considerPrimary = logic.equals("ConsiderPrimary");
- final boolean drawback = (sa.getParent() != null) && !considerPrimary;
+ final boolean drawback = sa.getParent() != null && !considerPrimary;
boolean assumeSafeX = false; // if true, the AI will assume that the X value has been set to a value that is safe to draw
int computerHandSize = ai.getCardsIn(ZoneType.Hand).size();
@@ -266,7 +266,7 @@ public class DrawAi extends SpellAbilityAi {
// [Necrologia, Pay X Life : Draw X Cards]
// Don't draw more than what's "safe" and don't risk a near death experience
boolean aggroAI = (((PlayerControllerAi) ai.getController()).getAi()).getBooleanProperty(AiProps.PLAY_AGGRO);
- while ((ComputerUtil.aiLifeInDanger(ai, aggroAI, numCards) && (numCards > 0))) {
+ while (ComputerUtil.aiLifeInDanger(ai, aggroAI, numCards) && numCards > 0) {
numCards--;
}
}
@@ -310,8 +310,20 @@ public class DrawAi extends SpellAbilityAi {
PlayerCollection opps = players.filter(PlayerPredicates.isOpponentOf(ai));
for (Player oppA : opps) {
+ if (sa.isCurse() && ai.canDraw() && oppA.canLoseLife()) { // Risk Factor
+ if (numCards >= computerLibrarySize - 3) {
+ if (ai.isCardInPlay("Laboratory Maniac")) {
+ sa.getTargets().add(oppA);
+ return true;
+ }
+ } else if (computerHandSize + numCards <= computerMaxHandSize) {
+ sa.getTargets().add(oppA);
+ return true;
+ }
+ }
+
// try to kill opponent
- if (oppA.cantLose()) {
+ if (oppA.cantLose() || !oppA.canDraw()) {
continue;
}
@@ -376,7 +388,7 @@ public class DrawAi extends SpellAbilityAi {
boolean aiTarget = sa.canTarget(ai);
// checks what the ai prevent from casting it on itself
// if spell is not mandatory
- if (aiTarget && !ai.cantLose()) {
+ if (aiTarget && !ai.cantLose() && ai.canDraw()) {
if (numCards >= computerLibrarySize - 3) {
if (xPaid) {
numCards = computerLibrarySize - 1;
@@ -436,7 +448,7 @@ public class DrawAi extends SpellAbilityAi {
// try to benefit ally
for (Player ally : ai.getAllies()) {
// try to select ally to help
- if (!sa.canTarget(ally)) {
+ if (!sa.canTarget(ally) || !ally.canDraw()) {
continue;
}
@@ -489,9 +501,14 @@ public class DrawAi extends SpellAbilityAi {
return true;
}
} else if (!mandatory) {
+ // ability is not targeted
+
// TODO: consider if human is the defined player
- // ability is not targeted
+ if ((numCards == 0 || !ai.canDraw()) && !drawback) {
+ return false;
+ }
+
if (numCards >= computerLibrarySize - 3) {
if (ai.isCardInPlay("Laboratory Maniac")) {
return true;
@@ -500,10 +517,6 @@ public class DrawAi extends SpellAbilityAi {
return false;
}
- if (numCards == 0 && !drawback) {
- return false;
- }
-
if ((computerHandSize + numCards > computerMaxHandSize)
&& game.getPhaseHandler().isPlayerTurn(ai)
&& !sa.isTrigger()
@@ -526,7 +539,6 @@ public class DrawAi extends SpellAbilityAi {
return targetAI(ai, sa, mandatory);
}
-
/* (non-Javadoc)
* @see forge.card.ability.SpellAbilityAi#confirmAction(forge.game.player.Player, forge.card.spellability.SpellAbility, forge.game.player.PlayerActionConfirmMode, java.lang.String)
*/
diff --git a/forge-ai/src/main/java/forge/ai/ability/PumpAi.java b/forge-ai/src/main/java/forge/ai/ability/PumpAi.java
index 2e356e1ad39..f645043bc99 100644
--- a/forge-ai/src/main/java/forge/ai/ability/PumpAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/PumpAi.java
@@ -36,16 +36,7 @@ public class PumpAi extends PumpAiBase {
@Override
protected boolean checkAiLogic(final Player ai, final SpellAbility sa, final String aiLogic) {
- if ("FellTheMighty".equals(aiLogic)) {
- CardCollection aiList = ai.getCreaturesInPlay();
- if (aiList.isEmpty()) {
- return false;
- }
- CardLists.sortByPowerAsc(aiList);
- if (!sa.canTarget(aiList.get(0))) {
- return false;
- }
- } else if ("MoveCounter".equals(aiLogic)) {
+ if ("MoveCounter".equals(aiLogic)) {
final Game game = ai.getGame();
List tgtCards = CardLists.filter(game.getCardsIn(ZoneType.Battlefield),
CardPredicates.isTargetableBy(sa));
@@ -70,10 +61,6 @@ public class PumpAi extends PumpAiBase {
return SpecialAiLogic.doAristocratLogic(ai, sa);
} else if (aiLogic.startsWith("AristocratCounters")) {
return SpecialAiLogic.doAristocratWithCountersLogic(ai, sa);
- } else if ("RiskFactor".equals(aiLogic)) {
- if (ai.getCardsIn(ZoneType.Hand).size() + 3 >= ai.getMaxHandSize()) {
- return false;
- }
} else if (aiLogic.equals("SwitchPT")) {
// Some more AI would be even better, but this is a good start to prevent spamming
if (sa.isAbility() && sa.getActivationsThisTurn() > 0 && !sa.usesTargeting()) {
@@ -262,20 +249,6 @@ public class PumpAi extends PumpAiBase {
}
}
- } else if ("FellTheMighty".equals(aiLogic)) {
- CardCollection aiList = ai.getCreaturesInPlay();
- CardLists.sortByPowerAsc(aiList);
- Card lowest = aiList.get(0);
-
- CardCollection oppList = CardLists.filter(game.getCardsIn(ZoneType.Battlefield),
- CardPredicates.Presets.CREATURES, CardPredicates.isControlledByAnyOf(ai.getOpponents()));
-
- oppList = CardLists.filterPower(oppList, lowest.getNetPower() + 1);
- if (ComputerUtilCard.evaluateCreatureList(oppList) > 200) {
- sa.resetTargets();
- sa.getTargets().add(lowest);
- return true;
- }
} else if (aiLogic.startsWith("Donate")) {
// Donate step 1 - try to target an opponent, preferably one who does not have a donate target yet
return SpecialCardAi.Donate.considerTargetingOpponent(ai, sa);
@@ -391,9 +364,10 @@ public class PumpAi extends PumpAiBase {
if (ComputerUtilCard.shouldPumpCard(ai, sa, card, defense, attack, keywords, false)) {
return true;
} else if (containsUsefulKeyword(ai, keywords, card, sa, attack)) {
- Card pumped = ComputerUtilCard.getPumpedCreature(ai, sa, card, 0, 0, keywords);
- if (game.getPhaseHandler().is(PhaseType.COMBAT_DECLARE_ATTACKERS, ai)
- || game.getPhaseHandler().is(PhaseType.COMBAT_BEGIN, ai)) {
+ if (game.getPhaseHandler().isPreCombatMain() && SpellAbilityAi.isSorcerySpeed(sa) ||
+ game.getPhaseHandler().is(PhaseType.COMBAT_DECLARE_ATTACKERS, ai) ||
+ game.getPhaseHandler().is(PhaseType.COMBAT_BEGIN, ai)) {
+ Card pumped = ComputerUtilCard.getPumpedCreature(ai, sa, card, 0, 0, keywords);
return ComputerUtilCard.doesSpecifiedCreatureAttackAI(ai, pumped);
}
diff --git a/forge-ai/src/main/java/forge/ai/ability/RestartGameAi.java b/forge-ai/src/main/java/forge/ai/ability/RestartGameAi.java
index ac35bf1d0c2..78fcd5bacfd 100644
--- a/forge-ai/src/main/java/forge/ai/ability/RestartGameAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/RestartGameAi.java
@@ -1,16 +1,13 @@
package forge.ai.ability;
-import com.google.common.collect.Iterables;
-
import forge.ai.ComputerUtil;
import forge.ai.ComputerUtilCard;
import forge.ai.SpellAbilityAi;
-import forge.game.card.Card;
import forge.game.card.CardCollection;
import forge.game.card.CardLists;
-import forge.game.card.CardPredicates.Presets;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
+import forge.game.zone.ZoneType;
public class RestartGameAi extends SpellAbilityAi {
@@ -29,8 +26,7 @@ public class RestartGameAi extends SpellAbilityAi {
}
// check if enough good permanents will be available to be returned, so AI can "autowin"
- CardCollection exiled = new CardCollection(Iterables.filter(sa.getHostCard().getRemembered(), Card.class));
- exiled = CardLists.filter(exiled, Presets.PERMANENTS);
+ CardCollection exiled = CardLists.getValidCards(ai.getGame().getCardsIn(ZoneType.Exile), "Permanent.nonAura+IsRemembered", ai, sa.getHostCard(), sa);
if (ComputerUtilCard.evaluatePermanentList(exiled) > 20) {
return true;
}
diff --git a/forge-ai/src/main/java/forge/ai/ability/TokenAi.java b/forge-ai/src/main/java/forge/ai/ability/TokenAi.java
index 5451a516580..69ce9ce0117 100644
--- a/forge-ai/src/main/java/forge/ai/ability/TokenAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/TokenAi.java
@@ -314,7 +314,7 @@ public class TokenAi extends SpellAbilityAi {
*/
@Override
protected Player chooseSinglePlayer(Player ai, SpellAbility sa, Iterable options, Map params) {
- if (params.containsKey("Attacker")) {
+ if (params != null && params.containsKey("Attacker")) {
return (Player) ComputerUtilCombat.addAttackerToCombat(sa, (Card) params.get("Attacker"), new FCollection(options));
}
return Iterables.getFirst(options, null);
@@ -325,7 +325,7 @@ public class TokenAi extends SpellAbilityAi {
*/
@Override
protected GameEntity chooseSinglePlayerOrPlaneswalker(Player ai, SpellAbility sa, Iterable options, Map params) {
- if (params.containsKey("Attacker")) {
+ if (params != null && params.containsKey("Attacker")) {
return ComputerUtilCombat.addAttackerToCombat(sa, (Card) params.get("Attacker"), new FCollection(options));
}
// should not be reached
diff --git a/forge-core/pom.xml b/forge-core/pom.xml
index 9579cd77c3d..3bcbc0f01c6 100644
--- a/forge-core/pom.xml
+++ b/forge-core/pom.xml
@@ -6,7 +6,7 @@
forge
forge
- 1.6.46-SNAPSHOT
+ 1.6.47-SNAPSHOT
forge-core
diff --git a/forge-core/src/main/java/forge/deck/CardPool.java b/forge-core/src/main/java/forge/deck/CardPool.java
index cc05b8422db..05d7d6398d0 100644
--- a/forge-core/src/main/java/forge/deck/CardPool.java
+++ b/forge-core/src/main/java/forge/deck/CardPool.java
@@ -332,6 +332,10 @@ public class CardPool extends ItemPool {
sumWeights += editionsCount;
weightedMean += weightedFrequency;
}
+
+ if (frequencyValues.isEmpty())
+ return null;
+
int totalNoCards = (int)weightedMean;
weightedMean /= sumWeights;
diff --git a/forge-core/src/main/java/forge/deck/Deck.java b/forge-core/src/main/java/forge/deck/Deck.java
index c72c6ef732a..25f3f94723b 100644
--- a/forge-core/src/main/java/forge/deck/Deck.java
+++ b/forge-core/src/main/java/forge/deck/Deck.java
@@ -388,6 +388,8 @@ public class Deck extends DeckBase implements Iterable
forge
forge
- 1.6.46-SNAPSHOT
+ 1.6.47-SNAPSHOT
forge-game
diff --git a/forge-game/src/main/java/forge/game/GameActionUtil.java b/forge-game/src/main/java/forge/game/GameActionUtil.java
index 2d0ee677817..b3fecdba818 100644
--- a/forge-game/src/main/java/forge/game/GameActionUtil.java
+++ b/forge-game/src/main/java/forge/game/GameActionUtil.java
@@ -175,6 +175,10 @@ public final class GameActionUtil {
final String keyword = inst.getOriginal();
if (keyword.startsWith("Disturb")) {
+ if (!source.isInZone(ZoneType.Graveyard)) {
+ continue;
+ }
+
final String[] k = keyword.split(":");
final Cost disturbCost = new Cost(k[1], true);
@@ -203,6 +207,10 @@ public final class GameActionUtil {
alternatives.add(newSA);
} else if (keyword.startsWith("Escape")) {
+ if (!source.isInZone(ZoneType.Graveyard)) {
+ continue;
+ }
+
final String[] k = keyword.split(":");
final Cost escapeCost = new Cost(k[1], true);
@@ -224,6 +232,10 @@ public final class GameActionUtil {
alternatives.add(newSA);
} else if (keyword.startsWith("Flashback")) {
+ if (!source.isInZone(ZoneType.Graveyard)) {
+ continue;
+ }
+
// if source has No Mana cost, and flashback doesn't have own one,
// flashback can't work
if (keyword.equals("Flashback") && source.getManaCost().isNoCost()) {
diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java
index df32df55445..603c4cc99a0 100644
--- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java
+++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java
@@ -2365,6 +2365,20 @@ public class AbilityUtils {
return doXMath(getCardTypesFromList(oppCards), expr, c, ctb);
}
+ //Count$TypesSharedWith [defined]
+ if (sq[0].startsWith("TypesSharedWith")) {
+ Set thisTypes = Sets.newHashSet(c.getType().getCoreTypes());
+ Set matches = new HashSet<>();
+ for (Card c1 : AbilityUtils.getDefinedCards(ctb.getHostCard(), l[0].split(" ")[1], ctb)) {
+ for (CardType.CoreType type : Sets.newHashSet(c1.getType().getCoreTypes())) {
+ if (thisTypes.contains(type)) {
+ matches.add(type);
+ }
+ }
+ }
+ return matches.size();
+ }
+
// Count$TopOfLibraryCMC
if (sq[0].equals("TopOfLibraryCMC")) {
int cmc = player.getCardsIn(ZoneType.Library).isEmpty() ? 0 :
@@ -2431,6 +2445,19 @@ public class AbilityUtils {
return doXMath(list.size(), expr, c, ctb);
}
+ if (sq[0].contains("AbilityYouCtrl")) {
+ CardCollection all = CardLists.getValidCards(player.getCardsIn(ZoneType.Battlefield), "Creature", player,
+ c, ctb);
+ int count = 0;
+ for (String ab : sq[0].substring(15).split(",")) {
+ CardCollection found = CardLists.getValidCards(all, "Creature.with" + ab, player, c, ctb);
+ if (!found.isEmpty()) {
+ count++;
+ }
+ }
+ return doXMath(count, expr, c, ctb);
+ }
+
if (sq[0].contains("Party")) {
CardCollection adventurers = CardLists.getValidCards(player.getCardsIn(ZoneType.Battlefield),
"Creature.Cleric,Creature.Rogue,Creature.Warrior,Creature.Wizard", player, c, ctb);
@@ -2600,7 +2627,7 @@ public class AbilityUtils {
}
if (sq[0].contains("CardTypes")) {
- return doXMath(getCardTypesFromList(game.getCardsIn(ZoneType.smartValueOf(sq[1]))), expr, c, ctb);
+ return doXMath(getCardTypesFromList(getDefinedCards(c, sq[1], ctb)), expr, c, ctb);
}
if (sq[0].equals("TotalTurns")) {
@@ -3563,6 +3590,16 @@ public class AbilityUtils {
}
}
+ if (string.startsWith("GreatestPower")) {
+ int highest = 0;
+ for (final Card crd : paidList) {
+ if (crd.getNetPower() > highest) {
+ highest = crd.getNetPower();
+ }
+ }
+ return highest;
+ }
+
if (string.startsWith("DifferentCMC")) {
final Set diffCMC = new HashSet<>();
for (final Card card : paidList) {
diff --git a/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java b/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java
index 17d541ee3be..f0c98e4b62b 100644
--- a/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java
@@ -521,7 +521,7 @@ public abstract class SpellAbilityEffect {
String repeffstr = "Event$ Moved | ValidCard$ " + valid +
"| Origin$ Battlefield | Destination$ Graveyard " +
- "| Description$ If the creature would die this turn, exile it instead.";
+ "| Description$ If that permanent would die this turn, exile it instead.";
String effect = "DB$ ChangeZone | Defined$ ReplacedCard | Origin$ Battlefield | Destination$ " + zone;
ReplacementEffect re = ReplacementHandler.parseReplacement(repeffstr, eff, true);
diff --git a/forge-game/src/main/java/forge/game/ability/effects/AmassEffect.java b/forge-game/src/main/java/forge/game/ability/effects/AmassEffect.java
index a402327b376..12a2f44077f 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/AmassEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/AmassEffect.java
@@ -37,7 +37,7 @@ public class AmassEffect extends TokenEffectBase {
sb.append(Lang.nounWithNumeral(amount, "+1/+1 counter"));
- sb.append("on an Army you control. If you don’t control one, create a 0/0 black Zombie Army creature token first.)");
+ sb.append("on an Army you control. If you don't control one, create a 0/0 black Zombie Army creature token first.)");
return sb.toString();
}
diff --git a/forge-game/src/main/java/forge/game/ability/effects/BecomeMonarchEffect.java b/forge-game/src/main/java/forge/game/ability/effects/BecomeMonarchEffect.java
index 0b2612203c5..568aec08379 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/BecomeMonarchEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/BecomeMonarchEffect.java
@@ -31,7 +31,7 @@ public class BecomeMonarchEffect extends SpellAbilityEffect {
for (final Player p : getTargetPlayers(sa)) {
if ((tgt == null) || p.canBeTargetedBy(sa)) {
- if (!p.hasKeyword("You can’t become the monarch this turn.")) {
+ if (!p.hasKeyword("You can't become the monarch this turn.")) {
p.getGame().getAction().becomeMonarch(p, set);
}
}
diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneAllEffect.java
index f1e25eccc39..bac54df3eab 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneAllEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneAllEffect.java
@@ -137,9 +137,8 @@ public class ChangeZoneAllEffect extends SpellAbilityEffect {
final int libraryPos = sa.hasParam("LibraryPosition") ? Integer.parseInt(sa.getParam("LibraryPosition")) : 0;
- if (!random) {
- if ((destination == ZoneType.Library || destination == ZoneType.PlanarDeck)
- && !sa.hasParam("Shuffle") && cards.size() >= 2) {
+ if (!random && !((destination == ZoneType.Library || destination == ZoneType.PlanarDeck) && sa.hasParam("Shuffle"))) {
+ if ((destination == ZoneType.Library || destination == ZoneType.PlanarDeck) && cards.size() >= 2) {
Player p = AbilityUtils.getDefinedPlayers(source, sa.getParamOrDefault("DefinedPlayer", "You"), sa).get(0);
cards = (CardCollection) p.getController().orderMoveToZoneList(cards, destination, sa);
//the last card in this list will be the closest to the top, but we want the first card to be closest.
diff --git a/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java
index 951b31ebac7..4367fa38002 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java
@@ -60,11 +60,10 @@ public class CopyPermanentEffect extends TokenEffectBase {
final Game game = host.getGame();
if (sa.hasParam("Optional") && !activator.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblCopyPermanentConfirm"))) {
- return;
+ return;
}
- final int numCopies = sa.hasParam("NumCopies") ? AbilityUtils.calculateAmount(host,
- sa.getParam("NumCopies"), sa) : 1;
+ final int numCopies = sa.hasParam("NumCopies") ? AbilityUtils.calculateAmount(host, sa.getParam("NumCopies"), sa) : 1;
Player controller = null;
if (sa.hasParam("Controller")) {
diff --git a/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java
index fc01ff79c7f..905c0b0c31c 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java
@@ -121,6 +121,17 @@ public class DamageDealEffect extends DamageBaseEffect {
}
stringBuilder.append(".");
+ if (spellAbility.hasParam("ReplaceDyingDefined")) {
+ String statement = "If that creature would die this turn, exile it instead.";
+ String[] sentences = spellAbility.getParamOrDefault("SpellDescription", "").split("\\.");
+ for (String s : sentences) {
+ if (s.contains("would die")) {
+ statement = s;
+ break;
+ }
+ }
+ stringBuilder.append(statement);
+ }
return stringBuilder.toString();
}
@@ -255,6 +266,16 @@ public class DamageDealEffect extends DamageBaseEffect {
protected void internalDamageDeal(SpellAbility sa, Card sourceLKI, Card c, int dmg, CardDamageMap damageMap) {
final Card hostCard = sa.getHostCard();
final Player activationPlayer = sa.getActivatingPlayer();
+ int excess = 0;
+ int dmgToTarget = 0;
+ if (sa.hasParam("ExcessDamage") || (sa.hasParam("ExcessSVar"))) {
+ int lethal = c.getLethalDamage();
+ if (sourceLKI.hasKeyword(Keyword.DEATHTOUCH)) {
+ lethal = Math.min(lethal, 1);
+ }
+ dmgToTarget = Math.min(lethal, dmg);
+ excess = dmg - dmgToTarget;
+ }
if (sa.hasParam("Remove")) {
c.setDamage(0);
@@ -263,11 +284,6 @@ public class DamageDealEffect extends DamageBaseEffect {
} else {
if (sa.hasParam("ExcessDamage") && (!sa.hasParam("ExcessDamageCondition") ||
sourceLKI.isValid(sa.getParam("ExcessDamageCondition").split(","), activationPlayer, hostCard, sa))) {
- int lethal = c.getLethalDamage();
- if (sourceLKI.hasKeyword(Keyword.DEATHTOUCH)) {
- lethal = Math.min(lethal, 1);
- }
- int dmgToTarget = Math.min(lethal, dmg);
damageMap.put(sourceLKI, c, dmgToTarget);
@@ -276,10 +292,13 @@ public class DamageDealEffect extends DamageBaseEffect {
list.addAll(AbilityUtils.getDefinedPlayers(hostCard, sa.getParam("ExcessDamage"), sa));
if (!list.isEmpty()) {
- damageMap.put(sourceLKI, list.get(0), dmg - dmgToTarget);
+ damageMap.put(sourceLKI, list.get(0), excess);
}
} else {
damageMap.put(sourceLKI, c, dmg);
+ if (sa.hasParam("ExcessSVar")) {
+ hostCard.setSVar(sa.getParam("ExcessSVar"), Integer.toString(excess));
+ }
}
}
}
diff --git a/forge-game/src/main/java/forge/game/ability/effects/DrawEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DrawEffect.java
index 7e6d66e5bd4..5cfda2e1ff4 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/DrawEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/DrawEffect.java
@@ -8,7 +8,7 @@ import forge.game.card.Card;
import forge.game.card.CardCollectionView;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
-import forge.game.spellability.TargetRestrictions;
+import forge.game.staticability.StaticAbilityCantDraw;
import forge.util.Lang;
import forge.util.Localizer;
@@ -21,7 +21,7 @@ public class DrawEffect extends SpellAbilityEffect {
if (!tgtPlayers.isEmpty()) {
int numCards = sa.hasParam("NumCards") ? AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("NumCards"), sa) : 1;
-
+
sb.append(Lang.joinHomogenous(tgtPlayers));
if (tgtPlayers.size() > 1) {
@@ -40,19 +40,34 @@ public class DrawEffect extends SpellAbilityEffect {
final Card source = sa.getHostCard();
final int numCards = sa.hasParam("NumCards") ? AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("NumCards"), sa) : 1;
- final TargetRestrictions tgt = sa.getTargetRestrictions();
-
- final boolean optional = sa.hasParam("OptionalDecider");
final boolean upto = sa.hasParam("Upto");
+ final boolean optional = sa.hasParam("OptionalDecider") || upto;
for (final Player p : getDefinedPlayersOrTargeted(sa)) {
- if ((tgt == null) || p.canBeTargetedBy(sa))
- if (optional && !p.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantDrawCards", Lang.nounWithAmount(numCards, " card"))))
- continue;
+ // TODO can this be removed?
+ if (sa.usesTargeting() && !p.canBeTargetedBy(sa)) {
+ continue;
+ }
- int actualNum = numCards;
+ // it is optional, not upto and player can't choose to draw that many cards
+ if (optional && !upto && !p.canDrawAmount(numCards)) {
+ continue;
+ }
+
+ if (optional && !p.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantDrawCards", Lang.nounWithAmount(numCards, " card")))) {
+ continue;
+ }
+
+ int actualNum = numCards;
+
+ if (upto) { // if it is upto, player can only choose how many cards they can draw
+ actualNum = StaticAbilityCantDraw.canDrawAmount(p, actualNum);
+ }
+ if (actualNum <= 0) {
+ continue;
+ }
if (upto) {
- actualNum = p.getController().chooseNumber(sa, Localizer.getInstance().getMessage("lblHowManyCardDoYouWantDraw"), 0, numCards);
+ actualNum = p.getController().chooseNumber(sa, Localizer.getInstance().getMessage("lblHowManyCardDoYouWantDraw"), 0, actualNum);
}
final CardCollectionView drawn = p.drawCards(actualNum, sa);
@@ -68,6 +83,7 @@ public class DrawEffect extends SpellAbilityEffect {
source.addRemembered(c);
}
}
+ sa.setSVar("AFNotDrawnNum_" + p.getId(), "Number$" + drawn.size());
}
}
}
diff --git a/forge-game/src/main/java/forge/game/ability/effects/LifeGainEffect.java b/forge-game/src/main/java/forge/game/ability/effects/LifeGainEffect.java
index 16a78793898..0959c9beeed 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/LifeGainEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/LifeGainEffect.java
@@ -36,15 +36,25 @@ public class LifeGainEffect extends SpellAbilityEffect {
*/
@Override
public void resolve(SpellAbility sa) {
- final int lifeAmount = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("LifeAmount"), sa);
-
List tgtPlayers = getDefinedPlayersOrTargeted(sa);
if (tgtPlayers.isEmpty()) {
tgtPlayers.add(sa.getActivatingPlayer());
}
+ String amount = sa.getParam("LifeAmount");
+ boolean variableAmount = amount.equals("AFNotDrawnNum");
+ int lifeAmount = 0;
+ if (variableAmount) {
+ amount = "X";
+ } else {
+ lifeAmount = AbilityUtils.calculateAmount(sa.getHostCard(), amount, sa);
+ }
for (final Player p : tgtPlayers) {
if (!sa.usesTargeting() || p.canBeTargetedBy(sa)) {
+ if (variableAmount) {
+ sa.setSVar("AFNotDrawnNum", sa.getSVar("AFNotDrawnNum_" + p.getId()));
+ lifeAmount = AbilityUtils.calculateAmount(sa.getHostCard(), amount, sa);
+ }
p.gainLife(lifeAmount, sa.getHostCard(), sa);
}
}
diff --git a/forge-game/src/main/java/forge/game/ability/effects/SacrificeEffect.java b/forge-game/src/main/java/forge/game/ability/effects/SacrificeEffect.java
index da413a82838..e09f48a01b6 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/SacrificeEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/SacrificeEffect.java
@@ -100,15 +100,19 @@ public class SacrificeEffect extends SpellAbilityEffect {
final boolean destroy = sa.hasParam("Destroy");
final boolean remSacrificed = sa.hasParam("RememberSacrificed");
+ final boolean optional = sa.hasParam("Optional");
CardZoneTable table = new CardZoneTable();
Map params = AbilityKey.newMap();
params.put(AbilityKey.LastStateBattlefield, game.copyLastStateBattlefield());
if (valid.equals("Self") && game.getZoneOf(card) != null) {
if (game.getZoneOf(card).is(ZoneType.Battlefield)) {
- if (game.getAction().sacrifice(card, sa, table, params) != null) {
- if (remSacrificed) {
- card.addRemembered(card);
+ if (!optional || activator.getController().confirmAction(sa, null,
+ Localizer.getInstance().getMessage("lblDoYouWantSacrificeThis", card.getName()))) {
+ if (game.getAction().sacrifice(card, sa, table, params) != null) {
+ if (remSacrificed) {
+ card.addRemembered(card);
+ }
}
}
}
@@ -147,12 +151,11 @@ public class SacrificeEffect extends SpellAbilityEffect {
if (sa.hasParam("Random")) {
choosenToSacrifice = Aggregates.random(validTargets, Math.min(amount, validTargets.size()), new CardCollection());
- } else if (sa.hasParam("OptionalSacrifice") && !p.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantSacrifice"))) {
+ } else if (optional && !p.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantSacrifice"))) {
choosenToSacrifice = CardCollection.EMPTY;
} else {
- boolean isOptional = sa.hasParam("Optional");
boolean isStrict = sa.hasParam("StrictAmount");
- int minTargets = isOptional ? 0 : amount;
+ int minTargets = optional ? 0 : amount;
boolean notEnoughTargets = isStrict && validTargets.size() < minTargets;
if (!notEnoughTargets) {
diff --git a/forge-game/src/main/java/forge/game/ability/effects/TokenEffectBase.java b/forge-game/src/main/java/forge/game/ability/effects/TokenEffectBase.java
index 05fd768625b..0dcbcc93c41 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/TokenEffectBase.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/TokenEffectBase.java
@@ -39,7 +39,6 @@ import forge.game.zone.ZoneType;
public abstract class TokenEffectBase extends SpellAbilityEffect {
protected TokenCreateTable createTokenTable(Iterable players, String[] tokenScripts, final int finalAmount, final SpellAbility sa) {
-
TokenCreateTable tokenTable = new TokenCreateTable();
for (final Player owner : players) {
for (String script : tokenScripts) {
@@ -83,7 +82,6 @@ public abstract class TokenEffectBase extends SpellAbilityEffect {
// support PlayerCollection for affected
Set toRemove = Sets.newHashSet();
for (Player p : tokenTable.rowKeySet()) {
-
final Map repParams = AbilityKey.mapFromAffected(p);
repParams.put(AbilityKey.Token, tokenTable);
repParams.put(AbilityKey.EffectOnly, true); // currently only effects can create tokens?
diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java
index 2299c8ebd1a..be2815f6001 100644
--- a/forge-game/src/main/java/forge/game/card/Card.java
+++ b/forge-game/src/main/java/forge/game/card/Card.java
@@ -56,6 +56,7 @@ import forge.game.replacement.ReplacementType;
import forge.game.spellability.*;
import forge.game.staticability.StaticAbility;
import forge.game.staticability.StaticAbilityCantAttackBlock;
+import forge.game.staticability.StaticAbilityCantPutCounter;
import forge.game.staticability.StaticAbilityCantTransform;
import forge.game.trigger.Trigger;
import forge.game.trigger.TriggerType;
@@ -1364,13 +1365,8 @@ public class Card extends GameEntity implements Comparable, IHasSVars {
@Override
public final boolean canReceiveCounters(final CounterType type) {
- // CantPutCounter static abilities
- for (final Card ca : getGame().getCardsIn(ZoneType.STATIC_ABILITIES_SOURCE_ZONES)) {
- for (final StaticAbility stAb : ca.getStaticAbilities()) {
- if (stAb.applyAbility("CantPutCounter", this, type)) {
- return false;
- }
- }
+ if (StaticAbilityCantPutCounter.anyCantPutCounter(this, type)) {
+ return false;
}
return true;
}
@@ -1915,7 +1911,6 @@ public class Card extends GameEntity implements Comparable, IHasSVars {
sbLong.append(p[2]).append("\r\n");
} else if (keyword.equals("Unblockable")) {
sbLong.append(getName()).append(" can't be blocked.\r\n");
- sbLong.append(getName()).append(" has all names of nonlegendary creature cards.\r\n");
} else if (keyword.startsWith("IfReach")) {
String[] k = keyword.split(":");
sbLong.append(getName()).append(" can block ")
@@ -1986,17 +1981,9 @@ public class Card extends GameEntity implements Comparable, IHasSVars {
sbLong.append(k).append("\r\n");
} else if (keyword.startsWith("Ripple")) {
sbLong.append(TextUtil.fastReplace(keyword, ":", " ")).append("\r\n");
- } else if (keyword.startsWith("Madness")) {
- String[] parts = keyword.split(":");
- // If no colon exists in Madness keyword, it must have been granted and assumed the cost from host
- if (parts.length < 2) {
- sbLong.append(parts[0]).append(" ").append(this.getManaCost()).append("\r\n");
- } else {
- sbLong.append(parts[0]).append(" ").append(ManaCostParser.parse(parts[1])).append("\r\n");
- }
} else if (keyword.startsWith("Morph") || keyword.startsWith("Megamorph")
|| keyword.startsWith("Escape") || keyword.startsWith("Foretell:")
- || keyword.startsWith("Disturb")) {
+ || keyword.startsWith("Disturb") || keyword.startsWith("Madness:")){
String[] k = keyword.split(":");
sbLong.append(k[0]);
if (k.length > 1) {
@@ -2014,6 +2001,10 @@ public class Card extends GameEntity implements Comparable, IHasSVars {
sbLong.append(" (").append(inst.getReminderText()).append(")");
sbLong.append("\r\n");
}
+ } else if (keyword.startsWith("Madness")) {
+ // If no colon exists in Madness keyword, it must have been granted and assumed the cost from host
+ sbLong.append("Madness ").append(this.getManaCost()).append(" (").append(inst.getReminderText());
+ sbLong.append(")").append("\r\n");
} else if (keyword.startsWith("Emerge") || keyword.startsWith("Reflect")) {
final String[] k = keyword.split(":");
sbLong.append(k[0]).append(" ").append(ManaCostParser.parse(k[1]));
@@ -2079,7 +2070,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars {
sbLong.append(((Companion)inst).getDescription());
} else if (keyword.startsWith("Presence") || keyword.startsWith("MayFlash")) {
// Pseudo keywords, only print Reminder
- sbLong.append(inst.getReminderText());
+ sbLong.append(inst.getReminderText()).append("\r\n");
} else if (keyword.contains("At the beginning of your upkeep, ")
&& keyword.contains(" unless you pay")) {
sbLong.append(keyword).append("\r\n");
diff --git a/forge-game/src/main/java/forge/game/card/CardFactory.java b/forge-game/src/main/java/forge/game/card/CardFactory.java
index 1a772cc76cf..824e9c9bf01 100644
--- a/forge-game/src/main/java/forge/game/card/CardFactory.java
+++ b/forge-game/src/main/java/forge/game/card/CardFactory.java
@@ -134,9 +134,21 @@ public class CardFactory {
c.removeType(CardType.Supertype.Legendary);
}
+ if (sourceSA.hasParam("CopySetPower")) {
+ c.setBasePower(Integer.parseInt(sourceSA.getParam("CopySetPower")));
+ }
+
+ if (sourceSA.hasParam("CopySetToughness")) {
+ c.setBaseToughness(Integer.parseInt(sourceSA.getParam("CopySetToughness")));
+ }
+
+ if (sourceSA.hasParam("CopyAddTypes")) {
+ c.addType(Arrays.asList(sourceSA.getParam("CopyAddTypes").split(" & ")));
+ }
+
// change the color of the copy (eg: Fork)
if (sourceSA.hasParam("CopyIsColor")) {
- ColorSet finalColors = ColorSet.getNullColor();
+ ColorSet finalColors;
final String newColor = sourceSA.getParam("CopyIsColor");
if (newColor.equals("ChosenColor")) {
finalColors = ColorSet.fromNames(source.getChosenColors());
diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java
index 4b5225b6cc3..fffd9b688bc 100644
--- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java
+++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java
@@ -982,7 +982,7 @@ public class CardFactoryUtil {
inst.addTrigger(trigger);
} else if (keyword.equals("Daybound")) {
// Set Day when it's Neither
- final String setDayTrig = "Mode$ Always | TriggerZones$ Battlefield | Static$ True | DayTime$ Neither | Secondary$ True | TriggerDescription$ Any time a player controls a permanent with daybound, if it’s neither day nor night, it becomes day.";
+ final String setDayTrig = "Mode$ Always | TriggerZones$ Battlefield | Static$ True | DayTime$ Neither | Secondary$ True | TriggerDescription$ Any time a player controls a permanent with daybound, if it's neither day nor night, it becomes day.";
String setDayEff = "DB$ DayTime | Value$ Day";
Trigger trigger = TriggerHandler.parseTrigger(setDayTrig, card, intrinsic);
@@ -1343,7 +1343,7 @@ public class CardFactoryUtil {
triggers.add(gainControlTrigger);
// when the card with hideaway leaves the battlefield, forget all exiled cards
- final Trigger changeZoneTrigger = TriggerHandler.parseTrigger("Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Any | TriggerZone$ Battlefield | Static$ True", card, intrinsic);
+ final Trigger changeZoneTrigger = TriggerHandler.parseTrigger("Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Any | TriggerZones$ Battlefield | Static$ True", card, intrinsic);
String cleanupStr = "DB$ Cleanup | ClearRemembered$ True";
changeZoneTrigger.setOverridingAbility(AbilityFactory.getAbility(cleanupStr, card));
triggers.add(changeZoneTrigger);
@@ -1528,7 +1528,7 @@ public class CardFactoryUtil {
inst.addTrigger(parsedTrigger);
} else if (keyword.equals("Nightbound")) {
// Set Night when it's Neither
- final String setDayTrig = "Mode$ Always | TriggerZones$ Battlefield | Static$ True | DayTime$ Neither | IsPresent$ Card.Daybound | PresentCompare$ EQ0 | Secondary$ True | TriggerDescription$ Any time a player controls a permanent with nightbound, if it’s neither day nor night and there are no permanents with daybound on the battlefield, it becomes night.";
+ final String setDayTrig = "Mode$ Always | TriggerZones$ Battlefield | Static$ True | DayTime$ Neither | IsPresent$ Card.Daybound | PresentCompare$ EQ0 | Secondary$ True | TriggerDescription$ Any time a player controls a permanent with nightbound, if it's neither day nor night and there are no permanents with daybound on the battlefield, it becomes night.";
String setDayEff = "DB$ DayTime | Value$ Night";
Trigger trigger = TriggerHandler.parseTrigger(setDayTrig, card, intrinsic);
@@ -2875,7 +2875,7 @@ public class CardFactoryUtil {
Player activator = this.getActivatingPlayer();
final Game game = activator.getGame();
- if (!activator.hasKeyword("Foretell on any player’s turn") && !game.getPhaseHandler().isPlayerTurn(activator)) {
+ if (!activator.hasKeyword("Foretell on any player's turn") && !game.getPhaseHandler().isPlayerTurn(activator)) {
return false;
}
@@ -3480,7 +3480,7 @@ public class CardFactoryUtil {
} else if (keyword.startsWith("Dash")) {
effect = "Mode$ Continuous | Affected$ Card.Self+dashed | AddKeyword$ Haste";
} else if (keyword.equals("Daybound")) {
- effect = "Mode$ CantTransform | ValidCard$ Creature.Self | ExceptCause$ SpellAbility.Daybound | Secondary$ True | Description$ This permanent can’t be transformed except by its daybound ability.";
+ effect = "Mode$ CantTransform | ValidCard$ Creature.Self | ExceptCause$ SpellAbility.Daybound | Secondary$ True | Description$ This permanent can't be transformed except by its daybound ability.";
} else if (keyword.equals("Decayed")) {
effect = "Mode$ Continuous | Affected$ Card.Self | AddHiddenKeyword$ CARDNAME can't block. | " +
"Secondary$ True";
@@ -3534,7 +3534,7 @@ public class CardFactoryUtil {
effect = "Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.nonArtifact+notSharesColorWith | Secondary$ True " +
" | Description$ Intimidate ( " + inst.getReminderText() + ")";
} else if (keyword.equals("Nightbound")) {
- effect = "Mode$ CantTransform | ValidCard$ Creature.Self | ExceptCause$ SpellAbility.Nightbound | Secondary$ True | Description$ This permanent can’t be transformed except by its nightbound ability.";
+ effect = "Mode$ CantTransform | ValidCard$ Creature.Self | ExceptCause$ SpellAbility.Nightbound | Secondary$ True | Description$ This permanent can't be transformed except by its nightbound ability.";
} else if (keyword.startsWith("Protection")) {
String valid = getProtectionValid(keyword, false);
effect = "Mode$ CantBlockBy | ValidAttacker$ Creature.Self ";
diff --git a/forge-game/src/main/java/forge/game/card/CardProperty.java b/forge-game/src/main/java/forge/game/card/CardProperty.java
index 9158dbea0aa..9063f5291ad 100644
--- a/forge-game/src/main/java/forge/game/card/CardProperty.java
+++ b/forge-game/src/main/java/forge/game/card/CardProperty.java
@@ -20,6 +20,8 @@ import forge.game.mana.Mana;
import forge.game.player.Player;
import forge.game.spellability.OptionalCost;
import forge.game.spellability.SpellAbility;
+import forge.game.spellability.SpellAbilityPredicates;
+import forge.game.trigger.Trigger;
import forge.game.zone.Zone;
import forge.game.zone.ZoneType;
import forge.item.PaperCard;
@@ -380,6 +382,15 @@ public class CardProperty {
if (!card.equals(source.getEffectSource())) {
return false;
}
+ } else if (property.equals("withoutManaAbility")) {
+ if (Iterables.any(card.getSpellAbilities(), SpellAbilityPredicates.isManaAbility())) {
+ return false;
+ }
+ for (final Trigger trig : card.getTriggers()) {
+ if (trig.getOverridingAbility() != null && !trig.getOverridingAbility().isManaAbility()) {
+ return false;
+ }
+ }
} else if (property.equals("CanBeSacrificedBy") && spellAbility instanceof SpellAbility) {
if (!card.canBeSacrificedBy((SpellAbility) spellAbility)) {
return false;
diff --git a/forge-game/src/main/java/forge/game/card/CardView.java b/forge-game/src/main/java/forge/game/card/CardView.java
index 6c99ebf52ce..a23e834f198 100644
--- a/forge-game/src/main/java/forge/game/card/CardView.java
+++ b/forge-game/src/main/java/forge/game/card/CardView.java
@@ -1428,42 +1428,86 @@ public class CardView extends GameEntityView {
if (sa.getManaPart().isAnyMana()) {
anyMana = true;
}
- switch (sa.getManaPart().getOrigProduced()) {
- case "R":
- if (!rMana) {
- count += 1;
- rMana = true;
+ if (sa.getManaPart().isComboMana()) {
+ String[] colorsProduced = sa.getManaPart().getComboColors().split(" ");
+ //todo improve this
+ for (final String s : colorsProduced) {
+ switch (s.toUpperCase()) {
+ case "R":
+ if (!rMana) {
+ count += 1;
+ rMana = true;
+ }
+ break;
+ case "G":
+ if (!gMana) {
+ count += 1;
+ gMana = true;
+ }
+ break;
+ case "B":
+ if (!bMana) {
+ count += 1;
+ bMana = true;
+ }
+ break;
+ case "U":
+ if (!uMana) {
+ count += 1;
+ uMana = true;
+ }
+ break;
+ case "W":
+ if (!wMana) {
+ count += 1;
+ wMana = true;
+ }
+ break;
+ case "C":
+ if (!cMana) {
+ cMana = true;
+ }
+ break;
}
- break;
- case "G":
- if (!gMana) {
- count += 1;
- gMana = true;
- }
- break;
- case "B":
- if (!bMana) {
- count += 1;
- bMana = true;
- }
- break;
- case "U":
- if (!uMana) {
- count += 1;
- uMana = true;
- }
- break;
- case "W":
- if (!wMana) {
- count += 1;
- wMana = true;
- }
- break;
- case "C":
- if (!cMana) {
- cMana = true;
- }
- break;
+ }
+ } else {
+ switch (sa.getManaPart().getOrigProduced()) {
+ case "R":
+ if (!rMana) {
+ count += 1;
+ rMana = true;
+ }
+ break;
+ case "G":
+ if (!gMana) {
+ count += 1;
+ gMana = true;
+ }
+ break;
+ case "B":
+ if (!bMana) {
+ count += 1;
+ bMana = true;
+ }
+ break;
+ case "U":
+ if (!uMana) {
+ count += 1;
+ uMana = true;
+ }
+ break;
+ case "W":
+ if (!wMana) {
+ count += 1;
+ wMana = true;
+ }
+ break;
+ case "C":
+ if (!cMana) {
+ cMana = true;
+ }
+ break;
+ }
}
}
}
diff --git a/forge-game/src/main/java/forge/game/card/CounterEnumType.java b/forge-game/src/main/java/forge/game/card/CounterEnumType.java
index 7e5d787dbdd..a38b1b47f70 100644
--- a/forge-game/src/main/java/forge/game/card/CounterEnumType.java
+++ b/forge-game/src/main/java/forge/game/card/CounterEnumType.java
@@ -51,6 +51,8 @@ public enum CounterEnumType {
BLOOD("BLOOD", 255, 108, 111),
+ BLOODLINE("BLDLN", 224, 44, 44),
+
BOUNTY("BOUNT", 255, 158, 0),
BRIBERY("BRIBE", 172, 201, 235),
diff --git a/forge-game/src/main/java/forge/game/cost/CostDraw.java b/forge-game/src/main/java/forge/game/cost/CostDraw.java
index 4ec345316b1..02d5daf6925 100644
--- a/forge-game/src/main/java/forge/game/cost/CostDraw.java
+++ b/forge-game/src/main/java/forge/game/cost/CostDraw.java
@@ -17,11 +17,10 @@
*/
package forge.game.cost;
-import java.util.ArrayList;
-import java.util.List;
-
+import forge.game.ability.AbilityUtils;
import forge.game.card.Card;
import forge.game.player.Player;
+import forge.game.player.PlayerCollection;
import forge.game.spellability.SpellAbility;
/**
@@ -63,11 +62,17 @@ public class CostDraw extends CostPart {
* @param payer
* @param source
*/
- private List getPotentialPlayers(final Player payer, final Card source) {
- List res = new ArrayList<>();
+ public PlayerCollection getPotentialPlayers(final Player payer, final SpellAbility ability) {
+ PlayerCollection res = new PlayerCollection();
String type = this.getType();
+ final Card source = ability.getHostCard();
+ Integer c = convertAmount();
+ if (c == null) {
+ c = AbilityUtils.calculateAmount(source, getAmount(), ability);
+ }
+
for (Player p : payer.getGame().getPlayers()) {
- if (p.isValid(type, payer, source, null) && p.canDraw()) {
+ if (p.isValid(type, payer, source, ability) && p.canDrawAmount(c)) {
res.add(p);
}
}
@@ -83,8 +88,7 @@ public class CostDraw extends CostPart {
*/
@Override
public final boolean canPay(final SpellAbility ability, final Player payer) {
- List potentials = getPotentialPlayers(payer, ability.getHostCard());
- return !potentials.isEmpty();
+ return !getPotentialPlayers(payer, ability).isEmpty();
}
/*
@@ -95,7 +99,7 @@ public class CostDraw extends CostPart {
*/
@Override
public final boolean payAsDecided(final Player ai, final PaymentDecision decision, SpellAbility ability) {
- for (final Player p : getPotentialPlayers(ai, ability.getHostCard())) {
+ for (final Player p : decision.players) {
p.drawCards(decision.c, ability);
}
return true;
diff --git a/forge-game/src/main/java/forge/game/cost/CostExile.java b/forge-game/src/main/java/forge/game/cost/CostExile.java
index 9fef62597df..415a2567c6c 100644
--- a/forge-game/src/main/java/forge/game/cost/CostExile.java
+++ b/forge-game/src/main/java/forge/game/cost/CostExile.java
@@ -117,6 +117,11 @@ public class CostExile extends CostPartWithList {
return String.format ("Exile any number of %s from your %s", desc, origin);
}
+ //for very specific situations like Timothar
+ if (desc.startsWith("the")) {
+ return String.format("Exile %s from your %s", desc, origin);
+ }
+
return String.format("Exile %s from your %s", Cost.convertAmountTypeToWords(i, this.getAmount(), desc), origin);
}
@@ -159,7 +164,7 @@ public class CostExile extends CostPartWithList {
amount++;
}
- if ((amount != null) && (list.size() < amount)) {
+ if (amount != null && list.size() < amount) {
return false;
}
diff --git a/forge-game/src/main/java/forge/game/cost/CostPayLife.java b/forge-game/src/main/java/forge/game/cost/CostPayLife.java
index 581895ff2b9..7241e7ad61c 100644
--- a/forge-game/src/main/java/forge/game/cost/CostPayLife.java
+++ b/forge-game/src/main/java/forge/game/cost/CostPayLife.java
@@ -29,7 +29,6 @@ public class CostPayLife extends CostPart {
* Serializables need a version ID.
*/
private static final long serialVersionUID = 1L;
- int paidAmount = 0;
/**
* Instantiates a new cost pay life.
@@ -92,7 +91,7 @@ public class CostPayLife extends CostPart {
return false;
}
- if (payer.hasKeyword("You can't pay life to cast spells or activate abilities.")) {
+ if (!ability.isTrigger() && payer.hasKeyword("You can't pay life to cast spells or activate abilities.")) {
return false;
}
@@ -101,9 +100,7 @@ public class CostPayLife extends CostPart {
@Override
public boolean payAsDecided(Player ai, PaymentDecision decision, SpellAbility ability) {
- // TODO Auto-generated method stub
- paidAmount = decision.c;
- return ai.payLife(paidAmount, null);
+ return ai.payLife(decision.c, null);
}
public T accept(ICostVisitor visitor) {
diff --git a/forge-game/src/main/java/forge/game/cost/CostPayment.java b/forge-game/src/main/java/forge/game/cost/CostPayment.java
index 34737879f42..d822f07380a 100644
--- a/forge-game/src/main/java/forge/game/cost/CostPayment.java
+++ b/forge-game/src/main/java/forge/game/cost/CostPayment.java
@@ -141,7 +141,7 @@ public class CostPayment extends ManaConversionMatrix {
PaymentDecision pd = part.accept(decisionMaker);
- // RIght before we start paying as decided, we need to transfer the CostPayments matrix over?
+ // Right before we start paying as decided, we need to transfer the CostPayments matrix over?
if (part instanceof CostPartMana) {
((CostPartMana)part).setCardMatrix(this);
}
@@ -187,9 +187,10 @@ public class CostPayment extends ManaConversionMatrix {
for (final CostPart part : parts) {
PaymentDecision decision = part.accept(decisionMaker);
+ if (null == decision) return false;
+
// the AI will try to exile the same card repeatedly unless it does it immediately
final boolean payImmediately = part instanceof CostExile && ((CostExile) part).from == ZoneType.Library;
- if (null == decision) return false;
// wrap the payment and push onto the cost stack
game.costPaymentStack.push(part, this);
diff --git a/forge-game/src/main/java/forge/game/cost/CostReveal.java b/forge-game/src/main/java/forge/game/cost/CostReveal.java
index d6003290689..470cec17b42 100644
--- a/forge-game/src/main/java/forge/game/cost/CostReveal.java
+++ b/forge-game/src/main/java/forge/game/cost/CostReveal.java
@@ -72,7 +72,7 @@ public class CostReveal extends CostPartWithList {
modifiedHand.remove(source); // can't pay for itself
handList = modifiedHand;
}
- handList = CardLists.getValidCards(handList, getType().split(";"), payer, source, ability);
+ handList = CardLists.getValidCards(handList, getType().split(","), payer, source, ability);
return handList.size();
}
diff --git a/forge-game/src/main/java/forge/game/cost/PaymentDecision.java b/forge-game/src/main/java/forge/game/cost/PaymentDecision.java
index 155d1036a5a..d7af147ac3d 100644
--- a/forge-game/src/main/java/forge/game/cost/PaymentDecision.java
+++ b/forge-game/src/main/java/forge/game/cost/PaymentDecision.java
@@ -89,7 +89,6 @@ public class PaymentDecision {
}
public static PaymentDecision players(List players) {
- // TODO Auto-generated method stub
return new PaymentDecision(null, null, players, null, null);
}
diff --git a/forge-game/src/main/java/forge/game/keyword/Keyword.java b/forge-game/src/main/java/forge/game/keyword/Keyword.java
index 4881a60ac76..62131dfe0ba 100644
--- a/forge-game/src/main/java/forge/game/keyword/Keyword.java
+++ b/forge-game/src/main/java/forge/game/keyword/Keyword.java
@@ -95,7 +95,7 @@ public enum Keyword {
HIDEAWAY("Hideaway", SimpleKeyword.class, false, "This permanent enters the battlefield tapped. When it does, look at the top four cards of your library, exile one face down, then put the rest on the bottom of your library."),
HORSEMANSHIP("Horsemanship", SimpleKeyword.class, true, "This creature can't be blocked except by creatures with horsemanship."),
IMPROVISE("Improvise", SimpleKeyword.class, true, "Your artifacts can help cast this spell. Each artifact you tap after you're done activating mana abilities pays for {1}."),
- INDESTRUCTIBLE("Indestructible", SimpleKeyword.class, true, "Effects that say \"destroy\" don’t destroy this."),
+ INDESTRUCTIBLE("Indestructible", SimpleKeyword.class, true, "Effects that say \"destroy\" don't destroy this."),
INFECT("Infect", SimpleKeyword.class, true, "This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters."),
INGEST("Ingest", SimpleKeyword.class, false, "Whenever this creature deals combat damage to a player, that player exiles the top card of their library."),
INTIMIDATE("Intimidate", SimpleKeyword.class, true, "This creature can't be blocked except by artifact creatures and/or creatures that share a color with it."),
@@ -105,7 +105,7 @@ public enum Keyword {
LEVEL_UP("Level up", KeywordWithCost.class, false, "%s: Put a level counter on this. Level up only as a sorcery."),
LIFELINK("Lifelink", SimpleKeyword.class, true, "Damage dealt by this creature also causes its controller to gain that much life."),
LIVING_WEAPON("Living Weapon", SimpleKeyword.class, true, "When this Equipment enters the battlefield, create a 0/0 black Phyrexian Germ creature token, then attach this to it."),
- MADNESS("Madness", KeywordWithCost.class, false, "If you discard this card, discard it into exile. When you do, cast it for %s or put it into your graveyard."),
+ MADNESS("Madness", KeywordWithCost.class, false, "If you discard this card, discard it into exile. When you do, cast it for its madness cost or put it into your graveyard."),
MELEE("Melee", SimpleKeyword.class, false, "Whenever this creature attacks, it gets +1/+1 until end of turn for each opponent you attacked this combat."),
MENTOR("Mentor", SimpleKeyword.class, false, "Whenever this creature attacks, put a +1/+1 counter on target attacking creature with lesser power."),
MENACE("Menace", SimpleKeyword.class, true, "This creature can't be blocked except by two or more creatures."),
@@ -130,7 +130,7 @@ public enum Keyword {
PROTECTION("Protection", Protection.class, false, "This creature can't be blocked, targeted, dealt damage, or equipped/enchanted by %s."),
PROVOKE("Provoke", SimpleKeyword.class, false, "Whenever this creature attacks, you may have target creature defending player controls untap and block it if able."),
PROWESS("Prowess", SimpleKeyword.class, false, "Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn."),
- PROWL("Prowl", KeywordWithCost.class, false, "You may pay %s rather than pay this spell’s mana cost if a player was dealt combat damage this turn by a source that, at the time it dealt that damage, was under your control and had any of this spell’s creature types."),
+ PROWL("Prowl", KeywordWithCost.class, false, "You may pay %s rather than pay this spell's mana cost if a player was dealt combat damage this turn by a source that, at the time it dealt that damage, was under your control and had any of this spell's creature types."),
RAMPAGE("Rampage", KeywordWithAmount.class, false, "Whenever this creature becomes blocked, it gets +%1$d/+%1$d until end of turn for each creature blocking it beyond the first."),
REACH("Reach", SimpleKeyword.class, true, "This creature can block creatures with flying."),
REBOUND("Rebound", SimpleKeyword.class, true, "If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost."),
diff --git a/forge-game/src/main/java/forge/game/keyword/KeywordInstance.java b/forge-game/src/main/java/forge/game/keyword/KeywordInstance.java
index ddcf2423758..b3b20f2740d 100644
--- a/forge-game/src/main/java/forge/game/keyword/KeywordInstance.java
+++ b/forge-game/src/main/java/forge/game/keyword/KeywordInstance.java
@@ -73,7 +73,6 @@ public abstract class KeywordInstance> implements K
protected abstract void parse(String details);
protected abstract String formatReminderText(String reminderText);
-
/*
* (non-Javadoc)
* @see forge.game.keyword.KeywordInterface#createTraits(forge.game.card.Card, boolean)
diff --git a/forge-game/src/main/java/forge/game/keyword/Trample.java b/forge-game/src/main/java/forge/game/keyword/Trample.java
index d74920de663..1d8eb7a4564 100644
--- a/forge-game/src/main/java/forge/game/keyword/Trample.java
+++ b/forge-game/src/main/java/forge/game/keyword/Trample.java
@@ -15,7 +15,7 @@ public class Trample extends KeywordInstance {
@Override
protected String formatReminderText(String reminderText) {
if (!type.isEmpty()) {
- return "This creature can deal excess combat damage to the controller of the planeswalker it’s attacking.";
+ return "This creature can deal excess combat damage to the controller of the planeswalker it's attacking.";
}
return reminderText;
}
diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java
index c8123b1fde5..6ad07f3c382 100644
--- a/forge-game/src/main/java/forge/game/player/Player.java
+++ b/forge-game/src/main/java/forge/game/player/Player.java
@@ -104,6 +104,8 @@ import forge.game.replacement.ReplacementType;
import forge.game.spellability.SpellAbility;
import forge.game.staticability.StaticAbility;
import forge.game.staticability.StaticAbilityCantBeCast;
+import forge.game.staticability.StaticAbilityCantDraw;
+import forge.game.staticability.StaticAbilityCantPutCounter;
import forge.game.trigger.Trigger;
import forge.game.trigger.TriggerHandler;
import forge.game.trigger.TriggerType;
@@ -862,13 +864,8 @@ public class Player extends GameEntity implements Comparable {
}
public final boolean canReceiveCounters(final CounterType type) {
- // CantPutCounter static abilities
- for (final Card ca : getGame().getCardsIn(ZoneType.STATIC_ABILITIES_SOURCE_ZONES)) {
- for (final StaticAbility stAb : ca.getStaticAbilities()) {
- if (stAb.applyAbility("CantPutCounter", this, type)) {
- return false;
- }
- }
+ if (StaticAbilityCantPutCounter.anyCantPutCounter(this, type)) {
+ return false;
}
return true;
}
@@ -1284,13 +1281,11 @@ public class Player extends GameEntity implements Comparable {
}
public final boolean canDraw() {
- if (hasKeyword("You can't draw cards.")) {
- return false;
- }
- if (hasKeyword("You can't draw more than one card each turn.")) {
- return numDrawnThisTurn < 1;
- }
- return true;
+ return canDrawAmount(1);
+ }
+
+ public final boolean canDrawAmount(int amount) {
+ return StaticAbilityCantDraw.canDrawThisAmount(this, amount);
}
public final CardCollectionView drawCard() {
@@ -1302,6 +1297,9 @@ public class Player extends GameEntity implements Comparable {
}
public final CardCollectionView drawCards(final int n, SpellAbility cause) {
final CardCollection drawn = new CardCollection();
+ if (n <= 0) {
+ return drawn;
+ }
// Replacement effects
final Map repRunParams = AbilityKey.mapFromAffected(this);
@@ -3129,7 +3127,7 @@ public class Player extends GameEntity implements Comparable {
moved += " | Destination$ Graveyard,Exile,Hand,Library | Description$ If a commander would be exiled or put into hand, graveyard, or library from anywhere, that player may put it into the command zone instead.";
} else {
// rule 903.9b
- moved += " | Destination$ Hand,Library | Description$ If a commander would be put into its owner’s hand or library from anywhere, its owner may put it into the command zone instead.";
+ moved += " | Destination$ Hand,Library | Description$ If a commander would be put into its owner's hand or library from anywhere, its owner may put it into the command zone instead.";
}
eff.addReplacementEffect(ReplacementHandler.parseReplacement(moved, eff, true));
}
diff --git a/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java b/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java
index c0e1920b2ce..18af51b4658 100644
--- a/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java
+++ b/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java
@@ -564,17 +564,19 @@ public class AbilityManaPart implements java.io.Serializable {
return TextUtil.fastReplace(origProduced, "Combo ", "");
}
// ColorIdentity
- List commanders = getSourceCard().getController().getCommanders();
- if (commanders.isEmpty()) {
- return "";
- }
StringBuilder sb = new StringBuilder();
- ColorSet identity = getSourceCard().getController().getCommanderColorID();
- if (identity.hasWhite()) { sb.append("W "); }
- if (identity.hasBlue()) { sb.append("U "); }
- if (identity.hasBlack()) { sb.append("B "); }
- if (identity.hasRed()) { sb.append("R "); }
- if (identity.hasGreen()) { sb.append("G "); }
+ if (getSourceCard().getController() != null) {
+ List commanders = getSourceCard().getController().getCommanders();
+ if (commanders.isEmpty()) {
+ return "";
+ }
+ ColorSet identity = getSourceCard().getController().getCommanderColorID();
+ if (identity.hasWhite()) { sb.append("W "); }
+ if (identity.hasBlue()) { sb.append("U "); }
+ if (identity.hasBlack()) { sb.append("B "); }
+ if (identity.hasRed()) { sb.append("R "); }
+ if (identity.hasGreen()) { sb.append("G "); }
+ }
// TODO: Add support for {C}.
return sb.length() == 0 ? "" : sb.substring(0, sb.length() - 1);
}
diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbility.java b/forge-game/src/main/java/forge/game/staticability/StaticAbility.java
index 90645c5447e..778a5f27d49 100644
--- a/forge-game/src/main/java/forge/game/staticability/StaticAbility.java
+++ b/forge-game/src/main/java/forge/game/staticability/StaticAbility.java
@@ -37,7 +37,6 @@ import forge.game.card.CardCollection;
import forge.game.card.CardCollectionView;
import forge.game.card.CardLists;
import forge.game.card.CardState;
-import forge.game.card.CounterType;
import forge.game.cost.Cost;
import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType;
@@ -330,42 +329,6 @@ public class StaticAbility extends CardTraitBase implements IIdentifiable, Clone
return false;
}
- public final boolean applyAbility(String mode, Card card, CounterType type) {
- // don't apply the ability if it hasn't got the right mode
- if (!getParam("Mode").equals(mode)) {
- return false;
- }
-
- if (this.isSuppressed() || !this.checkConditions()) {
- return false;
- }
-
- if (mode.equals("CantPutCounter")) {
- return StaticAbilityCantPutCounter.applyCantPutCounter(this, card, type);
-
- }
-
- return false;
- }
-
- public final boolean applyAbility(String mode, Player player, CounterType type) {
- // don't apply the ability if it hasn't got the right mode
- if (!getParam("Mode").equals(mode)) {
- return false;
- }
-
- if (this.isSuppressed() || !this.checkConditions()) {
- return false;
- }
-
- if (mode.equals("CantPutCounter")) {
- return StaticAbilityCantPutCounter.applyCantPutCounter(this, player, type);
-
- }
-
- return false;
- }
-
public final boolean applyAbility(final String mode, final Card card, final boolean isCombat) {
// don't apply the ability if it hasn't got the right mode
if (!getParam("Mode").equals(mode)) {
diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantDraw.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantDraw.java
new file mode 100644
index 00000000000..90739fc91c1
--- /dev/null
+++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantDraw.java
@@ -0,0 +1,42 @@
+package forge.game.staticability;
+
+import forge.game.Game;
+import forge.game.card.Card;
+import forge.game.player.Player;
+import forge.game.zone.ZoneType;
+
+public class StaticAbilityCantDraw {
+
+ static String MODE = "CantDraw";
+
+ public static boolean canDrawThisAmount(final Player player, int startAmount) {
+ if (startAmount <= 0) {
+ return true;
+ }
+ return startAmount <= canDrawAmount(player, startAmount);
+ }
+ public static int canDrawAmount(final Player player, int startAmount) {
+ int amount = startAmount;
+ if (startAmount <= 0)
+ return 0;
+ final Game game = player.getGame();
+ for (final Card ca : game.getCardsIn(ZoneType.STATIC_ABILITIES_SOURCE_ZONES)) {
+ for (final StaticAbility stAb : ca.getStaticAbilities()) {
+ if (!stAb.getParam("Mode").equals(MODE) || stAb.isSuppressed() || !stAb.checkConditions()) {
+ continue;
+ }
+ amount = applyCantDrawAmountAbility(stAb, player, amount);
+ }
+ }
+ return amount;
+ }
+
+ public static int applyCantDrawAmountAbility(final StaticAbility stAb, final Player player, int amount) {
+ if (!stAb.matchesValidParam("ValidPlayer", player)) {
+ return amount;
+ }
+ int limit = Integer.valueOf(stAb.getParamOrDefault("DrawLimit", "0"));
+ int drawn = player.getNumDrawnThisTurn();
+ return Math.min(Math.max(limit - drawn, 0), amount);
+ }
+}
diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantPutCounter.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantPutCounter.java
index 4ace1da6a74..b6ed179c3fa 100644
--- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantPutCounter.java
+++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantPutCounter.java
@@ -1,11 +1,45 @@
package forge.game.staticability;
+import forge.game.Game;
import forge.game.card.Card;
import forge.game.card.CounterType;
import forge.game.player.Player;
+import forge.game.zone.ZoneType;
public class StaticAbilityCantPutCounter {
+ static String MODE = "CantPutCounter";
+
+ public static boolean anyCantPutCounter(final Card card, final CounterType type) {
+ final Game game = card.getGame();
+ for (final Card ca : game.getCardsIn(ZoneType.STATIC_ABILITIES_SOURCE_ZONES)) {
+ for (final StaticAbility stAb : ca.getStaticAbilities()) {
+ if (!stAb.getParam("Mode").equals(MODE) || stAb.isSuppressed() || !stAb.checkConditions()) {
+ continue;
+ }
+ if (applyCantPutCounter(stAb, card, type)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ public static boolean anyCantPutCounter(final Player player, final CounterType type) {
+ final Game game = player.getGame();
+ for (final Card ca : game.getCardsIn(ZoneType.STATIC_ABILITIES_SOURCE_ZONES)) {
+ for (final StaticAbility stAb : ca.getStaticAbilities()) {
+ if (!stAb.getParam("Mode").equals(MODE) || stAb.isSuppressed() || !stAb.checkConditions()) {
+ continue;
+ }
+ if (applyCantPutCounter(stAb, player, type)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
public static boolean applyCantPutCounter(final StaticAbility stAb, final Card card, final CounterType type) {
if (stAb.hasParam("CounterType")) {
CounterType t = CounterType.getType(stAb.getParam("CounterType"));
diff --git a/forge-game/src/main/java/forge/game/zone/PlayerZone.java b/forge-game/src/main/java/forge/game/zone/PlayerZone.java
index 808576e8fcc..160042f0bed 100644
--- a/forge-game/src/main/java/forge/game/zone/PlayerZone.java
+++ b/forge-game/src/main/java/forge/game/zone/PlayerZone.java
@@ -61,7 +61,8 @@ public class PlayerZone extends Zone {
}
boolean graveyardCastable = c.hasKeyword(Keyword.FLASHBACK) ||
- c.hasKeyword(Keyword.RETRACE) || c.hasKeyword(Keyword.JUMP_START) || c.hasKeyword(Keyword.ESCAPE);
+ c.hasKeyword(Keyword.RETRACE) || c.hasKeyword(Keyword.JUMP_START) || c.hasKeyword(Keyword.ESCAPE) ||
+ c.hasKeyword(Keyword.DISTURB);
boolean exileCastable = (c.isAdventureCard() || c.isForetold()) && c.isInZone(ZoneType.Exile);
for (final SpellAbility sa : c.getSpellAbilities()) {
final ZoneType restrictZone = sa.getRestrictions().getZone();
diff --git a/forge-gui-android/AndroidManifest.xml b/forge-gui-android/AndroidManifest.xml
index 7aad1daa5f4..ab56022d225 100644
--- a/forge-gui-android/AndroidManifest.xml
+++ b/forge-gui-android/AndroidManifest.xml
@@ -2,7 +2,7 @@
+ android:versionName="1.6.46" >
jar
-Xms1024m
-Xmx1536m
- 1.6.45.001
+ 1.6.46.001
keystore
alias
storepass
@@ -19,7 +19,7 @@
forge
forge
- 1.6.46-SNAPSHOT
+ 1.6.47-SNAPSHOT
forge-gui-android
diff --git a/forge-gui-desktop/pom.xml b/forge-gui-desktop/pom.xml
index 06153bc2924..3be1a7a5db8 100644
--- a/forge-gui-desktop/pom.xml
+++ b/forge-gui-desktop/pom.xml
@@ -4,7 +4,7 @@
forge
forge
- 1.6.46-SNAPSHOT
+ 1.6.47-SNAPSHOT
forge-gui-desktop
@@ -250,7 +250,7 @@
gui
- ${project.build.directory}/forge.exe
+ ${project.build.directory}/forge-java8.exe
${project.build.finalName}-jar-with-dependencies.jar
true
forge
@@ -284,7 +284,7 @@
Forge
forge
- forge.exe
+ forge-java8.exe
@@ -322,6 +322,7 @@
+
@@ -329,18 +330,21 @@
+
+
+
@@ -407,7 +411,7 @@
gui
- ${project.build.directory}/forge.exe
+ ${project.build.directory}/forge-java8.exe
${project.build.finalName}-jar-with-dependencies.jar
true
forge
@@ -424,6 +428,60 @@
-Dfile.encoding=UTF-8
+
+
+ ${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}.0
+
+
+ ${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}.0
+
+ Forge
+ Forge
+
+ ${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}.0
+
+
+ ${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}.0
+
+ Forge
+ forge
+ forge-java8.exe
+
+
+
+
+
+ l4j-gui2
+ package
+
+ launch4j
+
+
+ gui
+ ${project.build.directory}/forge.exe
+ ${project.build.finalName}-jar-with-dependencies.jar
+ true
+ forge
+ https://www.oracle.com/java/technologies/downloads/
+ src/main/config/forge.ico
+
+ forge.view.Main
+ false
+ anything
+
+
+ 11.0.1
+ jdkOnly
+ 4096
+
+ -Dfile.encoding=UTF-8
+ --add-opens java.base/java.lang=ALL-UNNAMED
+ --add-opens java.base/java.util=ALL-UNNAMED
+ --add-opens java.base/java.lang.reflect=ALL-UNNAMED
+ --add-opens java.base/java.text=ALL-UNNAMED
+ --add-opens java.desktop/java.awt.font=ALL-UNNAMED
+
+
${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}.0
@@ -445,6 +503,7 @@
+
@@ -482,11 +541,13 @@
+
-
-
+
+
+
@@ -495,18 +556,22 @@
+
+
+
+
diff --git a/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckViewer.java b/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckViewer.java
index 6dc0a73bfc3..ca5669ce836 100644
--- a/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckViewer.java
+++ b/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckViewer.java
@@ -172,10 +172,13 @@ public class FDeckViewer extends FDialog {
private void copyToClipboard() {
final String nl = System.getProperty("line.separator");
final StringBuilder deckList = new StringBuilder();
- final String dName = deck.getName();
+ String dName = deck.getName();
+ //fix copying a commander netdeck then importing it again...
+ if (dName.startsWith("[Commander")||dName.contains("Commander"))
+ dName = "";
String cardName;
SortedMap sectionCards;
- deckList.append(dName == null ? "" : dName + nl + nl);
+ deckList.append(dName == null ? "" : "Deck: "+dName + nl + nl);
for (DeckSection s : DeckSection.values()){
CardPool cp = deck.get(s);
diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CPrompt.java b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CPrompt.java
index 617371c5f8c..eeadd274626 100644
--- a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CPrompt.java
+++ b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CPrompt.java
@@ -32,7 +32,6 @@ import java.beans.PropertyChangeListener;
import javax.swing.JButton;
-import forge.control.FControl;
import forge.game.GameView;
import forge.game.card.CardView;
import forge.gui.FThreads;
@@ -43,7 +42,6 @@ import forge.model.FModel;
import forge.screens.match.CMatchUI;
import forge.screens.match.views.VPrompt;
import forge.toolbox.FSkin;
-import forge.util.Localizer;
/**
* Controls the prompt panel in the match UI.
@@ -157,9 +155,7 @@ public class CPrompt implements ICDoc {
matchUI.getGameController().selectButtonCancel();
}
- public void setMessage(final String s0) {
- String header = FControl.instance.getCurrentScreen().getDaytime() != null ? "[" + Localizer.getInstance().getMessage("lbl"+FControl.instance.getCurrentScreen().getDaytime()) + "]\n\n" : "";
- header += s0;
+ public void setMessage(final String header) {
view.getTarMessage().setText(FSkin.encodeSymbols(header, false));
view.setCardView(null);
}
diff --git a/forge-gui-desktop/src/test/java/forge/deck/DeckRecognizerTest.java b/forge-gui-desktop/src/test/java/forge/deck/DeckRecognizerTest.java
index 1fcb09dbc03..21c111fac5e 100644
--- a/forge-gui-desktop/src/test/java/forge/deck/DeckRecognizerTest.java
+++ b/forge-gui-desktop/src/test/java/forge/deck/DeckRecognizerTest.java
@@ -1681,7 +1681,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
StringUtils.split("Balustrade Spy;Bloodstained Mire;Felidar Guardian;Field of the Dead;Flooded Strand;Inverter of Truth;Kethis, the Hidden Hand;Leyline of Abundance;Nexus of Fate;Oko, Thief of Crowns;Once Upon a Time;Polluted Delta;Smuggler's Copter;Teferi, Time Raveler;Undercity Informer;Underworld Breach;Uro, Titan of Nature's Wrath;Veil of Summer;Walking Ballista;Wilderness Reclamation;Windswept Heath;Wooded Foothills",
';'));
List allowedPioneerSets = Arrays.asList(
- StringUtils.split("RTR,GTC,DGM,M14,THS,BNG,JOU,M15,KTK,FRF,DTK,ORI,BFZ,OGW,SOI,EMN,KLD,AER,AKH,HOU,XLN,RIX,DOM,M19,G18,GRN,RNA,WAR,M20,ELD,THB,IKO,M21,ZNR,KHM,STX,AFR,MID",
+ StringUtils.split("RTR,GTC,DGM,M14,THS,BNG,JOU,M15,KTK,FRF,DTK,ORI,BFZ,OGW,SOI,EMN,KLD,AER,AKH,HOU,XLN,RIX,DOM,M19,G18,GRN,RNA,WAR,M20,ELD,THB,IKO,M21,ZNR,KHM,STX,AFR,MID,VOW",
","));
List restrictedList = null;
@@ -1718,7 +1718,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
// SIMULATE A GAME OF VINTAGE
DeckRecognizer recognizer = new DeckRecognizer();
List allowedSetCodes = Arrays.asList(
- StringUtils.split("7ED, 9ED, ORI, M14, M15, 6ED, 8ED, M11, 3ED, M10, M12, 10E, M13, G18, M21, M20, M19, 5ED, 2ED, 4ED, LEB, LEA, 5DN, SOM, KTK, THS, DIS, JOU, MOR, TMP, SOI, FEM, USG, ALL, ROE, EXO, TSP, LRW, TOR, ALA, RIX, DGM, DKA, MBS, AER, RNA, GTC, CSP, HML, NPH, OGW, ZNR, EMN, UDS, SHM, BNG, SOK, EVE, INV, THB, DOM, NMS, VIS, WAR, GRN, PCY, SCG, MRD, XLN, ONS, IKO, MMQ, CHK, ULG, AKH, MIR, ISD, AVR, KLD, APC, RTR, WWK, PLC, HOU, LEG, AFR, ARN, ICE, STX, LGN, ARB, KHM, CFX, TSB, ZEN, ELD, JUD, GPT, BFZ, BOK, DTK, FRF, FUT, WTH, ODY, RAV, ATQ, DRK, PLS, STH, DST, TD2, HA1, ME4, HA3, HA2, HA5, HA4, MED, ANB, ME3, KLR, PZ2, ANA, PRM, PZ1, AJMP, ME2, TD1, TD0, TPR, VMA, AKR, MBP, PZEN, PGTW, PL21, PFUT, PWAR, PAL01, PJUD, PAL00, PTKDF, PWOR, PWP12, PSTH, POGW, PFRF, PG07, PSUS, PUST, J18, PWP10, PAL02, PAL03, PWP11, J19, PGRN, PM10, PDP14, PRTR, PMPS06, PBNG, PJ21, G09, PNPH, PM15, PAL06, G08, PDST, J20, PMBS, PMPS07, PEXO, PDOM, PONS, PRW2, PMPS11, PMPS, PM19, PWWK, PCEL, PAL04, PAL05, PMPS10, PDTK, PALP, F10, F04, PMOR, PAL99, PEMN, PCNS, PPLC, PRAV, PPP1, PI14, PXLN, PF20, PTSP, F05, F11, PSCG, PBOOK, F07, F13, PODY, PM12, P08, PSS1, P2HG, P09, PTOR, PDP13, F12, F06, PALA, PXTC, F02, F16, PHOU, PSOM, PI13, PCON, PDGM, PIDW, PMRD, PRNA, P9ED, PHEL, F17, F03, PURL, F15, F01, PWOS, PPC1, PBOK, PTMP, PS19, PS18, PF19, PGPT, PCHK, FNM, F14, PISD, PAKH, PDP15, PRIX, PS15, PPCY, OLGC, OVNT, PLGN, PS14, P03, PDTP, PM14, FS, PPLS, MPR, PKTK, PS16, PRWK, PS17, PBFZ, PSS2, PINV, G03, P8ED, PARL, P04, P10, PSDC, JGP, G99, WW, P11, P05, PDIS, PROE, PDP10, F08, P10E, PELP, PMH1, P07, P5DN, PGRU, SHC, PM11, P06, PUSG, PCMP, PULG, F09, PUDS, PARB, DRC94, PMPS09, PORI, J12, G06, PMMQ, G07, J13, PMPS08, PM20, PSOI, PJSE, G05, G11, PNAT, PSOK, PEVE, PRED, G10, G04, PSHM, PPRO, PAPC, PJJT, ARENA, PKLD, G00, J14, PLGM, P15A, PCSP, PWPN, PJAS, PWP21, PWP09, PDKA, PNEM, PPTK, J15, G01, PG08, PLRW, PMEI, PM13, PHJ, PGTC, J17, PRES, PWCQ, PJOU, PDP12, PAER, PAVR, PTHS, G02, J16, PSUM, PGPX, UGF, PSS3, MM2, MM3, MB1, FMB1, A25, 2XM, MMA, PLIST, CHR, EMA, IMA, TSR, UMA, PUMA, E02, DPA, ATH, MD1, GK1, GK2, CST, BRB, BTD, DKM, FVE, V17, V13, STA, MPS_RNA, V16, SLD, V12, CC1, MPS_GRN, DRB, FVR, SS3, SS1, MPS_AKH, FVL, V15, MPS_KLD, ZNE, PDS, SS2, PD3, SLU, V14, PD2, EXP, MPS_WAR, DDQ, DDE, GS1, DDS, DDU, DD1, DDL, DDF, DDP, DD2, DDR, DDH, DDT, DDK, DDG, DDC, DDM, DDJ, DDO, GVL, JVC, DDI, DVD, DDN, EVG, DDD, C18, C19, C21, C20, C13, CMA, C14, C15, KHC, ZNC, AFC, C17, C16, COM, CM1,CM2,PO2,S99,W16,W17,S00,PTK,CP3,POR,CP1,CP2,CMR,MH2,H1R,CNS,BBD,MH1,CN2,JMP,PCA,GNT,ARC,GN2,PC2,E01,HOP,PLG20,PLG21,CC2,MID,MIC",
+ StringUtils.split("7ED, 9ED, ORI, M14, M15, 6ED, 8ED, M11, 3ED, M10, M12, 10E, M13, G18, M21, M20, M19, 5ED, 2ED, 4ED, LEB, LEA, 5DN, SOM, KTK, THS, DIS, JOU, MOR, TMP, SOI, FEM, USG, ALL, ROE, EXO, TSP, LRW, TOR, ALA, RIX, DGM, DKA, MBS, AER, RNA, GTC, CSP, HML, NPH, OGW, ZNR, EMN, UDS, SHM, BNG, SOK, EVE, INV, THB, DOM, NMS, VIS, WAR, GRN, PCY, SCG, MRD, XLN, ONS, IKO, MMQ, CHK, ULG, AKH, MIR, ISD, AVR, KLD, APC, RTR, WWK, PLC, HOU, LEG, AFR, ARN, ICE, STX, LGN, ARB, KHM, CFX, TSB, ZEN, ELD, JUD, GPT, BFZ, BOK, DTK, FRF, FUT, WTH, ODY, RAV, ATQ, DRK, PLS, STH, DST, TD2, HA1, ME4, HA3, HA2, HA5, HA4, MED, ANB, ME3, KLR, PZ2, ANA, PRM, PZ1, AJMP, ME2, TD1, TD0, TPR, VMA, AKR, MBP, PZEN, PGTW, PL21, PFUT, PWAR, PAL01, PJUD, PAL00, PTKDF, PWOR, PWP12, PSTH, POGW, PFRF, PG07, PSUS, PUST, J18, PWP10, PAL02, PAL03, PWP11, J19, PGRN, PM10, PDP14, PRTR, PMPS06, PBNG, PJ21, G09, PNPH, PM15, PAL06, G08, PDST, J20, PMBS, PMPS07, PEXO, PDOM, PONS, PRW2, PMPS11, PMPS, PM19, PWWK, PCEL, PAL04, PAL05, PMPS10, PDTK, PALP, F10, F04, PMOR, PAL99, PEMN, PCNS, PPLC, PRAV, PPP1, PI14, PXLN, PF20, PTSP, F05, F11, PSCG, PBOOK, F07, F13, PODY, PM12, P08, PSS1, P2HG, P09, PTOR, PDP13, F12, F06, PALA, PXTC, F02, F16, PHOU, PSOM, PI13, PCON, PDGM, PIDW, PMRD, PRNA, P9ED, PHEL, F17, F03, PURL, F15, F01, PWOS, PPC1, PBOK, PTMP, PS19, PS18, PF19, PGPT, PCHK, FNM, F14, PISD, PAKH, PDP15, PRIX, PS15, PPCY, OLGC, OVNT, PLGN, PS14, P03, PDTP, PM14, FS, PPLS, MPR, PKTK, PS16, PRWK, PS17, PBFZ, PSS2, PINV, G03, P8ED, PARL, P04, P10, PSDC, JGP, G99, WW, P11, P05, PDIS, PROE, PDP10, F08, P10E, PELP, PMH1, P07, P5DN, PGRU, SHC, PM11, P06, PUSG, PCMP, PULG, F09, PUDS, PARB, DRC94, PMPS09, PORI, J12, G06, PMMQ, G07, J13, PMPS08, PM20, PSOI, PJSE, G05, G11, PNAT, PSOK, PEVE, PRED, G10, G04, PSHM, PPRO, PAPC, PJJT, ARENA, PKLD, G00, J14, PLGM, P15A, PCSP, PWPN, PJAS, PWP21, PWP09, PDKA, PNEM, PPTK, J15, G01, PG08, PLRW, PMEI, PM13, PHJ, PGTC, J17, PRES, PWCQ, PJOU, PDP12, PAER, PAVR, PTHS, G02, J16, PSUM, PGPX, UGF, PSS3, MM2, MM3, MB1, FMB1, A25, 2XM, MMA, PLIST, CHR, EMA, IMA, TSR, UMA, PUMA, E02, DPA, ATH, MD1, GK1, GK2, CST, BRB, BTD, DKM, FVE, V17, V13, STA, MPS_RNA, V16, SLD, V12, CC1, MPS_GRN, DRB, FVR, SS3, SS1, MPS_AKH, FVL, V15, MPS_KLD, ZNE, PDS, SS2, PD3, SLU, V14, PD2, EXP, MPS_WAR, DDQ, DDE, GS1, DDS, DDU, DD1, DDL, DDF, DDP, DD2, DDR, DDH, DDT, DDK, DDG, DDC, DDM, DDJ, DDO, GVL, JVC, DDI, DVD, DDN, EVG, DDD, C18, C19, C21, C20, C13, CMA, C14, C15, KHC, ZNC, AFC, C17, C16, COM, CM1,CM2,PO2,S99,W16,W17,S00,PTK,CP3,POR,CP1,CP2,CMR,MH2,H1R,CNS,BBD,MH1,CN2,JMP,PCA,GNT,ARC,GN2,PC2,E01,HOP,PLG20,PLG21,CC2,MID,MIC,VOW,VOC",
","));
allowedSetCodes = allowedSetCodes.stream().map(String::trim).collect(Collectors.toList());
List bannedCards = Arrays.asList(
diff --git a/forge-gui-ios/pom.xml b/forge-gui-ios/pom.xml
index d1c37a1231d..989494abe58 100644
--- a/forge-gui-ios/pom.xml
+++ b/forge-gui-ios/pom.xml
@@ -6,13 +6,13 @@
jar
-Xms128m
-Xmx2048m
- 1.6.45.001
+ 1.6.46.001
forge
forge
- 1.6.46-SNAPSHOT
+ 1.6.47-SNAPSHOT
forge-gui-ios
diff --git a/forge-gui-mobile-dev/pom.xml b/forge-gui-mobile-dev/pom.xml
index 13f022a149f..32829c20b87 100644
--- a/forge-gui-mobile-dev/pom.xml
+++ b/forge-gui-mobile-dev/pom.xml
@@ -4,7 +4,7 @@
forge
forge
- 1.6.46-SNAPSHOT
+ 1.6.47-SNAPSHOT
forge-gui-mobile-dev
diff --git a/forge-gui-mobile/pom.xml b/forge-gui-mobile/pom.xml
index d9325ab2a5e..a4be868355e 100644
--- a/forge-gui-mobile/pom.xml
+++ b/forge-gui-mobile/pom.xml
@@ -4,7 +4,7 @@
forge
forge
- 1.6.46-SNAPSHOT
+ 1.6.47-SNAPSHOT
forge-gui-mobile
diff --git a/forge-gui-mobile/src/forge/Forge.java b/forge-gui-mobile/src/forge/Forge.java
index 714c6154089..f6fe1a41e33 100644
--- a/forge-gui-mobile/src/forge/Forge.java
+++ b/forge-gui-mobile/src/forge/Forge.java
@@ -37,7 +37,7 @@ import java.util.Deque;
import java.util.List;
public class Forge implements ApplicationListener {
- public static final String CURRENT_VERSION = "1.6.45.001";
+ public static final String CURRENT_VERSION = "1.6.46.001";
private static ApplicationListener app = null;
private static Clipboard clipboard;
diff --git a/forge-gui-mobile/src/forge/deck/FDeckViewer.java b/forge-gui-mobile/src/forge/deck/FDeckViewer.java
index 8bffdb7d854..8f98280c656 100644
--- a/forge-gui-mobile/src/forge/deck/FDeckViewer.java
+++ b/forge-gui-mobile/src/forge/deck/FDeckViewer.java
@@ -90,7 +90,7 @@ public class FDeckViewer extends FScreen {
//fix copying a commander netdeck then importing it again...
if (dName.startsWith("[Commander")||dName.contains("Commander"))
dName = "";
- deckList.append(dName == null ? "" : dName + nl + nl);
+ deckList.append(dName == null ? "" : "Deck: "+dName + nl + nl);
for (DeckSection s : DeckSection.values()){
CardPool cp = deck.get(s);
diff --git a/forge-gui-mobile/src/forge/itemmanager/ItemManager.java b/forge-gui-mobile/src/forge/itemmanager/ItemManager.java
index 6a059d9581d..f6c549fb40e 100644
--- a/forge-gui-mobile/src/forge/itemmanager/ItemManager.java
+++ b/forge-gui-mobile/src/forge/itemmanager/ItemManager.java
@@ -528,13 +528,17 @@ public abstract class ItemManager extends FContainer im
if (pool == null) {
return;
}
- pool.add(item, qty);
- if (isUnfiltered()) {
- model.addItem(item, qty);
+ try {
+ pool.add(item, qty);
+ if (isUnfiltered()) {
+ model.addItem(item, qty);
+ }
+ List items = new ArrayList<>();
+ items.add(item);
+ updateView(false, items);
+ } catch (Exception e) {
+ e.printStackTrace();
}
- List items = new ArrayList<>();
- items.add(item);
- updateView(false, items);
}
public void addItems(Iterable> itemsToAdd) {
diff --git a/forge-gui/pom.xml b/forge-gui/pom.xml
index 8c4a6c2d6e7..deb52c3bc03 100644
--- a/forge-gui/pom.xml
+++ b/forge-gui/pom.xml
@@ -4,7 +4,7 @@
forge
forge
- 1.6.46-SNAPSHOT
+ 1.6.47-SNAPSHOT
forge-gui
diff --git a/forge-gui/release-files/ANNOUNCEMENTS.txt b/forge-gui/release-files/ANNOUNCEMENTS.txt
index 852f6232dd2..a30b36f084a 100644
--- a/forge-gui/release-files/ANNOUNCEMENTS.txt
+++ b/forge-gui/release-files/ANNOUNCEMENTS.txt
@@ -1,5 +1,6 @@
#Add one announcement per line
Get in the discord if you aren't yet. https://discord.gg/3v9JCVr
+A new game mode is now available as a separate executable - Forge Adventure, a Shandalar-like overworld adventure. This game mode is currently in its early stage of development, expect improvements and fixes in the future releases.
Forge now supports 100% of core and expansion set cards from Limited Edition Alpha to Innistrad: Midnight Hunt. This includes Equinox, Chaos Orb, and Falling Star.
Planar Conquest now features a new plane - Forgotten Realms, based on the AFR and AFC sets.
Several planes are now available in Planar Conquest in their Classic form, as originally intended by the author, without support for the newer sets and with the original events not modified with newer cards. These planes are available in addition to the contemporary versions of the planes and are marked as "Classic".
diff --git a/forge-gui/release-files/CONTRIBUTORS.txt b/forge-gui/release-files/CONTRIBUTORS.txt
index 6267fb2e4e8..052b0783e1f 100644
--- a/forge-gui/release-files/CONTRIBUTORS.txt
+++ b/forge-gui/release-files/CONTRIBUTORS.txt
@@ -22,7 +22,7 @@ leriomaggio
Luke
Marek14
Marvel
-mcrawford620
+mcrawford
medusa
Meerkov
Monkey Gland Sauce
diff --git a/forge-gui/res/blockdata/blocks.txt b/forge-gui/res/blockdata/blocks.txt
index 0732ee6fb51..5800a9c7202 100644
--- a/forge-gui/res/blockdata/blocks.txt
+++ b/forge-gui/res/blockdata/blocks.txt
@@ -99,3 +99,4 @@ Strixhaven: School of Mages, 3/6/STX, STX
Modern Horizons 2, 3/6/MH2, MH2
Adventures in the Forgotten Realms, 3/6/AFR, AFR
Innistrad: Midnight Hunt, 3/6/MID, MID
+Innistrad: Crimson Vow, 3/6/VOW, VOW
diff --git a/forge-gui/res/cardsfolder/a/akoum_flameseeker.txt b/forge-gui/res/cardsfolder/a/akoum_flameseeker.txt
index 312bf1b3b54..63e09393c08 100644
--- a/forge-gui/res/cardsfolder/a/akoum_flameseeker.txt
+++ b/forge-gui/res/cardsfolder/a/akoum_flameseeker.txt
@@ -2,9 +2,7 @@ Name:Akoum Flameseeker
ManaCost:2 R
Types:Creature Human Shaman Ally
PT:3/2
-A:AB$ Discard | Cost$ T tapXType<1/Ally> | Defined$ You | NumCards$ 1 | Mode$ TgtChoose | RememberDiscarded$ True | SubAbility$ DBDraw | PrecostDesc$ Cohort — | SpellDescription$ Discard a card. If you do, draw a card.
-SVar:DBDraw:DB$ Draw | NumCards$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup
-SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
+A:AB$ Draw | Cost$ T tapXType<1/Ally> | NumCards$ 1 | UnlessCost$ Discard<1/Card> | UnlessSwitched$ True | UnlessPayer$ You | PrecostDesc$ Cohort — | SpellDescription$ Discard a card. If you do, draw a card.
AI:RemoveDeck:All
DeckHints:Type$Ally
SVar:Picture:http://www.wizards.com/global/images/magic/general/akoum_flameseeker.jpg
diff --git a/forge-gui/res/cardsfolder/a/altar_of_the_goyf.txt b/forge-gui/res/cardsfolder/a/altar_of_the_goyf.txt
index e5f2ba527b6..c6fa9a06f94 100644
--- a/forge-gui/res/cardsfolder/a/altar_of_the_goyf.txt
+++ b/forge-gui/res/cardsfolder/a/altar_of_the_goyf.txt
@@ -4,6 +4,6 @@ Types:Tribal Artifact Lhurgoyf
T:Mode$ Attacks | ValidCard$ Creature.YouCtrl | Alone$ True | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever a creature you control attacks alone, it gets +X/+X until end of turn, where X is the number of card types among cards in all graveyards.
SVar:TrigPump:DB$ Pump | Defined$ TriggeredAttacker | NumAtt$ +X | NumDef$ +X
S:Mode$ Continuous | Affected$ Creature.Lhurgoyf+YouCtrl | AddKeyword$ Trample | Description$ Lhurgoyf creatures you control have trample.
-SVar:X:Count$CardTypes.Graveyard
+SVar:X:Count$CardTypes.ValidGraveyard Card
SVar:PlayMain1:TRUE
Oracle:Whenever a creature you control attacks alone, it gets +X/+X until end of turn, where X is the number of card types among cards in all graveyards.\nLhurgoyf creatures you control have trample.
diff --git a/forge-gui/res/cardsfolder/a/annihilating_fire.txt b/forge-gui/res/cardsfolder/a/annihilating_fire.txt
index be7fba89a5a..13e3a60a5db 100644
--- a/forge-gui/res/cardsfolder/a/annihilating_fire.txt
+++ b/forge-gui/res/cardsfolder/a/annihilating_fire.txt
@@ -1,7 +1,6 @@
Name:Annihilating Fire
ManaCost:1 R R
Types:Instant
-A:SP$ DealDamage | Cost$ 1 R R | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 3 | RememberDamaged$ True | ReplaceDyingDefined$ Remembered | SubAbility$ DBCleanup | SpellDescription$ CARDNAME deals 3 damage to any target. If a creature dealt damage this way would die this turn, exile it instead.
+A:SP$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 3 | RememberDamaged$ True | ReplaceDyingDefined$ Remembered.Creature | SubAbility$ DBCleanup | SpellDescription$ CARDNAME deals 3 damage to any target. If a creature dealt damage this way would die this turn, exile it instead.
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
-SVar:Picture:http://www.wizards.com/global/images/magic/general/annihilating_fire.jpg
Oracle:Annihilating Fire deals 3 damage to any target. If a creature dealt damage this way would die this turn, exile it instead.
diff --git a/forge-gui/res/cardsfolder/a/arcane_denial.txt b/forge-gui/res/cardsfolder/a/arcane_denial.txt
index 6a6792fe13c..e6b21379c62 100644
--- a/forge-gui/res/cardsfolder/a/arcane_denial.txt
+++ b/forge-gui/res/cardsfolder/a/arcane_denial.txt
@@ -5,7 +5,7 @@ A:SP$ Counter | Cost$ 1 U | TargetType$ Spell | TgtPrompt$ Select target spell |
SVar:DelTrigSlowtrip:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ DrawSlowtrip | SubAbility$ DelTrigDrawTwo | TriggerDescription$ Draw a card.
SVar:DrawSlowtrip:DB$ Draw | NumCards$ 1 | Defined$ You
SVar:DelTrigDrawTwo:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | RememberObjects$ RememberedController | Execute$ DrawTwo | TriggerDescription$ Draw up to two cards. | SubAbility$ DBCleanup
-SVar:DrawTwo:DB$ Draw | NumCards$ 2 | Defined$ DelayTriggerRemembered | Upto$ True
+SVar:DrawTwo:DB$ Draw | NumCards$ 2 | Defined$ DelayTriggerRemembered | Upto$ True | AILogic$ OptionalDraw
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:Picture:http://www.wizards.com/global/images/magic/general/arcane_denial.jpg
Oracle:Counter target spell. Its controller may draw up to two cards at the beginning of the next turn's upkeep.\nYou draw a card at the beginning of the next turn's upkeep.
diff --git a/forge-gui/res/cardsfolder/a/arcane_endeavor.txt b/forge-gui/res/cardsfolder/a/arcane_endeavor.txt
index ad0ac8e8d39..3d023cf62a8 100644
--- a/forge-gui/res/cardsfolder/a/arcane_endeavor.txt
+++ b/forge-gui/res/cardsfolder/a/arcane_endeavor.txt
@@ -3,5 +3,5 @@ ManaCost:5 U U
Types:Sorcery
A:SP$ RollDice | Amount$ 2 | Sides$ 8 | ChosenSVar$ X | OtherSVar$ Y | SubAbility$ DBDraw | StackDescription$ SpellDescription | SpellDescription$ Roll two d8 and choose one result. Draw cards equal to that result. Then you may cast an instant or sorcery spell with mana value less than or equal to the other result from your hand without paying its mana cost.
SVar:DBDraw:DB$ Draw | NumCards$ X | SubAbility$ DBPlay | StackDescription$ None
-SVar:DBPlay:DB$ Play | Valid$ Card | ValidSA$ Instant.cmcLEY,Sorcery.cmcLEY | ValidZone$ Hand | WithoutManaCost$ True | Amount$ 1 | Controller$ You | Optional$ True
+SVar:DBPlay:DB$ Play | Valid$ Card.YouOwn | ValidSA$ Instant.cmcLEY,Sorcery.cmcLEY | ValidZone$ Hand | WithoutManaCost$ True | Amount$ 1 | Controller$ You | Optional$ True
Oracle:Roll two d8 and choose one result. Draw cards equal to that result. Then you may cast an instant or sorcery spell with mana value less than or equal to the other result from your hand without paying its mana cost.
diff --git a/forge-gui/res/cardsfolder/a/arlinn_voice_of_the_pack.txt b/forge-gui/res/cardsfolder/a/arlinn_voice_of_the_pack.txt
index 04006805838..73807a576d7 100644
--- a/forge-gui/res/cardsfolder/a/arlinn_voice_of_the_pack.txt
+++ b/forge-gui/res/cardsfolder/a/arlinn_voice_of_the_pack.txt
@@ -3,7 +3,7 @@ ManaCost:4 G G
Types:Legendary Planeswalker Arlinn
Loyalty:7
K:ETBReplacement:Other:AddExtraCounter:Mandatory:Battlefield:Creature.Wolf+YouCtrl,Creature.Werewolf+YouCtrl
-SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$Each creature you control that's a Wolf or a Werewolf enters the battlefield with an additional +1/+1 counter on it.
+SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Each creature you control that's a Wolf or a Werewolf enters the battlefield with an additional +1/+1 counter on it.
SVar:PlayMain1:TRUE
A:AB$ Token | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | TokenAmount$ 1 | TokenScript$ g_2_2_wolf | TokenOwner$ You | LegacyImage$ g 2 2 wolf war | SpellDescription$ Create a 2/2 green Wolf creature token.
DeckHints:Type$Wolf & Type$Werewolf
diff --git a/forge-gui/res/cardsfolder/a/asmodeus_the_archfiend.txt b/forge-gui/res/cardsfolder/a/asmodeus_the_archfiend.txt
index 1d37d31b704..ff2c7d04f5a 100644
--- a/forge-gui/res/cardsfolder/a/asmodeus_the_archfiend.txt
+++ b/forge-gui/res/cardsfolder/a/asmodeus_the_archfiend.txt
@@ -5,7 +5,7 @@ PT:6/6
R:Event$ Draw | ActiveZones$ Battlefield | ValidPlayer$ You | ReplaceWith$ ExileTop | Description$ Binding Contract — If you would draw a card, exile the top card of your library face down instead.
SVar:ExileTop:DB$ ChangeZone | Defined$ TopOfLibrary | Origin$ Library | Destination$ Exile | ExileFaceDown$ True
A:AB$ Draw | Cost$ B B B | NumCards$ 7 | SpellDescription$ Draw seven cards.
-A:AB$ ChangeZoneAll | Cost$ B | ChangeType$ Card.ExiledWithSource | Origin$ Exile | Destination$ Hand | RememberChanged$ True | SubAbility$ DBLoseLife | SpellDescription$ Return all cards exiled with CARDNAME to their owner’s hand and you lose that much life.
+A:AB$ ChangeZoneAll | Cost$ B | ChangeType$ Card.ExiledWithSource | Origin$ Exile | Destination$ Hand | RememberChanged$ True | SubAbility$ DBLoseLife | SpellDescription$ Return all cards exiled with CARDNAME to their owner's hand and you lose that much life.
SVar:DBLoseLife:DB$ LoseLife | Defined$ You | LifeAmount$ X | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:X:Remembered$Amount
diff --git a/forge-gui/res/cardsfolder/b/battle_for_bretagard.txt b/forge-gui/res/cardsfolder/b/battle_for_bretagard.txt
index c1496549e5e..a1a6fc0d545 100644
--- a/forge-gui/res/cardsfolder/b/battle_for_bretagard.txt
+++ b/forge-gui/res/cardsfolder/b/battle_for_bretagard.txt
@@ -4,7 +4,7 @@ Types:Enchantment Saga
K:Saga:3:TrigToken1,TrigToken2,DBCopy
SVar:TrigToken1:DB$ Token | TokenAmount$ 1 | TokenScript$ w_1_1_human_warrior | TokenOwner$ You | SpellDescription$ Create a 1/1 white Human Warrior creature token.
SVar:TrigToken2:DB$ Token | TokenAmount$ 1 | TokenScript$ g_1_1_elf_warrior | TokenOwner$ You | SpellDescription$ Create a 1/1 green Elf Warrior creature token.
-SVar:DBCopy:DB$ CopyPermanent | Choices$ Artifact.token+YouCtrl,Creature.token+YouCtrl | WithDifferentNames$ True | SpellDescription$ Choose any number of artifact tokens and/or creature tokens you control with different names. For each of them, create a token that’s a copy of it.
+SVar:DBCopy:DB$ CopyPermanent | Choices$ Artifact.token+YouCtrl,Creature.token+YouCtrl | WithDifferentNames$ True | SpellDescription$ Choose any number of artifact tokens and/or creature tokens you control with different names. For each of them, create a token that's a copy of it.
DeckHas:Ability$Token
Oracle:(As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)\nI — Create a 1/1 white Human Warrior creature token.\nII — Create a 1/1 green Elf Warrior creature token.\nIII — Choose any number of artifact tokens and/or creature tokens you control with different names. For each of them, create a token that's a copy of it.
diff --git a/forge-gui/res/cardsfolder/b/blim_comedic_genius.txt b/forge-gui/res/cardsfolder/b/blim_comedic_genius.txt
index d5a6eafba9e..e6a03cfefb3 100644
--- a/forge-gui/res/cardsfolder/b/blim_comedic_genius.txt
+++ b/forge-gui/res/cardsfolder/b/blim_comedic_genius.txt
@@ -3,7 +3,7 @@ ManaCost:2 B R
Types:Legendary Creature Imp
PT:4/3
K:Flying
-T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | CombatDamage$ True | TriggerZone$ Battlefield | Execute$ TrigControl | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, that player gains control of target permanent you control. Then each player loses life and discards cards equal to the number of permanents they control but don't own.
+T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigControl | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, that player gains control of target permanent you control. Then each player loses life and discards cards equal to the number of permanents they control but don't own.
SVar:TrigControl:DB$ GainControl | ValidTgts$ Permanent.YouCtrl | TargetMin$ 1 | TgtPrompt$ Choose a permanent you control for damaged player to gain control of | NewController$ TriggeredTarget | SubAbility$ DBRepeatEach
SVar:DBRepeatEach:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBLoseLife
SVar:DBLoseLife:DB$ LoseLife | Defined$ Player.IsRemembered | LifeAmount$ X | SubAbility$ DBDiscard
diff --git a/forge-gui/res/cardsfolder/b/blood_operative.txt b/forge-gui/res/cardsfolder/b/blood_operative.txt
index 65ed760c7d3..c5b7c1314ee 100644
--- a/forge-gui/res/cardsfolder/b/blood_operative.txt
+++ b/forge-gui/res/cardsfolder/b/blood_operative.txt
@@ -6,5 +6,5 @@ K:Lifelink
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may exile target card from a graveyard.
SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Card | TgtPrompt$ Select target card in a graveyard
T:Mode$ Surveil | ValidPlayer$ You | Execute$ TrigReturn | TriggerZones$ Graveyard | IsPresent$ Card.StrictlySelf | PresentZone$ Graveyard | PresentPlayer$ You | TriggerDescription$ Whenever you surveil, if CARDNAME is in your graveyard, you may pay 3 life. If you do, return CARDNAME to your hand.
-SVar:TrigReturn:AB$ChangeZone | Cost$ PayLife<3> | Defined$ Self | Origin$ Graveyard | Destination$ Hand
+SVar:TrigReturn:AB$ ChangeZone | Cost$ PayLife<3> | Defined$ Self | Origin$ Graveyard | Destination$ Hand
Oracle:Lifelink\nWhen Blood Operative enters the battlefield, you may exile target card from a graveyard.\nWhenever you surveil, if Blood Operative is in your graveyard, you may pay 3 life. If you do, return Blood Operative to your hand.
diff --git a/forge-gui/res/cardsfolder/b/bound_in_gold.txt b/forge-gui/res/cardsfolder/b/bound_in_gold.txt
index 6a5345de00a..5f526e7b244 100644
--- a/forge-gui/res/cardsfolder/b/bound_in_gold.txt
+++ b/forge-gui/res/cardsfolder/b/bound_in_gold.txt
@@ -3,6 +3,6 @@ ManaCost:2 W
Types:Enchantment Aura
K:Enchant permanent
A:SP$ Attach | Cost$ 2 W | ValidTgts$ Permanent | AILogic$ Curse
-S:Mode$ Continuous | Affected$ Permanent.EnchantedBy | AddHiddenKeyword$ CARDNAME can't attack or block. & CARDNAME can't crew Vehicles. | Description$ Enchanted permanent can’t attack, block, or crew Vehicles, and its activated abilities can’t be activated unless they’re mana abilities.
+S:Mode$ Continuous | Affected$ Permanent.EnchantedBy | AddHiddenKeyword$ CARDNAME can't attack or block. & CARDNAME can't crew Vehicles. | Description$ Enchanted permanent can't attack, block, or crew Vehicles, and its activated abilities can't be activated unless they're mana abilities.
S:Mode$ CantBeActivated | ValidCard$ Card.EnchantedBy | NonMana$ True
Oracle:Enchant permanent\nEnchanted permanent can't attack, block, or crew Vehicles, and its activated abilities can't be activated unless they're mana abilities.
diff --git a/forge-gui/res/cardsfolder/b/brimstone_vandal.txt b/forge-gui/res/cardsfolder/b/brimstone_vandal.txt
index a31d09883a6..22dca698de2 100644
--- a/forge-gui/res/cardsfolder/b/brimstone_vandal.txt
+++ b/forge-gui/res/cardsfolder/b/brimstone_vandal.txt
@@ -8,4 +8,4 @@ SVar:DoDay:DB$ DayTime | Value$ Day | SubAbility$ ETB
SVar:ETB:DB$ InternalEtbReplacement
T:Mode$ DayTimeChanges | Execute$ TrigDamage | TriggerZones$ Battlefield | TriggerDescription$ Whenever day becomes night or night becomes day, CARDNAME deals 1 damage to each opponent.
SVar:TrigDamage:DB$ DealDamage | Defined$ Player.Opponent | NumDmg$ 1
-Oracle:Menace (This creature can’t be blocked except by two or more creatures.)\nIf it's neither day nor night, it becomes day as Brimstone Vandal enters the battlefield.\nWhenever day becomes night or night becomes day, Brimstone Vandal deals 1 damage to each opponent.
+Oracle:Menace (This creature can't be blocked except by two or more creatures.)\nIf it's neither day nor night, it becomes day as Brimstone Vandal enters the battlefield.\nWhenever day becomes night or night becomes day, Brimstone Vandal deals 1 damage to each opponent.
diff --git a/forge-gui/res/cardsfolder/b/bringer_of_the_blue_dawn.txt b/forge-gui/res/cardsfolder/b/bringer_of_the_blue_dawn.txt
index 866c0c1ff90..0202da6acb0 100644
--- a/forge-gui/res/cardsfolder/b/bringer_of_the_blue_dawn.txt
+++ b/forge-gui/res/cardsfolder/b/bringer_of_the_blue_dawn.txt
@@ -4,6 +4,6 @@ Types:Creature Bringer
PT:5/5
K:Trample
SVar:AltCost:Cost$ W U B R G | Description$ You may pay {W}{U}{B}{R}{G} rather than pay this spell's mana cost.
-T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ At the beginning of your upkeep, you may draw two cards.
-SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 2
+T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ At the beginning of your upkeep, you may draw two cards.
+SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 2 | OptionalDecider$ You
Oracle:You may pay {W}{U}{B}{R}{G} rather than pay this spell's mana cost.\nTrample\nAt the beginning of your upkeep, you may draw two cards.
diff --git a/forge-gui/res/cardsfolder/b/brutal_expulsion.txt b/forge-gui/res/cardsfolder/b/brutal_expulsion.txt
index b4acaa43cff..cf7514cab4d 100644
--- a/forge-gui/res/cardsfolder/b/brutal_expulsion.txt
+++ b/forge-gui/res/cardsfolder/b/brutal_expulsion.txt
@@ -2,8 +2,7 @@ Name:Brutal Expulsion
ManaCost:2 U R
Types:Instant
K:Devoid
-A:SP$ Charm | Cost$ 2 U R | MinCharmNum$ 1 | CharmNum$ 2 | Choices$ DBReturn,DBDmg
+A:SP$ Charm | MinCharmNum$ 1 | CharmNum$ 2 | Choices$ DBReturn,DBDmg
SVar:DBReturn:DB$ ChangeZone | ValidTgts$ Creature,Card.inZoneStack | TgtZone$ Stack,Battlefield | Origin$ Battlefield,Stack | Fizzle$ True | Destination$ Hand | SpellDescription$ Return target spell or creature to its owner's hand.
-SVar:DBDmg:DB$ DealDamage | ValidTgts$ Creature,Planeswalker | TgtPrompt$ Select target creature or planeswalker. | NumDmg$ 2 | ReplaceDyingDefined$ Targeted | SpellDescription$ CARDNAME deals 2 damage to target creature or planeswalker. If that creature or planeswalker would die this turn, exile it instead.AI:RemoveDeck:All
-SVar:Picture:http://www.wizards.com/global/images/magic/general/brutal_expulsion.jpg
+SVar:DBDmg:DB$ DealDamage | ValidTgts$ Creature,Planeswalker | TgtPrompt$ Select target creature or planeswalker | NumDmg$ 2 | ReplaceDyingDefined$ Targeted | SpellDescription$ CARDNAME deals 2 damage to target creature or planeswalker. If that creature or planeswalker would die this turn, exile it instead.
Oracle:Devoid (This card has no color.)\nChoose one or both —\n• Return target spell or creature to its owner's hand.\n• Brutal Expulsion deals 2 damage to target creature or planeswalker. If that creature or planeswalker would die this turn, exile it instead.
diff --git a/forge-gui/res/cardsfolder/b/burn_from_within.txt b/forge-gui/res/cardsfolder/b/burn_from_within.txt
index cd169bde644..ec90092fe2f 100644
--- a/forge-gui/res/cardsfolder/b/burn_from_within.txt
+++ b/forge-gui/res/cardsfolder/b/burn_from_within.txt
@@ -1,9 +1,8 @@
Name:Burn from Within
ManaCost:X R
Types:Sorcery
-A:SP$ DealDamage | Cost$ X R | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | RememberDamaged$ True | ReplaceDyingDefined$ Remembered.Creature | SubAbility$ DBDebuff | SpellDescription$ CARDNAME deals X damage to any target. If a creature is dealt damage this way, it loses indestructible until end of turn. If that creature would die this turn, exile it instead.
+A:SP$ DealDamage | Cost$ X R | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | RememberDamaged$ True | ReplaceDyingDefined$ Remembered.Creature | SubAbility$ DBDebuff | StackDescription$ CARDNAME deals X damage to {p:Targeted}{c:Targeted}. If a creature is dealt damage this way, it loses indestructible until end of turn. If that creature would die this turn, exile it instead. | SpellDescription$ CARDNAME deals X damage to any target. If a creature is dealt damage this way, it loses indestructible until end of turn. If that creature would die this turn, exile it instead.
SVar:DBDebuff:DB$ Debuff | Defined$ Remembered.Creature | Keywords$ Indestructible | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:X:Count$xPaid
-SVar:Picture:http://www.wizards.com/global/images/magic/general/burn_from_within.jpg
Oracle:Burn from Within deals X damage to any target. If a creature is dealt damage this way, it loses indestructible until end of turn. If that creature would die this turn, exile it instead.
diff --git a/forge-gui/res/cardsfolder/c/carbonize.txt b/forge-gui/res/cardsfolder/c/carbonize.txt
index 38afc3352f8..39cff6eba3b 100644
--- a/forge-gui/res/cardsfolder/c/carbonize.txt
+++ b/forge-gui/res/cardsfolder/c/carbonize.txt
@@ -1,6 +1,6 @@
Name:Carbonize
ManaCost:2 R
Types:Instant
-A:SP$ DealDamage | Cost$ 2 R | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 3 | SubAbility$ DB | ReplaceDyingDefined$ Targeted.Creature | SpellDescription$ CARDNAME deals 3 damage to any target. If it's a creature, it can't be regenerated this turn, and if it would die this turn, exile it instead.
-SVar:DB:DB$ Pump | KW$ HIDDEN CARDNAME can't be regenerated. | Defined$ Targeted.Creature
+A:SP$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 3 | SubAbility$ DB | ReplaceDyingDefined$ Targeted.Creature | SpellDescription$ CARDNAME deals 3 damage to any target. If it's a creature, it can't be regenerated this turn, and if it would die this turn, exile it instead.
+SVar:DB:DB$ Pump | KW$ HIDDEN CARDNAME can't be regenerated. | Defined$ Targeted.Creature | StackDescription$ None
Oracle:Carbonize deals 3 damage to any target. If it's a creature, it can't be regenerated this turn, and if it would die this turn, exile it instead.
diff --git a/forge-gui/res/cardsfolder/c/champion_of_wits.txt b/forge-gui/res/cardsfolder/c/champion_of_wits.txt
index 148233992b6..0140b8490a7 100644
--- a/forge-gui/res/cardsfolder/c/champion_of_wits.txt
+++ b/forge-gui/res/cardsfolder/c/champion_of_wits.txt
@@ -2,9 +2,8 @@ Name:Champion of Wits
ManaCost:2 U
Types:Creature Naga Wizard
PT:2/1
-T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may draw cards equal to its power. If you do, discard two cards.
-SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ X | SubAbility$ DBDiscard
-SVar:DBDiscard:DB$ Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 2
+T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, you may draw cards equal to its power. If you do, discard two cards.
+SVar:TrigDraw:AB$ Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 2 | Cost$ Draw
K:Eternalize:5 U U
SVar:X:Count$CardPower
SVar:Picture:http://www.wizards.com/global/images/magic/general/champion_of_wits.jpg
diff --git a/forge-gui/res/cardsfolder/c/chandras_defeat.txt b/forge-gui/res/cardsfolder/c/chandras_defeat.txt
index 2c44c2c58e5..e6de5bbf0b2 100644
--- a/forge-gui/res/cardsfolder/c/chandras_defeat.txt
+++ b/forge-gui/res/cardsfolder/c/chandras_defeat.txt
@@ -1,9 +1,7 @@
Name:Chandra's Defeat
ManaCost:R
Types:Instant
-A:SP$ DealDamage | Cost$ R | ValidTgts$ Creature.Red,Planeswalker.Red | TgtPrompt$ Select target red creature or red planeswalker | NumDmg$ 5 | SubAbility$ DBDiscard | SpellDescription$ CARDNAME deals 5 damage to target red creature or red planeswalker. If that permanent is a Chandra planeswalker, you may discard a card. If you do, draw a card.
-SVar:DBDiscard:DB$ Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose | RememberDiscarded$ True | SubAbility$ DBDraw | ConditionDefined$ Targeted | ConditionPresent$ Planeswalker.Chandra | Optional$ True
-SVar:DBDraw:DB$ Draw | NumCards$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup
-SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
+A:SP$ DealDamage | Cost$ R | ValidTgts$ Creature.Red,Planeswalker.Red | TgtPrompt$ Select target red creature or red planeswalker | NumDmg$ 5 | SubAbility$ DBDraw | SpellDescription$ CARDNAME deals 5 damage to target red creature or red planeswalker. If that permanent is a Chandra planeswalker, you may discard a card. If you do, draw a card.
+SVar:DBDraw:DB$ Draw | NumCards$ 1 | ConditionDefined$ Targeted | ConditionPresent$ Planeswalker.Chandra | UnlessCost$ Discard<1/Card> | UnlessSwitched$ True | UnlessPayer$ You
SVar:Picture:http://www.wizards.com/global/images/magic/general/chandras_defeat.jpg
Oracle:Chandra's Defeat deals 5 damage to target red creature or red planeswalker. If that permanent is a Chandra planeswalker, you may discard a card. If you do, draw a card.
diff --git a/forge-gui/res/cardsfolder/c/chimney_goyf.txt b/forge-gui/res/cardsfolder/c/chimney_goyf.txt
index fb37863fcdf..0cfe9c9ffef 100644
--- a/forge-gui/res/cardsfolder/c/chimney_goyf.txt
+++ b/forge-gui/res/cardsfolder/c/chimney_goyf.txt
@@ -4,7 +4,7 @@ Types:Creature Lhurgoyf Imp
PT:*/1+*
K:Flying
S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | SetToughness$ Y | Description$ CARDNAME's power is equal to the number of card types among cards in all graveyards and its toughness is equal to that number plus 1.
-SVar:X:Count$CardTypes.Graveyard
+SVar:X:Count$CardTypes.ValidGraveyard Card
SVar:Y:SVar$X/Plus.1
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, target opponent puts a card from their hand on top of their library.
SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Hand | Destination$ Library | LibraryPosition$ 0 | ValidTgts$ Opponent | ChangeType$ Card | ChangeNum$ 1 | Chooser$ Opponent | Mandatory$ True | IsCurse$ True
diff --git a/forge-gui/res/cardsfolder/c/cold_eyed_selkie.txt b/forge-gui/res/cardsfolder/c/cold_eyed_selkie.txt
index ff3956a8e25..1ef9cc26bf2 100644
--- a/forge-gui/res/cardsfolder/c/cold_eyed_selkie.txt
+++ b/forge-gui/res/cardsfolder/c/cold_eyed_selkie.txt
@@ -3,8 +3,8 @@ ManaCost:1 GU GU
Types:Creature Merfolk Rogue
PT:1/1
K:Islandwalk
-T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ TrigDraw | CombatDamage$ True | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may draw that many cards.
-SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ X
+T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ TrigDraw | CombatDamage$ True | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may draw that many cards.
+SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ X | OptionalDecider$ You
SVar:X:TriggerCount$DamageAmount
SVar:Picture:http://www.wizards.com/global/images/magic/general/cold_eyed_selkie.jpg
Oracle:Islandwalk (This creature can't be blocked as long as defending player controls an Island.)\nWhenever Cold-Eyed Selkie deals combat damage to a player, you may draw that many cards.
diff --git a/forge-gui/res/cardsfolder/c/consecrated_sphinx.txt b/forge-gui/res/cardsfolder/c/consecrated_sphinx.txt
index 54d86a14492..89eb787af39 100644
--- a/forge-gui/res/cardsfolder/c/consecrated_sphinx.txt
+++ b/forge-gui/res/cardsfolder/c/consecrated_sphinx.txt
@@ -3,7 +3,7 @@ ManaCost:4 U U
Types:Creature Sphinx
PT:4/6
K:Flying
-T:Mode$ Drawn | ValidCard$ Card.OppOwn | TriggerZones$ Battlefield | Execute$ TrigDraw | OptionalDecider$ You | TriggerDescription$ Whenever an opponent draws a card, you may draw two cards.
-SVar:TrigDraw:DB$ Draw | NumCards$ 2
+T:Mode$ Drawn | ValidCard$ Card.OppOwn | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever an opponent draws a card, you may draw two cards.
+SVar:TrigDraw:DB$ Draw | NumCards$ 2 | OptionalDecider$ You
SVar:Picture:http://www.wizards.com/global/images/magic/general/consecrated_sphinx.jpg
Oracle:Flying\nWhenever an opponent draws a card, you may draw two cards.
diff --git a/forge-gui/res/cardsfolder/c/control_win_condition.txt b/forge-gui/res/cardsfolder/c/control_win_condition.txt
index 6ce0472bb30..f463be41b7a 100644
--- a/forge-gui/res/cardsfolder/c/control_win_condition.txt
+++ b/forge-gui/res/cardsfolder/c/control_win_condition.txt
@@ -4,6 +4,6 @@ Types:Creature Whale
PT:*/*
K:This spell can't be countered.
K:Shroud
-S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | SetToughness$ X | Description$ CARDNAME's power and toughness are each equal to the number of turns you’ve taken this game. (If this is in your deck, please keep track of your turns. This means you, Mark.)
+S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | SetToughness$ X | Description$ CARDNAME's power and toughness are each equal to the number of turns you've taken this game. (If this is in your deck, please keep track of your turns. This means you, Mark.)
SVar:X:Count$YourTurns
Oracle:This spell can't be countered.\nShroud\nControl Win Condition's power and toughness are each equal to the number of turns you've taken this game. (If this is in your deck, please keep track of your turns. This means you, Mark.)
diff --git a/forge-gui/res/cardsfolder/c/corpse_cobble.txt b/forge-gui/res/cardsfolder/c/corpse_cobble.txt
index 087ec075d39..793a3dab03f 100644
--- a/forge-gui/res/cardsfolder/c/corpse_cobble.txt
+++ b/forge-gui/res/cardsfolder/c/corpse_cobble.txt
@@ -1,7 +1,7 @@
Name:Corpse Cobble
ManaCost:U B
Types:Instant
-A:SP$ Token | Cost$ U B Sac | TokenScript$ ub_x_x_zombie_menace | TokenPower$ Y | TokenToughness$ Y | SpellDescription$ Create an X/X blue and black Zombie creature token with menace, where X is the total power of the sacrificed creatures.
+A:SP$ Token | Cost$ U B Sac | TokenScript$ ub_x_x_zombie_menace | AnnounceTitle$ number of creatures to sacrifice | TokenPower$ Y | TokenToughness$ Y | SpellDescription$ Create an X/X blue and black Zombie creature token with menace, where X is the total power of the sacrificed creatures.
K:Flashback:3 U B
SVar:X:Count$xPaid
SVar:Y:Sacrificed$CardPower
diff --git a/forge-gui/res/cardsfolder/c/cosmic_intervention.txt b/forge-gui/res/cardsfolder/c/cosmic_intervention.txt
index 509ce9a173f..41eac2994d0 100644
--- a/forge-gui/res/cardsfolder/c/cosmic_intervention.txt
+++ b/forge-gui/res/cardsfolder/c/cosmic_intervention.txt
@@ -4,7 +4,7 @@ Types:Instant
A:SP$ Effect | ReplacementEffects$ ReplaceGrave | SpellDescription$ If a permanent you control would be put into a graveyard from the battlefield this turn, exile it instead. Return it to the battlefield under its owner's control at the beginning of the next end step.
SVar:ReplaceGrave:Event$ Moved | ValidCard$ Permanent.YouCtrl | Origin$ Battlefield | Destination$ Graveyard | ReplaceWith$ Exile | ActiveZone$ Command | Description$ If a permanent you control would be put into a graveyard from the battlefield this turn, exile it instead. Return it to the battlefield under its owner's control at the beginning of the next end step.
SVar:Exile:DB$ ChangeZone | Defined$ ReplacedCard | Origin$ All | Destination$ Exile | SubAbility$ DBDelayTrigger
-SVar:DBDelayTrigger:DB$ DelayedTrigger | RememberObjects$ ReplacedCard | Mode$ Phase | Phase$ End of Turn | Execute$ TrigReturn | TriggerDescription$ Return it to the battlefield under its owner’s control at the beginning of the next end step.
+SVar:DBDelayTrigger:DB$ DelayedTrigger | RememberObjects$ ReplacedCard | Mode$ Phase | Phase$ End of Turn | Execute$ TrigReturn | TriggerDescription$ Return it to the battlefield under its owner's control at the beginning of the next end step.
SVar:TrigReturn:DB$ ChangeZone | Defined$ DelayTriggerRemembered | Destination$ Battlefield
K:Foretell:1 W
Oracle:If a permanent you control would be put into a graveyard from the battlefield this turn, exile it instead. Return it to the battlefield under its owner's control at the beginning of the next end step.\nForetell {1}{W} (During your turn, you may pay {2} and exile this card from your hand face down. Cast it on a later turn for its foretell cost.)
diff --git a/forge-gui/res/cardsfolder/c/cosmos_charger.txt b/forge-gui/res/cardsfolder/c/cosmos_charger.txt
index 678f9c83a63..5c9d10cb490 100644
--- a/forge-gui/res/cardsfolder/c/cosmos_charger.txt
+++ b/forge-gui/res/cardsfolder/c/cosmos_charger.txt
@@ -5,7 +5,7 @@ PT:3/3
K:Flash
K:Flying
S:Mode$ ReduceCost | ValidSpell$ Static.Foretelling | Activator$ You | Amount$ 1 | Description$ Foretelling cards from your hand costs {1} less and can be done on any player's turn.
-S:Mode$ Continuous | Affected$ You | AddKeyword$ Foretell on any player’s turn | Secondary$ True | Description$ Foretelling cards from your hand on any player’s turn.
+S:Mode$ Continuous | Affected$ You | AddKeyword$ Foretell on any player's turn | Secondary$ True | Description$ Foretelling cards from your hand on any player's turn.
K:Foretell:2 U
Oracle:Flash\nFlying\nForetelling cards from your hand costs {1} less and can be done on any player's turn.\nForetell {2}{U} (During your turn, you may pay {2} and exile this card from your hand face down. Cast it on a later turn for its foretell cost.)
diff --git a/forge-gui/res/cardsfolder/c/curse_of_chaos.txt b/forge-gui/res/cardsfolder/c/curse_of_chaos.txt
index b60ecce39a3..495e5d23c67 100644
--- a/forge-gui/res/cardsfolder/c/curse_of_chaos.txt
+++ b/forge-gui/res/cardsfolder/c/curse_of_chaos.txt
@@ -4,9 +4,7 @@ Types:Enchantment Aura Curse
K:Enchant player
A:SP$ Attach | Cost$ 2 R | ValidTgts$ Player | AILogic$ Curse
T:Mode$ AttackersDeclared | Execute$ TrigDiscard | TriggerZones$ Battlefield | AttackedTarget$ Player.EnchantedBy | OptionalDecider$ TriggeredAttackingPlayer | TriggerDescription$ Whenever a player attacks enchanted player with one or more creatures, that attacking player may discard a card. If the player does, they draw a card.
-SVar:TrigDiscard:DB$ Discard | Defined$ TriggeredAttackingPlayer | NumCards$ 1 | Mode$ TgtChoose | SubAbility$ DBDraw | RememberDiscarded$ True
-SVar:DBDraw:DB$ Draw | Defined$ TriggeredAttackingPlayer | NumCards$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup
-SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
+SVar:TrigDiscard:DB$ Draw | Defined$ TriggeredAttackingPlayer | NumCards$ 1 | UnlessCost$ Discard<1/Card> | UnlessSwitched$ True | UnlessPayer$ TriggeredAttackingPlayer
AI:RemoveDeck:All
SVar:Picture:http://www.wizards.com/global/images/magic/general/curse_of_chaos.jpg
Oracle:Enchant player\nWhenever a player attacks enchanted player with one or more creatures, that attacking player may discard a card. If the player does, they draw a card.
diff --git a/forge-gui/res/cardsfolder/c/curse_of_unbinding.txt b/forge-gui/res/cardsfolder/c/curse_of_unbinding.txt
index b6e26bb00fd..99eba5e5c76 100644
--- a/forge-gui/res/cardsfolder/c/curse_of_unbinding.txt
+++ b/forge-gui/res/cardsfolder/c/curse_of_unbinding.txt
@@ -3,6 +3,6 @@ ManaCost:6 U
Types:Enchantment Aura Curse
K:Enchant player
A:SP$ Attach | ValidTgts$ Player | TgtPrompt$ Select player to curse | AILogic$ Curse
-T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player.EnchantedBy | TriggerZone$ Battlefield | Execute$ TrigDig | TriggerDescription$ At the beginning of enchanted player's upkeep, that player reveals cards from the top of their library until they reveal a creature card. Put that card on the battlefield under your control. That player puts the rest of the revealed cards into their graveyard.
+T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player.EnchantedBy | TriggerZones$ Battlefield | Execute$ TrigDig | TriggerDescription$ At the beginning of enchanted player's upkeep, that player reveals cards from the top of their library until they reveal a creature card. Put that card on the battlefield under your control. That player puts the rest of the revealed cards into their graveyard.
SVar:TrigDig:DB$ DigUntil | Defined$ Player.EnchantedBy | Valid$ Creature | FoundDestination$ Battlefield | RevealedDestination$ Graveyard | GainControl$ True
Oracle:Enchant player\nAt the beginning of enchanted player's upkeep, that player reveals cards from the top of their library until they reveal a creature card. Put that card on the battlefield under your control. That player puts the rest of the revealed cards into their graveyard.
diff --git a/forge-gui/res/cardsfolder/d/daretti_ingenious_iconoclast.txt b/forge-gui/res/cardsfolder/d/daretti_ingenious_iconoclast.txt
index 0a1a17228ea..23da238a6db 100644
--- a/forge-gui/res/cardsfolder/d/daretti_ingenious_iconoclast.txt
+++ b/forge-gui/res/cardsfolder/d/daretti_ingenious_iconoclast.txt
@@ -3,9 +3,7 @@ ManaCost:1 B R
Types:Legendary Planeswalker Daretti
Loyalty:3
A:AB$ Token | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | TokenAmount$ 1 | TokenScript$ c_1_1_a_construct_defender | TokenOwner$ You | LegacyImage$ c 1 1 a construct defender cn2 | SpellDescription$ Create a 1/1 colorless Construct artifact creature token with defender.
-A:AB$ Sacrifice | Cost$ SubCounter<1/LOYALTY> | Planeswalker$ True | Defined$ You | Amount$ 1 | SacValid$ Artifact | RememberSacrificed$ True | Optional$ True | SubAbility$ DBDestroy | SpellDescription$ You may sacrifice an artifact. If you do, destroy target artifact or creature. | StackDescription$ SpellDescription
-SVar:DBDestroy:DB$ Destroy | ValidTgts$ Artifact,Creature | TgtPrompt$ Select target artifact or creature | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup
-SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
+A:AB$ Destroy | Cost$ SubCounter<1/LOYALTY> | Planeswalker$ True | ValidTgts$ Artifact,Creature | TgtPrompt$ Select target artifact or creature | UnlessCost$ Sac<1/Artifact> | UnlessSwitched$ True | UnlessPayer$ You | SpellDescription$ You may sacrifice an artifact. If you do, destroy target artifact or creature. | StackDescription$ SpellDescription
A:AB$ CopyPermanent | Cost$ SubCounter<6/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidTgts$ Artifact | TgtZone$ Battlefield,Graveyard | TgtPrompt$ Select an artifact in graveyard or the battlefield | NumCopies$ 3 | SpellDescription$ Choose target artifact card in a graveyard or artifact on the battlefield. Create three tokens that are copies of it.
SVar:Picture:http://www.wizards.com/global/images/magic/general/daretti_ingenious_iconoclast.jpg
Oracle:[+1]: Create a 1/1 colorless Construct artifact creature token with defender.\n[−1]: You may sacrifice an artifact. If you do, destroy target artifact or creature.\n[−6]: Choose target artifact card in a graveyard or artifact on the battlefield. Create three tokens that are copies of it.
diff --git a/forge-gui/res/cardsfolder/d/dark_depths.txt b/forge-gui/res/cardsfolder/d/dark_depths.txt
index e4ec8c13d6a..a64e73b641c 100644
--- a/forge-gui/res/cardsfolder/d/dark_depths.txt
+++ b/forge-gui/res/cardsfolder/d/dark_depths.txt
@@ -3,9 +3,7 @@ ManaCost:no cost
Types:Legendary Snow Land
K:etbCounter:ICE:10
A:AB$ RemoveCounter | Cost$ 3 | CounterType$ ICE | CounterNum$ 1 | SpellDescription$ Remove an ice counter from CARDNAME.
-T:Mode$ Always | TriggerZones$ Battlefield | IsPresent$ Card.Self+counters_EQ0_ICE | Execute$ TrigSac | TriggerDescription$ When Dark Depths has no ice counters on it, sacrifice it. If you do, create Marit Lage, a legendary 20/20 black Avatar creature token with flying and indestructible.
-SVar:TrigSac:DB$ Sacrifice | RememberSacrificed$ True | SubAbility$ DBToken
-SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ marit_lage | TokenOwner$ You | LegacyImage$ marit lage v16 | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup
-SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
+T:Mode$ Always | TriggerZones$ Battlefield | IsPresent$ Card.Self+counters_EQ0_ICE | Execute$ TrigToken | TriggerDescription$ When Dark Depths has no ice counters on it, sacrifice it. If you do, create Marit Lage, a legendary 20/20 black Avatar creature token with flying and indestructible.
+SVar:TrigToken:AB$ Token | TokenAmount$ 1 | TokenScript$ marit_lage | TokenOwner$ You | LegacyImage$ marit lage v16 | Cost$ Mandatory Sac<1/CARDNAME>
SVar:Picture:http://www.wizards.com/global/images/magic/general/dark_depths.jpg
Oracle:Dark Depths enters the battlefield with ten ice counters on it.\n{3}: Remove an ice counter from Dark Depths.\nWhen Dark Depths has no ice counters on it, sacrifice it. If you do, create Marit Lage, a legendary 20/20 black Avatar creature token with flying and indestructible.
diff --git a/forge-gui/res/cardsfolder/d/deadly_designs.txt b/forge-gui/res/cardsfolder/d/deadly_designs.txt
index faeead9bdda..7e584f1f241 100644
--- a/forge-gui/res/cardsfolder/d/deadly_designs.txt
+++ b/forge-gui/res/cardsfolder/d/deadly_designs.txt
@@ -2,9 +2,7 @@ Name:Deadly Designs
ManaCost:1 B
Types:Enchantment
A:AB$ PutCounter | Cost$ 2 | CounterType$ PLOT | CounterNum$ 1 | Activator$ Player | SpellDescription$ Put a plot counter on CARDNAME. Any player may activate this ability.
-T:Mode$ Always | TriggerZones$ Battlefield | IsPresent$ Card.Self+counters_GE5_PLOT | Execute$ TrigSac | TriggerDescription$ When there are five or more plot counters on CARDNAME, sacrifice it. If you do, destroy up to two target creatures.
-SVar:TrigSac:DB$ Sacrifice | RememberSacrificed$ True | SubAbility$ DBDestroy | ConditionPresent$ Card.Self+YouCtrl
-SVar:DBDestroy:DB$ Destroy | TargetMin$ 0 | TargetMax$ 2 | ValidTgts$ Creature | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup | TgtPrompt$ Select target creature
-SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
+T:Mode$ Always | TriggerZones$ Battlefield | IsPresent$ Card.Self+counters_GE5_PLOT | Execute$ TrigDestroy | TriggerDescription$ When there are five or more plot counters on CARDNAME, sacrifice it. If you do, destroy up to two target creatures.
+SVar:TrigDestroy:AB$ Destroy | TargetMin$ 0 | TargetMax$ 2 | ValidTgts$ Creature | Cost$ Mandatory Sac<1/CARDNAME>
SVar:Picture:http://www.wizards.com/global/images/magic/general/deadly_designs.jpg
Oracle:{2}: Put a plot counter on Deadly Designs. Any player may activate this ability.\nWhen there are five or more plot counters on Deadly Designs, sacrifice it. If you do, destroy up to two target creatures.
\ No newline at end of file
diff --git a/forge-gui/res/cardsfolder/d/demonic_gifts.txt b/forge-gui/res/cardsfolder/d/demonic_gifts.txt
index 06b27bcf03c..960d0d43aa1 100644
--- a/forge-gui/res/cardsfolder/d/demonic_gifts.txt
+++ b/forge-gui/res/cardsfolder/d/demonic_gifts.txt
@@ -3,6 +3,6 @@ ManaCost:1 B
Types:Instant
A:SP$ Pump | Cost$ 1 B | ValidTgts$ Creature | TgtPrompt$ Choose target creature | NumAtt$ +2 | SubAbility$ DBAnimate | SpellDescription$ Until end of turn, target creature gets +2/+0 and gains "When this creature dies, return it to the battlefield under its owner's control." | StackDescription$ Spelldescription
SVar:DBAnimate:DB$ Animate | Triggers$ TrigDies | sVars$ TrigReturn | Defined$ ParentTarget | StackDescription$ None
-SVar:TrigDies:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigReturn | TriggerDescription$ When CARDNAME dies, return it to the battlefield under its owner’s control.
+SVar:TrigDies:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigReturn | TriggerDescription$ When CARDNAME dies, return it to the battlefield under its owner's control.
SVar:TrigReturn:DB$ ChangeZone | DB$ ChangeZone | Defined$ TriggeredNewCardLKICopy | Origin$ Graveyard | Destination$ Battlefield
Oracle:Until end of turn, target creature gets +2/+0 and gains "When this creature dies, return it to the battlefield under its owner's control."
diff --git a/forge-gui/res/cardsfolder/d/denied.txt b/forge-gui/res/cardsfolder/d/denied.txt
index b333e46071e..53579920048 100644
--- a/forge-gui/res/cardsfolder/d/denied.txt
+++ b/forge-gui/res/cardsfolder/d/denied.txt
@@ -3,7 +3,7 @@ ManaCost:U
Types:Instant
A:SP$ NameCard | Defined$ You | AILogic$ MostProminentInHumanDeck | SubAbility$ DBTarget | SpellDescription$ Choose a card name,
SVar:DBTarget:DB$ Pump | TargetType$ Spell | ValidTgts$ Card | TgtZone$ Stack | SubAbility$ DBRevealHand | SpellDescription$ None
-SVar:DBRevealHand:DB$ RevealHand | Defined$ TargetedController | RememberRevealed$ True | SubAbility$ DBCounter | SpellDescription$ then target spell’s controller reveals their hand.
+SVar:DBRevealHand:DB$ RevealHand | Defined$ TargetedController | RememberRevealed$ True | SubAbility$ DBCounter | SpellDescription$ then target spell's controller reveals their hand.
SVar:DBCounter:DB$ Counter | Defined$ Targeted | ConditionDefined$ Remembered | ConditionPresent$ Card.NamedCard | ConditionCompare$ GE1 | SubAbility$ DBCleanup | SpellDescription$ If a card with the chosen name is revealed this way, counter that spell.
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
Oracle:Choose a card name, then target spell's controller reveals their hand. If a card with the chosen name is revealed this way, counter that spell.
diff --git a/forge-gui/res/cardsfolder/d/dermotaxi.txt b/forge-gui/res/cardsfolder/d/dermotaxi.txt
index ad4adef998b..673f5bc758a 100644
--- a/forge-gui/res/cardsfolder/d/dermotaxi.txt
+++ b/forge-gui/res/cardsfolder/d/dermotaxi.txt
@@ -4,6 +4,6 @@ Types:Artifact Vehicle
PT:0/0
K:ETBReplacement:Other:Imprint
SVar:Imprint:DB$ ChangeZone | Imprint$ True | ChangeType$ Creature | ChangeNum$ 1 | Origin$ Graveyard | Destination$ Exile | Mandatory$ True | Hidden$ True | Chooser$ You | SpellDescription$ Imprint - As CARDNAME enters the battlefield, exile a creature card from a graveyard.
-A:AB$ Clone | Cost$ tapXType<2/Creature> | Defined$ Imprinted | Duration$ UntilEndOfTurn | ImprintRememberedNoCleanup$ True | AddTypes$ Vehicle & Artifact | StackDescription$ Until end of turn, CARDNAME becomes a copy of {c:Imprinted}, except it’s a Vehicle artifact in addition to its other types. | SpellDescription$ Until end of turn, CARDNAME becomes a copy of the exiled card, except it's a Vehicle artifact in addition to its other types.
+A:AB$ Clone | Cost$ tapXType<2/Creature> | Defined$ Imprinted | Duration$ UntilEndOfTurn | ImprintRememberedNoCleanup$ True | AddTypes$ Vehicle & Artifact | StackDescription$ Until end of turn, CARDNAME becomes a copy of {c:Imprinted}, except it's a Vehicle artifact in addition to its other types. | SpellDescription$ Until end of turn, CARDNAME becomes a copy of the exiled card, except it's a Vehicle artifact in addition to its other types.
SVar:NeedsToPlay:Creature.inZoneGraveyard
Oracle:Imprint — As Dermotaxi enters the battlefield, exile a creature card from a graveyard.\nTap two untapped creatures you control: Until end of turn, Dermotaxi becomes a copy of the exiled card, except it's a Vehicle artifact in addition to its other types.
diff --git a/forge-gui/res/cardsfolder/d/devastating_mastery.txt b/forge-gui/res/cardsfolder/d/devastating_mastery.txt
index 53f09afe5c9..bcf08d183da 100644
--- a/forge-gui/res/cardsfolder/d/devastating_mastery.txt
+++ b/forge-gui/res/cardsfolder/d/devastating_mastery.txt
@@ -1,8 +1,8 @@
Name:Devastating Mastery
ManaCost:2 W W W W
Types:Sorcery
-SVar:AltCost:Cost$ 2 W W | Description$ You may pay {2}{W}{W} rather than pay this spell's mana cost. | StackDescription$ If the {2}{W}{W} cost was paid, an opponent chooses up to two nonland permanents they control and returns them to their owner’s hand. Destroy all nonland permanents.
-A:SP$ Branch | BranchConditionSVar$ AltCostPaid | BranchConditionSVarCompare$ GE1 | TrueSubAbility$ OppChooses | FalseSubAbility$ DBDestroyAll | SpellDescription$ If the {2}{W}{W} cost was paid, an opponent chooses up to two nonland permanents they control and returns them to their owner’s hand. Destroy all nonland permanents.
+SVar:AltCost:Cost$ 2 W W | Description$ You may pay {2}{W}{W} rather than pay this spell's mana cost. | StackDescription$ If the {2}{W}{W} cost was paid, an opponent chooses up to two nonland permanents they control and returns them to their owner's hand. Destroy all nonland permanents.
+A:SP$ Branch | BranchConditionSVar$ AltCostPaid | BranchConditionSVarCompare$ GE1 | TrueSubAbility$ OppChooses | FalseSubAbility$ DBDestroyAll | SpellDescription$ If the {2}{W}{W} cost was paid, an opponent chooses up to two nonland permanents they control and returns them to their owner's hand. Destroy all nonland permanents.
SVar:OppChooses:DB$ ChoosePlayer | Defined$ You | Choices$ Player.Opponent | ChoiceTitle$ Choose an opponent | SubAbility$ DBChangeZone
SVar:DBChangeZone:DB$ ChangeZone | ChangeType$ Permanent.nonLand+ChosenCtrl | SelectPrompt$ Choose up to two nonland permanents you control to return to their owner's hand | Chooser$ ChosenPlayer | DefinedPlayer$ ChosenPlayer | AILogic$ Always | ChangeNum$ 2 | Hidden$ True | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBDestroyAll
SVar:DBDestroyAll:DB$ DestroyAll | ValidCards$ Permanent.nonLand
diff --git a/forge-gui/res/cardsfolder/d/diregraf_horde.txt b/forge-gui/res/cardsfolder/d/diregraf_horde.txt
index acd956f3fa5..6352c557d8d 100644
--- a/forge-gui/res/cardsfolder/d/diregraf_horde.txt
+++ b/forge-gui/res/cardsfolder/d/diregraf_horde.txt
@@ -2,10 +2,10 @@ Name:Diregraf Horde
ManaCost:4 B
Types:Creature Zombie
PT:3/4
-T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create two 2/2 black Zombie creature tokens with decayed. When you do, exile up to two target cards from graveyards. (A creature with decayed can’t block. When it attacks, sacrifice it at end of combat.)
+T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create two 2/2 black Zombie creature tokens with decayed. When you do, exile up to two target cards from graveyards. (A creature with decayed can't block. When it attacks, sacrifice it at end of combat.)
SVar:TrigToken:DB$ Token | TokenAmount$ 2 | TokenScript$ b_2_2_zombie_decayed | RememberTokens$ True | SubAbility$ DBImmediateTrigger
SVar:DBImmediateTrigger:DB$ ImmediateTrigger | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE2 | Execute$ TrigExile | SubAbility$ DBCleanup | TriggerDescription$ When you do, exile up to two target cards from graveyards.
SVar:TrigExile:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Select up to two target cards from graveyards | ValidTgts$ Card
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
DeckHas:Ability$Token & Ability$Graveyard
-Oracle:When Diregraf Horde enters the battlefield, create two 2/2 black Zombie creature tokens with decayed. When you do, exile up to two target cards from graveyards. (A creature with decayed can’t block. When it attacks, sacrifice it at end of combat.)
+Oracle:When Diregraf Horde enters the battlefield, create two 2/2 black Zombie creature tokens with decayed. When you do, exile up to two target cards from graveyards. (A creature with decayed can't block. When it attacks, sacrifice it at end of combat.)
diff --git a/forge-gui/res/cardsfolder/d/disciple_of_bolas.txt b/forge-gui/res/cardsfolder/d/disciple_of_bolas.txt
index d0fb8037c54..baf6532dd52 100644
--- a/forge-gui/res/cardsfolder/d/disciple_of_bolas.txt
+++ b/forge-gui/res/cardsfolder/d/disciple_of_bolas.txt
@@ -3,7 +3,7 @@ ManaCost:3 B
Types:Creature Human Wizard
PT:2/1
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSac | TriggerDescription$ When CARDNAME enters the battlefield, sacrifice another creature. You gain X life and draw X cards, where X is that creature's power.
-SVar:TrigSac:DB$ Sacrifice | Amount$ 1 | SacValid$ Creature.Other | RememberSacrificed$ True | Mandatory$ True | SubAbility$ GainLife
+SVar:TrigSac:DB$ Sacrifice | Amount$ 1 | SacValid$ Creature.Other | RememberSacrificed$ True | SubAbility$ GainLife
SVar:GainLife:DB$ GainLife | LifeAmount$ X | SubAbility$ DBDraw
SVar:DBDraw:DB$ Draw | NumCards$ X | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
@@ -11,5 +11,4 @@ SVar:X:RememberedLKI$CardPower
SVar:NeedsToPlay:Creature.YouCtrl
DeckHas:Ability$LifeGain
AI:RemoveDeck:All
-SVar:Picture:http://www.wizards.com/global/images/magic/general/disciple_of_bolas.jpg
Oracle:When Disciple of Bolas enters the battlefield, sacrifice another creature. You gain X life and draw X cards, where X is that creature's power.
diff --git a/forge-gui/res/cardsfolder/d/draconic_intervention.txt b/forge-gui/res/cardsfolder/d/draconic_intervention.txt
index 40146325017..c9a81d58f57 100644
--- a/forge-gui/res/cardsfolder/d/draconic_intervention.txt
+++ b/forge-gui/res/cardsfolder/d/draconic_intervention.txt
@@ -1,7 +1,7 @@
Name:Draconic Intervention
ManaCost:2 R R
Types:Sorcery
-A:SP$ DamageAll | Cost$ 2 R R ExileFromGrave<1/Instant;Sorcery> | NumDmg$ X | ValidCards$ Creature.nonDragon | RememberDamaged$ True | ReplaceDyingDefined$ Remembered | SubAbility$ DBCleanup | SpellDescription$ CARDNAME deals X damage to each non-Dragon creature, where X is the exiled card’s mana value. If a creature dealt damage this way would die this turn, exile it instead.
+A:SP$ DamageAll | Cost$ 2 R R ExileFromGrave<1/Instant;Sorcery> | NumDmg$ X | ValidCards$ Creature.nonDragon | RememberDamaged$ True | ReplaceDyingDefined$ Remembered | SubAbility$ DBCleanup | SpellDescription$ CARDNAME deals X damage to each non-Dragon creature, where X is the exiled card's mana value. If a creature dealt damage this way would die this turn, exile it instead.
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | SubAbility$ DBChange
SVar:DBChange:DB$ ChangeZone | Origin$ Stack | Destination$ Exile
SVar:X:Exiled$CardManaCost
diff --git a/forge-gui/res/cardsfolder/d/drelnoch.txt b/forge-gui/res/cardsfolder/d/drelnoch.txt
index e54c68cb025..1c810760f17 100644
--- a/forge-gui/res/cardsfolder/d/drelnoch.txt
+++ b/forge-gui/res/cardsfolder/d/drelnoch.txt
@@ -2,8 +2,8 @@ Name:Drelnoch
ManaCost:4 U
Types:Creature Yeti Mutant
PT:3/3
-T:Mode$ AttackerBlocked | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME becomes blocked, you may draw two cards.
-SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 2
+T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME becomes blocked, you may draw two cards.
+SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 2 | OptionalDecider$ You
SVar:HasAttackEffect:Blocked
SVar:Picture:http://www.wizards.com/global/images/magic/general/drelnoch.jpg
Oracle:Whenever Drelnoch becomes blocked, you may draw two cards.
diff --git a/forge-gui/res/cardsfolder/d/druid_of_purification.txt b/forge-gui/res/cardsfolder/d/druid_of_purification.txt
index 2a5a5447bf1..44efb92ec8b 100644
--- a/forge-gui/res/cardsfolder/d/druid_of_purification.txt
+++ b/forge-gui/res/cardsfolder/d/druid_of_purification.txt
@@ -2,7 +2,7 @@ Name:Druid of Purification
ManaCost:3 G
Types:Creature Human Druid
PT:2/3
-T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChoice | TriggerDescription$ When CARDNAME enters the battlefield, starting with you, each player may choose an artifact or enchantment you don’t control. Destroy each permanent chosen this way.
+T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChoice | TriggerDescription$ When CARDNAME enters the battlefield, starting with you, each player may choose an artifact or enchantment you don't control. Destroy each permanent chosen this way.
SVar:TrigChoice:DB$ RepeatEach | RepeatPlayers$ Player | StartingWithActivator$ True | RepeatSubAbility$ DBChoosePermanent | SubAbility$ DBDestroy
SVar:DBChoosePermanent:DB$ ChooseCard | Defined$ Remembered | Choices$ Artifact.YouDontCtrl,Enchantment.YouDontCtrl | Optional$ True | ChoiceTitle$ Choose an artifact or enchantment | RememberChosen$ True
SVar:DBDestroy:DB$ Destroy | Defined$ Remembered | SubAbility$ DBCleanup
diff --git a/forge-gui/res/cardsfolder/e/empty_the_laboratory.txt b/forge-gui/res/cardsfolder/e/empty_the_laboratory.txt
index 8abd999bacb..08aa3265c47 100644
--- a/forge-gui/res/cardsfolder/e/empty_the_laboratory.txt
+++ b/forge-gui/res/cardsfolder/e/empty_the_laboratory.txt
@@ -1,7 +1,7 @@
Name:Empty the Laboratory
ManaCost:X U U
Types:Sorcery
-A:SP$ Sacrifice | Defined$ You | Amount$ X | Mandatory$ True | SacValid$ Zombie | RememberSacrificed$ True | SubAbility$ DBDigUntil | StackDescription$ SpellDescription | SpellDescription$ Sacrifice X Zombies, then reveal cards from the top of your library until you reveal a number of Zombie creature cards equal to the number of Zombies sacrificed this way. Put those cards onto the battlefield and the rest on the bottom of your library in a random order.
+A:SP$ Sacrifice | Defined$ You | Amount$ X | SacValid$ Zombie | RememberSacrificed$ True | SubAbility$ DBDigUntil | StackDescription$ SpellDescription | SpellDescription$ Sacrifice X Zombies, then reveal cards from the top of your library until you reveal a number of Zombie creature cards equal to the number of Zombies sacrificed this way. Put those cards onto the battlefield and the rest on the bottom of your library in a random order.
SVar:DBDigUntil:DB$ DigUntil | Amount$ Y | Valid$ Creature.Zombie | FoundDestination$ Library | NoMoveFound$ True | ImprintFound$ True | RevealedDestination$ Library | RevealedLibraryPosition$ -1 | RevealRandomOrder$ True | SubAbility$ DBChangeZone
SVar:DBChangeZone:DB$ ChangeZone | Defined$ Imprinted | Origin$ Library | Destination$ Battlefield | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True
diff --git a/forge-gui/res/cardsfolder/e/enduring_angel_angelic_enforcer.txt b/forge-gui/res/cardsfolder/e/enduring_angel_angelic_enforcer.txt
index 9848f14e4bc..47cdb93902b 100644
--- a/forge-gui/res/cardsfolder/e/enduring_angel_angelic_enforcer.txt
+++ b/forge-gui/res/cardsfolder/e/enduring_angel_angelic_enforcer.txt
@@ -5,7 +5,7 @@ PT:3/3
K:Flying
K:Double Strike
S:Mode$ Continuous | Affected$ You | AddKeyword$ Hexproof | Description$ You have hexproof.
-R:Event$ LifeReduced | ValidPlayer$ You | Result$ LE0 | ReplaceWith$ Transform | Description$ If your life total would be reduced to 0 or less, instead transform CARDNAME and your life total becomes 3. Then if CARDNAME didn't transform this way, you lose the game.
+R:Event$ LifeReduced | ActiveZones$ Battlefield | ValidPlayer$ You | Result$ LE0 | ReplaceWith$ Transform | Description$ If your life total would be reduced to 0 or less, instead transform CARDNAME and your life total becomes 3. Then if CARDNAME didn't transform this way, you lose the game.
SVar:Transform:DB$ SetState | Defined$ Self | Mode$ Transform | RememberChanged$ True | SubAbility$ DBSetLife
SVar:DBSetLife:DB$ SetLife | Defined$ You | LifeAmount$ 3 | SubAbility$ DBLoseGame
SVar:DBLoseGame:DB$ LosesGame | Defined$ You | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ NE1 | SubAbility$ DBCleanup
diff --git a/forge-gui/res/cardsfolder/e/ethereal_grasp.txt b/forge-gui/res/cardsfolder/e/ethereal_grasp.txt
index 8dd1ae61685..3d8ec657d1a 100644
--- a/forge-gui/res/cardsfolder/e/ethereal_grasp.txt
+++ b/forge-gui/res/cardsfolder/e/ethereal_grasp.txt
@@ -1,8 +1,8 @@
Name:Ethereal Grasp
ManaCost:2 U
Types:Instant
-A:SP$ Tap | ValidTgts$ Creature | TgtPrompt$ Select target creature | IsCurse$ True | SubAbility$ DBEffect | SpellDescription$ Tap target creature. That creature perpetually gains "This creature doesn’t untap during your untap step" and "{8}: Untap this creature."
-SVar:DBEffect:DB$ Effect | StaticAbilities$ EtherealGrasp | RememberObjects$ Targeted | Name$ Ethereal Grasp's Perpetual Effect | Duration$ Permanent | StackDescription$ That creature perpetually gains "This creature doesn’t untap during your untap step" and "{8}: Untap this creature."
-SVar:EtherealGrasp:Mode$ Continuous | Affected$ Card.IsRemembered | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. | AddAbility$ Untap | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ This creature perpetually gains "This creature doesn’t untap during your untap step" and "{8}: Untap this creature."
+A:SP$ Tap | ValidTgts$ Creature | TgtPrompt$ Select target creature | IsCurse$ True | SubAbility$ DBEffect | SpellDescription$ Tap target creature. That creature perpetually gains "This creature doesn't untap during your untap step" and "{8}: Untap this creature."
+SVar:DBEffect:DB$ Effect | StaticAbilities$ EtherealGrasp | RememberObjects$ Targeted | Name$ Ethereal Grasp's Perpetual Effect | Duration$ Permanent | StackDescription$ That creature perpetually gains "This creature doesn't untap during your untap step" and "{8}: Untap this creature."
+SVar:EtherealGrasp:Mode$ Continuous | Affected$ Card.IsRemembered | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. | AddAbility$ Untap | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ This creature perpetually gains "This creature doesn't untap during your untap step" and "{8}: Untap this creature."
SVar:Untap:AB$ Untap | Cost$ 8 | Defined$ Self | SpellDescription$ Untap this creature.
-Oracle:Tap target creature. That creature perpetually gains "This creature doesn’t untap during your untap step" and "{8}: Untap this creature."
+Oracle:Tap target creature. That creature perpetually gains "This creature doesn't untap during your untap step" and "{8}: Untap this creature."
diff --git a/forge-gui/res/cardsfolder/f/fell_the_mighty.txt b/forge-gui/res/cardsfolder/f/fell_the_mighty.txt
index 8c2dd879193..895019acc70 100644
--- a/forge-gui/res/cardsfolder/f/fell_the_mighty.txt
+++ b/forge-gui/res/cardsfolder/f/fell_the_mighty.txt
@@ -1,9 +1,7 @@
Name:Fell the Mighty
ManaCost:4 W
Types:Sorcery
-A:SP$ Pump | Cost$ 4 W | ValidTgts$ Creature | StackDescription$ None | SubAbility$ DBDestroy | AILogic$ FellTheMighty | SpellDescription$ Destroy all creatures with power greater than target creature's power.
-SVar:DBDestroy:DB$ DestroyAll | ValidCards$ Creature.powerGTX
-SVar:X:ParentTargeted$CardPower
-AI:RemoveDeck:All
+A:SP$ DestroyAll | ValidCards$ Creature.powerGTX | Cost$ 4 W | ValidTgts$ Creature | AILogic$ FellTheMighty | SpellDescription$ Destroy all creatures with power greater than target creature's power.
+SVar:X:Targeted$CardPower
SVar:Picture:http://www.wizards.com/global/images/magic/general/fell_the_mighty.jpg
Oracle:Destroy all creatures with power greater than target creature's power.
diff --git a/forge-gui/res/cardsfolder/f/forgotten_creation.txt b/forge-gui/res/cardsfolder/f/forgotten_creation.txt
index eeffab34563..4f1e7576e18 100644
--- a/forge-gui/res/cardsfolder/f/forgotten_creation.txt
+++ b/forge-gui/res/cardsfolder/f/forgotten_creation.txt
@@ -4,10 +4,8 @@ Types:Creature Zombie Horror
PT:3/3
K:Skulk
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigDiscard | OptionalDecider$ You | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, you may discard all the cards in your hand. If you do, draw that many cards.
-SVar:TrigDiscard:DB$ Discard | Mode$ Hand | RememberDiscarded$ True | SubAbility$ DBDraw
-SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ X | SubAbility$ DBCleanup
-SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
-SVar:X:Remembered$Amount
+SVar:TrigDiscard:AB$ Draw | Cost$ Discard<1/Hand> | NumCards$ X
+SVar:X:Discarded$Amount
DeckHas:Ability$Discard
DeckHints:Keyword$Madness & Ability$Delirium
SVar:Picture:http://www.wizards.com/global/images/magic/general/forgotten_creation.jpg
diff --git a/forge-gui/res/cardsfolder/f/forgotten_harvest.txt b/forge-gui/res/cardsfolder/f/forgotten_harvest.txt
index 4e3561072bb..0d678b55637 100644
--- a/forge-gui/res/cardsfolder/f/forgotten_harvest.txt
+++ b/forge-gui/res/cardsfolder/f/forgotten_harvest.txt
@@ -2,6 +2,6 @@ Name:Forgotten Harvest
ManaCost:1 G
Types:Enchantment
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, you may exile a land card from your graveyard. If you do, put a +1/+1 counter on target creature.
-SVar:TrigPutCounter:AB$PutCounter | Cost$ ExileFromGrave<1/Land> | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1
+SVar:TrigPutCounter:AB$ PutCounter | Cost$ ExileFromGrave<1/Land> | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1
SVar:Picture:http://www.wizards.com/global/images/magic/general/forgotten_harvest.jpg
Oracle:At the beginning of your upkeep, you may exile a land card from your graveyard. If you do, put a +1/+1 counter on target creature.
diff --git a/forge-gui/res/cardsfolder/g/garruk_relentless_garruk_the_veil_cursed.txt b/forge-gui/res/cardsfolder/g/garruk_relentless_garruk_the_veil_cursed.txt
index 40d82ab2212..96e3550c635 100644
--- a/forge-gui/res/cardsfolder/g/garruk_relentless_garruk_the_veil_cursed.txt
+++ b/forge-gui/res/cardsfolder/g/garruk_relentless_garruk_the_veil_cursed.txt
@@ -20,10 +20,8 @@ Colors:green,black
Types:Legendary Planeswalker Garruk
Loyalty:3
A:AB$ Token | Cost$ AddCounter<1/LOYALTY> | TokenAmount$ 1 | TokenScript$ b_1_1_wolf_deathtouch | LegacyImage$ b 1 1 wolf deathtouch isd | TokenOwner$ You | Planeswalker$ True | SpellDescription$ Create a 1/1 black Wolf creature token with deathtouch.
-A:AB$ Sacrifice | Cost$ SubCounter<1/LOYALTY> | Defined$ You | SacValid$ Creature | SacMessage$ Creature | SubAbility$ DBSearch | Planeswalker$ True | RememberSacrificed$ True | SpellDescription$ Sacrifice a creature. If you do, search your library for a creature card, reveal it, put it into your hand, then shuffle.
+A:AB$ ChangeZone | Cost$ SubCounter<1/LOYALTY> | UnlessCost$ Sac<1/Creature> | UnlessSwitched$ True | UnlessPayer$ You | Origin$ Library | Destination$ Hand | ChangeType$ Creature | ChangeNum$ 1 | Planeswalker$ True | SpellDescription$ Sacrifice a creature. If you do, search your library for a creature card, reveal it, put it into your hand, then shuffle.
A:AB$ PumpAll | Cost$ SubCounter<3/LOYALTY> | ValidCards$ Creature.YouCtrl | KW$ Trample | NumAtt$ X | NumDef$ X | Planeswalker$ True | Ultimate$ True | SpellDescription$ Creatures you control gain trample and get +X/+X until end of turn, where X is the number of creature cards in your graveyard.
SVar:X:Count$TypeInYourYard.Creature
-SVar:DBSearch:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Creature | ChangeNum$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ EQ1 | SubAbility$ DBCleanup
-SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:Picture:http://www.wizards.com/global/images/magic/general/garruk_the_veil_cursed.jpg
Oracle:[+1]: Create a 1/1 black Wolf creature token with deathtouch.\n[−1]: Sacrifice a creature. If you do, search your library for a creature card, reveal it, put it into your hand, then shuffle.\n[−3]: Creatures you control gain trample and get +X/+X until end of turn, where X is the number of creature cards in your graveyard.
diff --git a/forge-gui/res/cardsfolder/g/geometric_weird.txt b/forge-gui/res/cardsfolder/g/geometric_weird.txt
index caa56ecb041..abe601334b1 100644
--- a/forge-gui/res/cardsfolder/g/geometric_weird.txt
+++ b/forge-gui/res/cardsfolder/g/geometric_weird.txt
@@ -3,6 +3,6 @@ ManaCost:R
Types:Creature Weird
PT:1/1
SVar:X:Count$MaxDistinctOnStack
-T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | Execute$ TrigGeo | OptionalDecider$ You | TriggerDescription$ At the beginning of each end step, you may have Geometric Weird’s base power and toughness each become equal to the greatest number of spells and abilities from different sources that were on the stack simultaneously that turn.
-SVar:TrigGeo:DB$ Animate | Duration$ Permanent | Power$ X | Toughness$ X | Geometric Weird’s base power and toughness each become equal to the greatest number of spells and abilities from different sources that were on the stack simultaneously that turn.
+T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | Execute$ TrigGeo | OptionalDecider$ You | TriggerDescription$ At the beginning of each end step, you may have Geometric Weird's base power and toughness each become equal to the greatest number of spells and abilities from different sources that were on the stack simultaneously that turn.
+SVar:TrigGeo:DB$ Animate | Duration$ Permanent | Power$ X | Toughness$ X | Geometric Weird's base power and toughness each become equal to the greatest number of spells and abilities from different sources that were on the stack simultaneously that turn.
Oracle:At the beginning of each end step, you may have Geometric Weird's base power and toughness each become equal to the greatest number of spells and abilities from different sources that were on the stack simultaneously that turn.
diff --git a/forge-gui/res/cardsfolder/h/haakon_stromgald_scourge_avatar.txt b/forge-gui/res/cardsfolder/h/haakon_stromgald_scourge_avatar.txt
index b3e6706b96f..12d751d53fd 100644
--- a/forge-gui/res/cardsfolder/h/haakon_stromgald_scourge_avatar.txt
+++ b/forge-gui/res/cardsfolder/h/haakon_stromgald_scourge_avatar.txt
@@ -4,9 +4,8 @@ Types:Vanguard
HandLifeModifier:+0/-3
A:AB$ Effect | ActivationZone$ Command | Cost$ PayLife<1> | TgtZone$ Graveyard | ValidTgts$ Creature.YouOwn | PumpZone$ Graveyard | TgtPrompt$ Select target creature in your graveyard, you may play it this turn | RememberObjects$ Targeted | StaticAbilities$ Play | ExileOnMoved$ Graveyard | SpellDescription$ You may cast target creature card in your graveyard this turn.
SVar:Play:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Graveyard | Description$ You may play remembered card.
-T:Mode$ SpellCast | ValidCard$ Card.wasCastFromGraveyard | ValidControllingPlayer$ You | TriggerZones$ Command | Execute$ TrigAnimate | TriggerDescription$ Whenever you cast a creature spell from your graveyard, it becomes a black Zombie Knight.
+T:Mode$ SpellCast | ValidCard$ Creature.wasCastFromGraveyard | ValidControllingPlayer$ You | TriggerZones$ Command | Execute$ TrigAnimate | TriggerDescription$ Whenever you cast a creature spell from your graveyard, it becomes a black Zombie Knight.
SVar:TrigAnimate:DB$ Animate | Defined$ TriggeredCard | Types$ Zombie,Knight | Colors$ Black | OverwriteColors$ True | Duration$ Permanent | RemoveCreatureTypes$ True
R:Event$ Moved | ValidCard$ Card.Zombie+Knight | Destination$ Graveyard | ReplaceWith$ DBExile | Description$ If a Zombie Knight would be put into your graveyard from the battlefield, exile it instead.
SVar:DBExile:DB$ ChangeZone | Defined$ ReplacedCard | Origin$ Battlefield | Destination$ Exile
-SVar:Picture:https://downloads.cardforge.org/images/cards/VAN/Haakon, Stromgald Scourge Avatar.full.jpg
Oracle:Hand +0, life -3\nPay 1 life: You may cast target creature card in your graveyard this turn.\nWhenever you cast a creature spell from your graveyard, it becomes a black Zombie Knight.\nIf a Zombie Knight would be put into your graveyard from the battlefield, exile it instead.
diff --git a/forge-gui/res/cardsfolder/i/incendiary_flow.txt b/forge-gui/res/cardsfolder/i/incendiary_flow.txt
index 4bf978d15d7..56e9d89aaf0 100644
--- a/forge-gui/res/cardsfolder/i/incendiary_flow.txt
+++ b/forge-gui/res/cardsfolder/i/incendiary_flow.txt
@@ -1,7 +1,6 @@
Name:Incendiary Flow
ManaCost:1 R
Types:Sorcery
-A:SP$ DealDamage | Cost$ 1 R | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 3 | RememberDamaged$ True | ReplaceDyingDefined$ Remembered | SubAbility$ DBCleanup | SpellDescription$ CARDNAME deals 3 damage to any target. If a creature dealt damage this way would die this turn, exile it instead.
+A:SP$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 3 | RememberDamaged$ True | ReplaceDyingDefined$ Remembered.Creature | SubAbility$ DBCleanup | SpellDescription$ CARDNAME deals 3 damage to any target. If a creature dealt damage this way would die this turn, exile it instead.
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
-SVar:Picture:http://www.wizards.com/global/images/magic/general/incendiary_flow.jpg
-Oracle:Incendiary Flow deals 3 damage to any target. If a creature dealt damage this way would die this turn, exile it instead.
+Oracle:Incendiary Flow deals 3 damage to any target. If a creature dealt damage this way would die this turn, exile it instead.
diff --git a/forge-gui/res/cardsfolder/i/indentured_djinn.txt b/forge-gui/res/cardsfolder/i/indentured_djinn.txt
index b3423955874..53bbc95fb83 100644
--- a/forge-gui/res/cardsfolder/i/indentured_djinn.txt
+++ b/forge-gui/res/cardsfolder/i/indentured_djinn.txt
@@ -4,7 +4,5 @@ Types:Creature Djinn
PT:4/4
K:Flying
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, each other player may draw up to three cards.
-SVar:TrigDraw:DB$ RepeatEach | RepeatPlayers$ Player.Other | RepeatSubAbility$ DBDraw
-SVar:DBDraw:DB$ Draw | Defined$ Player.IsRemembered | NumCards$ 3 | Upto$ True
-SVar:Picture:http://www.wizards.com/global/images/magic/general/indentured_djinn.jpg
+SVar:TrigDraw:DB$ Draw | Defined$ Player.Other | NumCards$ 3 | Upto$ True | AILogic$ OptionalDraw
Oracle:Flying\nWhen Indentured Djinn enters the battlefield, each other player may draw up to three cards.
diff --git a/forge-gui/res/cardsfolder/i/infiltration_lens.txt b/forge-gui/res/cardsfolder/i/infiltration_lens.txt
index 9cde810c01c..853b5962b57 100644
--- a/forge-gui/res/cardsfolder/i/infiltration_lens.txt
+++ b/forge-gui/res/cardsfolder/i/infiltration_lens.txt
@@ -2,7 +2,7 @@ Name:Infiltration Lens
ManaCost:1
Types:Artifact Equipment
K:Equip:1
-T:Mode$ AttackerBlockedByCreature | ValidCard$ Card.AttachedBy | ValidBlocker$ Creature | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ Whenever equipped creature becomes blocked by a creature, you may draw two cards.
-SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 2
+T:Mode$ AttackerBlockedByCreature | ValidCard$ Card.AttachedBy | ValidBlocker$ Creature | Execute$ TrigDraw | TriggerDescription$ Whenever equipped creature becomes blocked by a creature, you may draw two cards.
+SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 2 | OptionalDecider$ You
SVar:Picture:http://www.wizards.com/global/images/magic/general/infiltration_lens.jpg
Oracle:Whenever equipped creature becomes blocked by a creature, you may draw two cards.\nEquip {1}
diff --git a/forge-gui/res/cardsfolder/i/ingenious_mastery.txt b/forge-gui/res/cardsfolder/i/ingenious_mastery.txt
index c983712e8f1..988ef1be924 100644
--- a/forge-gui/res/cardsfolder/i/ingenious_mastery.txt
+++ b/forge-gui/res/cardsfolder/i/ingenious_mastery.txt
@@ -1,7 +1,7 @@
Name:Ingenious Mastery
ManaCost:X 2 U
Types:Sorcery
-SVar:AltCost:Cost$ 2 U | Description$ You may pay {2}{U} rather than pay this spell's mana cost. | StackDescription$ If the {2}{U} cost was paid, you draw three cards, then an opponent creates two Treasure tokens and they scry 2. If that cost wasn’t paid, you draw X cards.
+SVar:AltCost:Cost$ 2 U | Description$ You may pay {2}{U} rather than pay this spell's mana cost. | StackDescription$ If the {2}{U} cost was paid, you draw three cards, then an opponent creates two Treasure tokens and they scry 2. If that cost wasn't paid, you draw X cards.
A:SP$ Branch | BranchConditionSVar$ AltCostPaid | BranchConditionSVarCompare$ GE1 | TrueSubAbility$ DBAltCostEffect | FalseSubAbility$ DBDrawX
SVar:DBAltCostEffect:DB$ Draw | Defined$ You | NumCards$ 3 | SubAbility$ OppTreasureScry
SVar:OppTreasureScry:DB$ ChoosePlayer | Defined$ You | Choices$ Player.Opponent | ChoiceTitle$ Choose an opponent to create treasure tokens and scry 2 | SubAbility$ OppTreasure
diff --git a/forge-gui/res/cardsfolder/j/jack_o_lantern.txt b/forge-gui/res/cardsfolder/j/jack_o_lantern.txt
index ee9f8ff2572..36bbe22780f 100644
--- a/forge-gui/res/cardsfolder/j/jack_o_lantern.txt
+++ b/forge-gui/res/cardsfolder/j/jack_o_lantern.txt
@@ -5,4 +5,4 @@ A:AB$ ChangeZone | Cost$ 1 T Sac<1/CARDNAME> | Origin$ Graveyard | Destination$
SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1
A:AB$ Mana | Cost$ 1 ExileFromGrave<1/CARDNAME> | ActivationZone$ Graveyard | Produced$ Any | SpellDescription$ Add one mana of any color.
AI:RemoveDeck:Random
-Oracle:{1}, {T}, Sacrifice Jack-o’-Lantern: Exile up to one target card from a graveyard. Draw a card.\n{1}, Exile Jack-o’-Lantern from your graveyard: Add one mana of any color.
+Oracle:{1}, {T}, Sacrifice Jack-o'-Lantern: Exile up to one target card from a graveyard. Draw a card.\n{1}, Exile Jack-o'-Lantern from your graveyard: Add one mana of any color.
diff --git a/forge-gui/res/cardsfolder/j/jadzi_oracle_of_arcavios_journey_to_the_oracle.txt b/forge-gui/res/cardsfolder/j/jadzi_oracle_of_arcavios_journey_to_the_oracle.txt
index 0cf3609e07d..69f8e3f49d9 100644
--- a/forge-gui/res/cardsfolder/j/jadzi_oracle_of_arcavios_journey_to_the_oracle.txt
+++ b/forge-gui/res/cardsfolder/j/jadzi_oracle_of_arcavios_journey_to_the_oracle.txt
@@ -19,10 +19,8 @@ ALTERNATE
Name:Journey to the Oracle
ManaCost:2 G G
Types:Sorcery
-A:SP$ ChangeZone | Origin$ Hand | Destination$ Battlefield | ChangeType$ Land | ChangeNum$ X | SubAbility$ DBDiscard | StackDescription$ {p:You} put any number of land cards from your hand onto the battlefield. | SpellDescription$ You may put any number of land cards from your hand onto the battlefield.
-SVar:DBDiscard:DB$ Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose | RememberDiscarded$ True | SubAbility$ DBBounce | ConditionPresent$ Land.YouCtrl | ConditionCompare$ GE8 | Optional$ True | StackDescription$ Then if {p:You} controls eight or more lands, they may discard a card. | SpellDescription$ Then if you control eight or more lands, you may discard a card.
-SVar:DBBounce:DB$ ChangeZone | Defined$ Self | Origin$ Stack | Destination$ Hand | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup | StackDescription$ If {p:You} does, return CARDNAME to its owner's hand. | SpellDescription$ If you do, return CARDNAME to its owner's hand.
-SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
+A:SP$ ChangeZone | Origin$ Hand | Destination$ Battlefield | ChangeType$ Land | ChangeNum$ X | SubAbility$ DBBounce | StackDescription$ {p:You} puts any number of land cards from your hand onto the battlefield. | SpellDescription$ You may put any number of land cards from your hand onto the battlefield.
+SVar:DBBounce:DB$ ChangeZone | Defined$ Self | Origin$ Stack | Destination$ Hand | UnlessCost$ Discard<1/Card> | UnlessSwitched$ True | UnlessPayer$ You | ConditionPresent$ Land.YouCtrl | ConditionCompare$ GE8 | StackDescription$ Then if {p:You} controls eight or more lands, they may discard a card. If {p:You} does, return CARDNAME to its owner's hand. | SpellDescription$ Then if you control eight or more lands, you may discard a card. If you do, return CARDNAME to its owner's hand.
SVar:X:Count$ValidHand Land.YouCtrl
DeckHas:Ability$Discard
SVar:NeedsToPlayVar:X GE2
diff --git a/forge-gui/res/cardsfolder/j/jared_carthalion_true_heir.txt b/forge-gui/res/cardsfolder/j/jared_carthalion_true_heir.txt
index 1b1a557688d..9e0ab8279a5 100644
--- a/forge-gui/res/cardsfolder/j/jared_carthalion_true_heir.txt
+++ b/forge-gui/res/cardsfolder/j/jared_carthalion_true_heir.txt
@@ -4,7 +4,7 @@ Types:Legendary Creature Human Warrior
PT:3/3
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigMonarch | TriggerDescription$ When CARDNAME enters the battlefield, target opponent becomes the monarch. You can't become the monarch this turn.
SVar:TrigMonarch:DB$ BecomeMonarch | ValidTgts$ Opponent | SubAbility$ DBPump
-SVar:DBPump:DB$ Pump | Defined$ You | KW$ You can’t become the monarch this turn.
+SVar:DBPump:DB$ Pump | Defined$ You | KW$ You can't become the monarch this turn.
R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Card.Self | CheckDefinedPlayer$ You.isMonarch | ReplaceWith$ Counters | PreventionEffect$ True | AlwaysReplace$ True | Description$ If damage would be dealt to NICKNAME while you're the monarch, prevent that damage and put that many +1/+1 counters on it.
SVar:Counters:DB$ PutCounter | Defined$ ReplacedTarget | CounterType$ P1P1 | CounterNum$ Y
SVar:Y:ReplaceCount$DamageAmount
diff --git a/forge-gui/res/cardsfolder/j/jeska_thrice_reborn.txt b/forge-gui/res/cardsfolder/j/jeska_thrice_reborn.txt
index 6d32e393534..43ba325fae7 100644
--- a/forge-gui/res/cardsfolder/j/jeska_thrice_reborn.txt
+++ b/forge-gui/res/cardsfolder/j/jeska_thrice_reborn.txt
@@ -2,7 +2,7 @@ Name:Jeska, Thrice Reborn
ManaCost:2 R
Types:Legendary Planeswalker Jeska
Loyalty:0
-K:etbCounter:LOYALTY:Y:no Condition:CARDNAME enters the battlefield with a loyalty counter on her for each time you’ve cast a commander from the command zone this game.
+K:etbCounter:LOYALTY:Y:no Condition:CARDNAME enters the battlefield with a loyalty counter on her for each time you've cast a commander from the command zone this game.
SVar:Y:Count$TotalCommanderCastFromCommandZone
A:AB$ Effect | Cost$ AddCounter<0/LOYALTY> | Planeswalker$ True | Duration$ UntilYourNextTurn | ValidTgts$ Creature | TgtPrompt$ Choose target creature | AILogic$ Pump | RememberObjects$ Targeted | ReplacementEffects$ TripleCombatDamage | SpellDescription$ Choose target creature. Until your next turn, if that creature would deal combat damage to one of your opponents, it deals triple that damage to that player instead.
SVar:TripleCombatDamage:Event$ DamageDone | ValidSource$ Creature.IsRemembered | IsCombat$ True | ValidTarget$ Player.Opponent | ReplaceWith$ DmgTriple | Description$ Choose target creature. Until your next turn, if that creature would deal combat damage to one of your opponents, it deals triple that damage to that player instead.
diff --git a/forge-gui/res/cardsfolder/k/kaldra_compleat.txt b/forge-gui/res/cardsfolder/k/kaldra_compleat.txt
index 8f2413724e8..f638039f737 100644
--- a/forge-gui/res/cardsfolder/k/kaldra_compleat.txt
+++ b/forge-gui/res/cardsfolder/k/kaldra_compleat.txt
@@ -4,7 +4,7 @@ Types:Legendary Artifact Equipment
K:Living Weapon
K:Indestructible
S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 5 | AddToughness$ 5 | AddKeyword$ First Strike & Trample & Indestructible & Haste | AddTrigger$ TrigDamageDone | Description$ Equipped creature gets +5/+5 and has first strike, trample, indestructible, haste, and "Whenever this creature deals combat damage to a creature, exile that creature."
-SVar:TrigDamageDone:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Creature | Execute$ TrigChangeZone | TriggerDescription$ Whenever this creature deals combat damage to a creature, exile that creature.
+SVar:TrigDamageDone:Mode$ DamageDone | CombatDamage$ True | ValidSource$ Card.Self | ValidTarget$ Creature | Execute$ TrigChangeZone | TriggerDescription$ Whenever this creature deals combat damage to a creature, exile that creature.
SVar:TrigChangeZone:DB$ ChangeZone | Defined$ TriggeredTarget | Origin$ Battlefield | Destination$ Exile
K:Equip:7
Oracle:Living weapon\nIndestructible\nEquipped creature gets +5/+5 and has first strike, trample, indestructible, haste, and "Whenever this creature deals combat damage to a creature, exile that creature."\nEquip {7}
diff --git a/forge-gui/res/cardsfolder/k/kamahls_will.txt b/forge-gui/res/cardsfolder/k/kamahls_will.txt
index 83cf67dbc62..c33273146c0 100644
--- a/forge-gui/res/cardsfolder/k/kamahls_will.txt
+++ b/forge-gui/res/cardsfolder/k/kamahls_will.txt
@@ -4,7 +4,7 @@ Types:Instant
A:SP$ Charm | Cost$ 3 G | MinCharmNum$ 1 | CharmNum$ X | Choices$ DBAnimate,DBGangUp | AdditionalDescription$ If you control a commander as you cast this spell, you may choose both.
SVar:DBAnimate:DB$ Animate | ValidTgts$ Land.YouCtrl | TgtPrompt$ Select any number of target lands you control | TargetMin$ 0 | TargetMax$ MaxTargets | Power$ 1 | Toughness$ 1 | Types$ Elemental,Creature | Keywords$ Vigilance & Indestructible & Haste | SpellDescription$ Until end of turn, any number of target lands you control become 1/1 Elemental creatures with vigilance, indestructible, and haste. They're still lands.
SVar:DBGangUp:DB$ Pump | ValidTgts$ Creature.YouDontCtrl | TgtPrompt$ Choose target creature you don't control | ImprintCards$ Targeted | SubAbility$ DBRepeatEach
-SVar:DBRepeatEach:DB$ RepeatEach | RepeatCards$ Creature.YouCtrl | RepeatSubAbility$ DBDamage | DamageMap$ True | SubAbility$ DBCleanup | SpellDescription$ Choose target creature you don’t control. Each creature you control deals damage equal to its power to that creature.
+SVar:DBRepeatEach:DB$ RepeatEach | RepeatCards$ Creature.YouCtrl | RepeatSubAbility$ DBDamage | DamageMap$ True | SubAbility$ DBCleanup | SpellDescription$ Choose target creature you don't control. Each creature you control deals damage equal to its power to that creature.
SVar:DBDamage:DB$ DealDamage | Defined$ Imprinted | DamageSource$ Remembered | NumDmg$ Z
SVar:DBCleanup:DB$ Cleanup | ClearImprinted$ True
SVar:X:Count$Compare Y GE1.2.1
diff --git a/forge-gui/res/cardsfolder/k/krydle_of_baldurs_gate.txt b/forge-gui/res/cardsfolder/k/krydle_of_baldurs_gate.txt
index 261cd608246..bfa38581bc3 100644
--- a/forge-gui/res/cardsfolder/k/krydle_of_baldurs_gate.txt
+++ b/forge-gui/res/cardsfolder/k/krydle_of_baldurs_gate.txt
@@ -7,7 +7,7 @@ SVar:TrigLoseLife:DB$ LoseLife | Defined$ TriggeredTarget | LifeAmount$ 1 | SubA
SVar:DBMill:DB$ Mill | Defined$ TriggeredTarget | NumCards$ 1 | SubAbility$ DBGainLife
SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 | SubAbility$ DBScry
SVar:DBScry:DB$ Scry | Defined$ You | ScryNum$ 1
-T:Mode$ AttackersDeclared | AttackingPlayer$ You | OptionalDecider$ You | Execute$ TrigPump | TriggerZones$ Battlefield | TriggerDescription$ Whenever you attack, you may pay {2}. If you do, target creature can’t be blocked this turn.
+T:Mode$ AttackersDeclared | AttackingPlayer$ You | OptionalDecider$ You | Execute$ TrigPump | TriggerZones$ Battlefield | TriggerDescription$ Whenever you attack, you may pay {2}. If you do, target creature can't be blocked this turn.
SVar:TrigPump:AB$ Pump | Cost$ 2 | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN Unblockable
DeckHas:Ability$LifeGain
Oracle:Whenever Krydle of Baldur's Gate deals combat damage to a player, that player loses 1 life and mills a card, then you gain 1 life and scry 1.\nWhenever you attack, you may pay {2}. If you do, target creature can't be blocked this turn.
diff --git a/forge-gui/res/cardsfolder/l/lava_burst.txt b/forge-gui/res/cardsfolder/l/lava_burst.txt
index 621bf41b760..9cc52620eb1 100644
--- a/forge-gui/res/cardsfolder/l/lava_burst.txt
+++ b/forge-gui/res/cardsfolder/l/lava_burst.txt
@@ -2,6 +2,6 @@ Name:Lava Burst
ManaCost:X R
Types:Sorcery
A:SP$ DealDamage | Cost$ X R | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | ConditionDefined$ Targeted | ConditionPresent$ Creature | ConditionCompare$ EQ0 | SubAbility$ CreatureDmg | SpellDescription$ CARDNAME deals X damage to any target. If CARDNAME would deal damage to a creature, that damage can't be prevented or dealt instead to another permanent or player.
-SVar:CreatureDmg:DB$ DealDamage | Defined$ Targeted | NumDmg$ X | NoPrevention$ True | NoRedirection$ True | ConditionDefined$ Targeted | ConditionPresent$ Creature | ConditionCompare$ EQ1 | StackDescription$ If CARDNAME would deal damage to a creature, that damage can’t be prevented or dealt instead to another permanent or player.
+SVar:CreatureDmg:DB$ DealDamage | Defined$ Targeted | NumDmg$ X | NoPrevention$ True | NoRedirection$ True | ConditionDefined$ Targeted | ConditionPresent$ Creature | ConditionCompare$ EQ1 | StackDescription$ If CARDNAME would deal damage to a creature, that damage can't be prevented or dealt instead to another permanent or player.
SVar:X:Count$xPaid
Oracle:Lava Burst deals X damage to any target. If Lava Burst would deal damage to a creature, that damage can't be prevented or dealt instead to another permanent or player.
diff --git a/forge-gui/res/cardsfolder/l/leovold_emissary_of_trest.txt b/forge-gui/res/cardsfolder/l/leovold_emissary_of_trest.txt
index 8071a3f4372..47d94aa88b3 100644
--- a/forge-gui/res/cardsfolder/l/leovold_emissary_of_trest.txt
+++ b/forge-gui/res/cardsfolder/l/leovold_emissary_of_trest.txt
@@ -2,8 +2,7 @@ Name:Leovold, Emissary of Trest
ManaCost:B G U
Types:Legendary Creature Elf Advisor
PT:3/3
-S:Mode$ Continuous | Affected$ Opponent | AddKeyword$ You can't draw more than one card each turn. | Description$ Each opponent can't draw more than one card each turn.
+S:Mode$ CantDraw | ValidPlayer$ Opponent | DrawLimit$ 1 | Description$ Each opponent can't draw more than one card each turn.
T:Mode$ BecomesTarget | ValidTarget$ You,Permanent.YouCtrl+inZoneBattlefield | ValidSource$ Card.OppCtrl | TriggerZones$ Battlefield | Execute$ TrigDraw | OptionalDecider$ You | TriggerDescription$ Whenever you or a permanent you control becomes the target of a spell or ability an opponent controls, you may draw a card.
SVar:TrigDraw:DB$ Draw | NumCards$ 1 | SpellDescription$ Draw a card.
-SVar:Picture:http://www.wizards.com/global/images/magic/general/leovold_emissary_of_trest.jpg
Oracle:Each opponent can't draw more than one card each turn.\nWhenever you or a permanent you control becomes the target of a spell or ability an opponent controls, you may draw a card.
\ No newline at end of file
diff --git a/forge-gui/res/cardsfolder/l/ludevic_necrogenius_olag_ludevics_hubris.txt b/forge-gui/res/cardsfolder/l/ludevic_necrogenius_olag_ludevics_hubris.txt
index 79cf53f9997..2439a429249 100644
--- a/forge-gui/res/cardsfolder/l/ludevic_necrogenius_olag_ludevics_hubris.txt
+++ b/forge-gui/res/cardsfolder/l/ludevic_necrogenius_olag_ludevics_hubris.txt
@@ -19,7 +19,7 @@ ManaCost:no cost
Colors:blue,black
Types:Legendary Creature Zombie
PT:4/4
-R:Event$ Transform | ValidCard$ Card.Self | ReplaceWith$ Copy | Description$ As this creature transforms into CARDNAME, it becomes a copy of a creature card exiled with it, except its name is Olag, Ludevic’s Hubris, it's 4/4, and it's a legendary blue and black Zombie in addition to its other colors and types. Put a number of +1/+1 counters on NICKNAME equal to the number of creature cards exiled with it.
+R:Event$ Transform | ValidCard$ Card.Self | ReplaceWith$ Copy | Description$ As this creature transforms into CARDNAME, it becomes a copy of a creature card exiled with it, except its name is Olag, Ludevic's Hubris, it's 4/4, and it's a legendary blue and black Zombie in addition to its other colors and types. Put a number of +1/+1 counters on NICKNAME equal to the number of creature cards exiled with it.
SVar:Copy:DB$ Clone | Choices$ Creature.ExiledWithSource | ChoiceZone$ Exile | NewName$ Olag, Ludevic's Hubris | SetPower$ 4 | SetToughness$ 4 | AddTypes$ Legendary & Zombie | AddColors$ Blue & Black | SubAbility$ DBPutCounter
SVar:DBPutCounter:DB$ PutCounter | CounterNum$ Y | CounterType$ P1P1
SVar:Y:Count$ValidExile Creature.ExiledWithSource
diff --git a/forge-gui/res/cardsfolder/m/malakir_rebirth_malakir_mire.txt b/forge-gui/res/cardsfolder/m/malakir_rebirth_malakir_mire.txt
index f080ec7923c..906201dae88 100644
--- a/forge-gui/res/cardsfolder/m/malakir_rebirth_malakir_mire.txt
+++ b/forge-gui/res/cardsfolder/m/malakir_rebirth_malakir_mire.txt
@@ -2,8 +2,8 @@ Name:Malakir Rebirth
ManaCost:B
Types:Instant
A:SP$ LoseLife | Cost$ B | Defined$ You | LifeAmount$ 2 | SubAbility$ DBAnimate | SpellDescription$ Choose target creature. You lose 2 life. Until end of turn, that creature gains "When this creature dies, return it to the battlefield tapped under its owner's control."
-SVar:DBAnimate:DB$ Animate | ValidTgts$ Creature | TgtPrompt$ Choose target creature | Triggers$ TrigDies | sVars$ TrigReturn | StackDescription$ Until end of turn, {c:Targeted} gains "When this creature dies, return it to the battlefield tapped under its owner’s control."
-SVar:TrigDies:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigReturn | TriggerDescription$ When CARDNAME dies, return it to the battlefield tapped under its owner’s control.
+SVar:DBAnimate:DB$ Animate | ValidTgts$ Creature | TgtPrompt$ Choose target creature | Triggers$ TrigDies | sVars$ TrigReturn | StackDescription$ Until end of turn, {c:Targeted} gains "When this creature dies, return it to the battlefield tapped under its owner's control."
+SVar:TrigDies:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigReturn | TriggerDescription$ When CARDNAME dies, return it to the battlefield tapped under its owner's control.
SVar:TrigReturn:DB$ ChangeZone | DB$ ChangeZone | Defined$ TriggeredNewCardLKICopy | Origin$ Graveyard | Destination$ Battlefield | Tapped$ True
AlternateMode:Modal
Oracle:Choose target creature. You lose 2 life. Until end of turn, that creature gains "When this creature dies, return it to the battlefield tapped under its owner's control."
diff --git a/forge-gui/res/cardsfolder/m/maralen_of_the_mornsong.txt b/forge-gui/res/cardsfolder/m/maralen_of_the_mornsong.txt
index 7bec08c7750..aa4bdc0700f 100644
--- a/forge-gui/res/cardsfolder/m/maralen_of_the_mornsong.txt
+++ b/forge-gui/res/cardsfolder/m/maralen_of_the_mornsong.txt
@@ -2,7 +2,7 @@ Name:Maralen of the Mornsong
ManaCost:1 B B
Types:Legendary Creature Elf Wizard
PT:2/3
-S:Mode$ Continuous | Affected$ Player | AddKeyword$ You can't draw cards. | Description$ Players can't draw cards.
+S:Mode$ CantDraw | ValidPlayer$ Player | Description$ Players can't draw cards.
T:Mode$ Phase | Phase$ Draw | ValidPlayer$ Player | TriggerZones$ Battlefield | Execute$ TrigDrain | TriggerDescription$ At the beginning of each player's draw step, that player loses 3 life, searches their library for a card, puts it into their hand, then shuffles.
SVar:TrigDrain:DB$ LoseLife | Defined$ TriggeredPlayer | LifeAmount$ 3 | SubAbility$ DBTutor
SVar:DBTutor:DB$ ChangeZone | DefinedPlayer$ TriggeredPlayer | Origin$ Library | Destination$ Hand | ChangeType$ Card | ChangeNum$ 1
diff --git a/forge-gui/res/cardsfolder/m/maralen_of_the_mornsong_avatar.txt b/forge-gui/res/cardsfolder/m/maralen_of_the_mornsong_avatar.txt
index 4e88d8efa89..b35fa4864a7 100644
--- a/forge-gui/res/cardsfolder/m/maralen_of_the_mornsong_avatar.txt
+++ b/forge-gui/res/cardsfolder/m/maralen_of_the_mornsong_avatar.txt
@@ -6,10 +6,9 @@ T:Mode$ NewGame | Execute$ TrigPayLife | TriggerZones$ Command | TriggerDescript
SVar:TrigPayLife:AB$ StoreSVar | Cost$ PayLife | SVar$ LifePaidOnNewGame | Type$ CountSVar | Expression$ X
SVar:X:Count$xPaid
SVar:LifePaidOnNewGame:Number$0
-S:Mode$ Continuous | EffectZone$ Command | Affected$ You | AddKeyword$ You can't draw cards. | Description$ You can't draw cards.
+S:Mode$ CantDraw | ValidPlayer$ You | EffectZone$ Command | Description$ You can't draw cards.
T:Mode$ Phase | Phase$ Draw | ValidPlayer$ You | TriggerZones$ Command | Execute$ TrigDig | TriggerDescription$ At the beginning of your draw step, look at the top X cards of your library, where X is the amount of life paid with CARDNAME. Put one of them into your hand, then shuffle.
SVar:TrigDig:DB$ Dig | DigNum$ LifePaidOnNewGame | ChangeNum$ 1 | LibraryPosition$ 0 | SubAbility$ DBShuffle
SVar:DBShuffle:DB$ Shuffle | Defined$ You
AI:RemoveDeck:All
-SVar:Picture:https://downloads.cardforge.org/images/cards/VAN/Maralen of the Mornsong Avatar.full.jpg
Oracle:Hand +0, life -3\nAt the beginning of the game, you may pay any amount of life.\nYou can't draw cards.\nAt the beginning of your draw step, look at the top X cards of your library, where X is the amount of life paid with Maralen of the Mornsong Avatar. Put one of them into your hand, then shuffle.
diff --git a/forge-gui/res/cardsfolder/m/marit_lages_slumber.txt b/forge-gui/res/cardsfolder/m/marit_lages_slumber.txt
index a04b6640191..e0f6c37f8bd 100644
--- a/forge-gui/res/cardsfolder/m/marit_lages_slumber.txt
+++ b/forge-gui/res/cardsfolder/m/marit_lages_slumber.txt
@@ -3,10 +3,8 @@ ManaCost:1 U
Types:Legendary Snow Enchantment
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self,Permanent.Snow+Other+YouCtrl | Execute$ TrigScry | TriggerDescription$ Whenever CARDNAME or another snow permanent enters the battlefield under your control, scry 1.
SVar:TrigScry:DB$ Scry | ScryNum$ 1 | SpellDescription$ Scry 1.
-T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | IsPresent$ Permanent.Snow+YouCtrl | PresentCompare$ GE10 | Execute$ TrigSac | TriggerDescription$ At the beginning of your upkeep, if you control ten or more snow permanents, sacrifice CARDNAME. If you do, create Marit Lage, a legendary 20/20 black Avatar creature token with flying and indestructible.
-SVar:TrigSac:DB$ Sacrifice | RememberSacrificed$ True | SubAbility$ DBToken
-SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ marit_lage | TokenOwner$ You | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup
-SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
+T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | IsPresent$ Permanent.Snow+YouCtrl | PresentCompare$ GE10 | Execute$ TrigToken | TriggerDescription$ At the beginning of your upkeep, if you control ten or more snow permanents, sacrifice CARDNAME. If you do, create Marit Lage, a legendary 20/20 black Avatar creature token with flying and indestructible.
+SVar:TrigToken:AB$ Token | TokenAmount$ 1 | TokenScript$ marit_lage | TokenOwner$ You | Cost$ Mandatory Sac<1/CARDNAME>
DeckHas:Ability$Token
DeckNeeds:Type$Snow
Oracle:Whenever Marit Lage's Slumber or another snow permanent enters the battlefield under your control, scry 1.\nAt the beginning of your upkeep, if you control ten or more snow permanents, sacrifice Marit Lage's Slumber. If you do, create Marit Lage, a legendary 20/20 black Avatar creature token with flying and indestructible.
\ No newline at end of file
diff --git a/forge-gui/res/cardsfolder/m/merchant_of_the_vale_haggle.txt b/forge-gui/res/cardsfolder/m/merchant_of_the_vale_haggle.txt
index e88a20025ec..19011d2cf95 100644
--- a/forge-gui/res/cardsfolder/m/merchant_of_the_vale_haggle.txt
+++ b/forge-gui/res/cardsfolder/m/merchant_of_the_vale_haggle.txt
@@ -11,7 +11,5 @@ ALTERNATE
Name:Haggle
ManaCost:R
Types:Instant Adventure
-A:SP$ Discard | Cost$ R | NumCards$ 1 | Optional$ True | Mode$ TgtChoose | RememberDiscarded$ True | SubAbility$ DBDraw | SpellDescription$ You may discard a card. If you do, draw a card.
-SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup
-SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
+A:SP$ Draw | Cost$ R | NumCards$ 1 | UnlessCost$ Discard<1/Card> | UnlessSwitched$ True | UnlessPayer$ You | SpellDescription$ You may discard a card. If you do, draw a card.
Oracle:You may discard a card. If you do, draw a card. (Then exile this card. You may cast the creature later from exile.)
\ No newline at end of file
diff --git a/forge-gui/res/cardsfolder/m/mila_crafty_companion_lukka_wayward_bonder.txt b/forge-gui/res/cardsfolder/m/mila_crafty_companion_lukka_wayward_bonder.txt
index eee9feca0f6..10a2deafb21 100644
--- a/forge-gui/res/cardsfolder/m/mila_crafty_companion_lukka_wayward_bonder.txt
+++ b/forge-gui/res/cardsfolder/m/mila_crafty_companion_lukka_wayward_bonder.txt
@@ -2,7 +2,7 @@ Name:Mila, Crafty Companion
ManaCost:1 W W
Types:Legendary Creature Fox
PT:2/3
-T:Mode$ AttackersDeclared | AttackedTarget$ Planeswalker.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigWalkerPump | TriggerDescription$ Whenever an opponent attacks a planeswalker you control, put a loyalty counter on each planeswalker you control.
+T:Mode$ AttackersDeclared | AttackedTarget$ Planeswalker.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigWalkerPump | TriggerDescription$ Whenever an opponent attacks one or more planeswalkers you control, put a loyalty counter on each planeswalker you control.
SVar:TrigWalkerPump:DB$ PutCounterAll | ValidCards$ Planeswalker.YouCtrl | CounterType$ LOYALTY | CounterNum$ 1
T:Mode$ BecomesTarget | ValidSource$ Card.OppCtrl | ValidTarget$ Permanent.YouCtrl+inZoneBattlefield | TriggerZones$ Battlefield | Execute$ TrigDraw | OptionalDecider$ You | TriggerDescription$ Whenever a permanent you control becomes the target of a spell or ability an opponent controls, you may draw a card.
SVar:TrigDraw:DB$ Draw | NumCards$ 1 | Defined$ You
@@ -15,10 +15,10 @@ Name:Lukka, Wayward Bonder
ManaCost:4 R R
Types:Legendary Planeswalker Lukka
Loyalty:5
-A:AB$ Discard | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | NumCards$ 1 | Optional$ True | Mode$ TgtChoose | RememberDiscarded$ True | SubAbility$ DBDraw | SpellDescription$ You may discard a card. If you do, draw a card. If a creature card was discarded this way, draw an additional card.
-SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBDraw2
-SVar:DBDraw2:DB$ Draw | NumCards$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Creature | ConditionCompare$ EQ1 | StackDescription$ None | SubAbility$ DBCleanup
-A:AB$ ChangeZone | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouCtrl | GainControl$ True | SubAbility$ DBPump | RememberChanged$ True | AILogic$ BeforeCombat | SpellDescription$ Return target creature card from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step.
+A:AB$ Discard | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | NumCards$ 1 | Optional$ True | Mode$ TgtChoose | RememberDiscarded$ True | SubAbility$ DBDraw | SpellDescription$ You may discard a card. If you do, draw a card. If a creature card was discarded this way, draw two cards instead.
+SVar:DBDraw:DB$ Draw | NumCards$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Card.nonCreature | ConditionCompare$ GE1 | SubAbility$ DBDraw2
+SVar:DBDraw2:DB$ Draw | NumCards$ 2 | ConditionDefined$ Remembered | ConditionPresent$ Creature | ConditionCompare$ GE1 | StackDescription$ None | SubAbility$ DBCleanup
+A:AB$ ChangeZone | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouCtrl | GainControl$ True | SubAbility$ DBPump | RememberChanged$ True | AILogic$ BeforeCombat | SpellDescription$ Return target creature card from your graveyard to the battlefield. It gains haste. Exile it at the beginning of your next upkeep.
SVar:DBPump:DB$ Animate | Keywords$ Haste | Defined$ Remembered | Duration$ Permanent | AtEOT$ Exile | SubAbility$ DBCleanup
A:AB$ Effect | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | Ultimate$ True | Name$ Emblem - Lukka, Wayward Bonder | Image$ emblem_lukka_wayward_bonder | Triggers$ LukkaCreatureETB | SVars$ LukkaDmg | Duration$ Permanent | AILogic$ Always | SpellDescription$ You get an emblem with "Whenever a creature enters the battlefield under your control, it deals damage equal to its power to any target."
SVar:LukkaCreatureETB:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.YouCtrl | TriggerZones$ Command | Execute$ LukkaDmg | TriggerDescription$ Whenever a creature enters the battlefield under your control, it deals damage equal to its power to any target.
diff --git a/forge-gui/res/cardsfolder/m/moritte_of_the_frost.txt b/forge-gui/res/cardsfolder/m/moritte_of_the_frost.txt
index 85a6bb18907..78665d3e564 100644
--- a/forge-gui/res/cardsfolder/m/moritte_of_the_frost.txt
+++ b/forge-gui/res/cardsfolder/m/moritte_of_the_frost.txt
@@ -4,9 +4,9 @@ Types:Legendary Snow Creature Shapeshifter
PT:0/0
K:Changeling
K:ETBReplacement:Copy:DBCopy:Optional
-SVar:DBCopy:DB$ Clone | Choices$ Permanent.Other+YouCtrl | AddTypes$ Legendary & Snow | SubAbility$ DBConditionEffect | AddKeywords$ Changeling | SpellDescription$ You may have Moritte of the Frost enter the battlefield as a copy of a permanent you control, except it’s legendary and snow in addition to its other types and, if it’s a creature, it enters with two additional +1/+1 counters on it and has changeling.
+SVar:DBCopy:DB$ Clone | Choices$ Permanent.Other+YouCtrl | AddTypes$ Legendary & Snow | SubAbility$ DBConditionEffect | AddKeywords$ Changeling | SpellDescription$ You may have Moritte of the Frost enter the battlefield as a copy of a permanent you control, except it's legendary and snow in addition to its other types and, if it's a creature, it enters with two additional +1/+1 counters on it and has changeling.
SVar:DBConditionEffect:DB$ Effect | RememberObjects$ Self | Name$ Moritte of the Frost Effect | ReplacementEffects$ ETBCreat
-SVar:ETBCreat:Event$ Moved | ValidCard$ Creature.IsRemembered | Destination$ Battlefield | ReplaceWith$ DBPutP1P1 | Description$ If it’s a creature, it enters with two additional +1/+1 counters on it.
+SVar:ETBCreat:Event$ Moved | ValidCard$ Creature.IsRemembered | Destination$ Battlefield | ReplaceWith$ DBPutP1P1 | Description$ If it's a creature, it enters with two additional +1/+1 counters on it.
SVar:DBPutP1P1:DB$ PutCounter | Defined$ ReplacedCard | CounterType$ P1P1 | ETB$ True | CounterNum$ 2 | SubAbility$ ToBattlefield
SVar:ToBattlefield:DB$ InternalEtbReplacement | SubAbility$ DBExile
SVar:DBExile:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile
diff --git a/forge-gui/res/cardsfolder/m/morkrut_behemoth.txt b/forge-gui/res/cardsfolder/m/morkrut_behemoth.txt
index a259fd27b94..15443e3bbb4 100644
--- a/forge-gui/res/cardsfolder/m/morkrut_behemoth.txt
+++ b/forge-gui/res/cardsfolder/m/morkrut_behemoth.txt
@@ -5,4 +5,4 @@ PT:7/6
K:Menace
K:AlternateAdditionalCost:Sac<1/Creature>:1 B
SVar:AIPreference:SacCost$Creature.token,Creature.cmcLE1
-Oracle:As an additional cost to cast this spell, sacrifice a creature or pay {1}{B}.\nMenace (This creature can’t be blocked except by two or more creatures.)
+Oracle:As an additional cost to cast this spell, sacrifice a creature or pay {1}{B}.\nMenace (This creature can't be blocked except by two or more creatures.)
diff --git a/forge-gui/res/cardsfolder/n/narset_parter_of_veils.txt b/forge-gui/res/cardsfolder/n/narset_parter_of_veils.txt
index 9b30139d33e..b0b462bbeae 100644
--- a/forge-gui/res/cardsfolder/n/narset_parter_of_veils.txt
+++ b/forge-gui/res/cardsfolder/n/narset_parter_of_veils.txt
@@ -2,6 +2,6 @@ Name:Narset, Parter of Veils
ManaCost:1 U U
Types:Legendary Planeswalker Narset
Loyalty:5
-S:Mode$ Continuous | Affected$ Opponent | AddKeyword$ You can't draw more than one card each turn. | Description$ Each opponent can't draw more than one card each turn.
+S:Mode$ CantDraw | ValidPlayer$ Opponent | DrawLimit$ 1 | Description$ Each opponent can't draw more than one card each turn.
A:AB$ Dig | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | DigNum$ 4 | ChangeNum$ 1 | Optional$ True | ChangeValid$ Card.nonCreature+nonLand | RestRandomOrder$ True | ForceRevealToController$ True | SpellDescription$ Look at the top four cards of your library. You may reveal a noncreature, nonland card from among them and put it into your hand. Put the rest on the bottom of your library in a random order.
Oracle:Each opponent can't draw more than one card each turn.\n[−2]: Look at the top four cards of your library. You may reveal a noncreature, nonland card from among them and put it into your hand. Put the rest on the bottom of your library in a random order.
diff --git a/forge-gui/res/cardsfolder/o/oathsworn_vampire.txt b/forge-gui/res/cardsfolder/o/oathsworn_vampire.txt
index dd8be58653f..088a14801c9 100644
--- a/forge-gui/res/cardsfolder/o/oathsworn_vampire.txt
+++ b/forge-gui/res/cardsfolder/o/oathsworn_vampire.txt
@@ -3,9 +3,9 @@ ManaCost:1 B
Types:Creature Vampire Knight
PT:2/2
K:CARDNAME enters the battlefield tapped.
-S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ Graveyard | MayPlay$ True | CheckSVar$ X | SVarCompare$ GE1 | Description$ You may cast CARDNAME from your graveyard if you gained life this turn.
+S:Mode$ Continuous | Affected$ Card.Self | AffectedZone$ Graveyard | EffectZone$ Graveyard | MayPlay$ True | CheckSVar$ X | SVarCompare$ GE1 | Description$ You may cast CARDNAME from your graveyard if you gained life this turn.
SVar:X:Count$LifeYouGainedThisTurn
SVar:SacMe:3
SVar:DiscardMe:3
SVar:Picture:http://www.wizards.com/global/images/magic/general/oathsworn_vampire.jpg
-Oracle:Oathsworn Vampire enters the battlefield tapped.\nYou may cast Oathsworn Vampire from your graveyard if you gained life this turn.
\ No newline at end of file
+Oracle:Oathsworn Vampire enters the battlefield tapped.\nYou may cast Oathsworn Vampire from your graveyard if you gained life this turn.
diff --git a/forge-gui/res/cardsfolder/o/obuun_mul_daya_ancestor.txt b/forge-gui/res/cardsfolder/o/obuun_mul_daya_ancestor.txt
index 70701ce2bed..cf51b2aa0dc 100644
--- a/forge-gui/res/cardsfolder/o/obuun_mul_daya_ancestor.txt
+++ b/forge-gui/res/cardsfolder/o/obuun_mul_daya_ancestor.txt
@@ -2,7 +2,7 @@ Name:Obuun, Mul Daya Ancestor
ManaCost:1 R G W
Types:Legendary Creature Elf Spirit
PT:3/3
-T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigAnimate | TriggerDescription$ At the beginning of combat on your turn, up to one target land you control becomes an X/X Elemental creature with trample and haste until end of turn, where X is CARDNAME’s power. It’s still a land.
+T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigAnimate | TriggerDescription$ At the beginning of combat on your turn, up to one target land you control becomes an X/X Elemental creature with trample and haste until end of turn, where X is CARDNAME's power. It's still a land.
SVar:TrigAnimate:DB$ Animate | ValidTgts$ Land.YouCtrl | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select up to one target land you control | Power$ X | Toughness$ X | Types$ Elemental,Creature | Keywords$ Trample & Haste
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, put a +1/+1 counter on target creature.
SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1
diff --git a/forge-gui/res/cardsfolder/o/ochre_jelly.txt b/forge-gui/res/cardsfolder/o/ochre_jelly.txt
index 1fe9091e39e..5fdfc38f3f2 100644
--- a/forge-gui/res/cardsfolder/o/ochre_jelly.txt
+++ b/forge-gui/res/cardsfolder/o/ochre_jelly.txt
@@ -6,7 +6,7 @@ K:Trample
K:etbCounter:P1P1:X
SVar:X:Count$xPaid
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self+counters_GE2_P1P1 | TriggerZones$ Battlefield | Execute$ TrigDelayTrigger | TriggerDescription$ Split — When CARDNAME dies, if it had two or more +1/+1 counters on it, create a token that's a copy of it at the beginning of the next end step. The token enters the battlefield with half that many +1/+1 counters on it, rounded down.
-SVar:TrigDelayTrigger:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | ValidPlayer$ Player | RememberObjects$ TriggeredCardLKICopy | CopyTriggeringObjects$ True | Execute$ TrigCopy | TriggerDescription$ Create a token that’s a copy of it at the beginning of the next end step. That token enters the battlefield with half that many +1/+1 counters on it, rounded down.
+SVar:TrigDelayTrigger:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | ValidPlayer$ Player | RememberObjects$ TriggeredCardLKICopy | CopyTriggeringObjects$ True | Execute$ TrigCopy | TriggerDescription$ Create a token that's a copy of it at the beginning of the next end step. That token enters the battlefield with half that many +1/+1 counters on it, rounded down.
SVar:TrigCopy:DB$ CopyPermanent | Defined$ DelayTriggerRememberedLKI | WithCountersType$ P1P1 | WithCountersAmount$ Y
SVar:Y:TriggeredCard$CardCounters.P1P1/HalfDown
DeckHas:Ability$Counters & Ability$Token
diff --git a/forge-gui/res/cardsfolder/o/old_growth_troll.txt b/forge-gui/res/cardsfolder/o/old_growth_troll.txt
index a53b072b259..40d94a3ba2d 100644
--- a/forge-gui/res/cardsfolder/o/old_growth_troll.txt
+++ b/forge-gui/res/cardsfolder/o/old_growth_troll.txt
@@ -6,7 +6,7 @@ K:Trample
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self+Creature | TriggerController$ TriggeredCardController | Execute$ DBReturn | TriggerDescription$ When CARDNAME dies, if it was a creature. return it to the battlefield. It's an Aura enchantment with enchant Forest you control and “Enchanted Forest has ‘{T}: When CARDNAME dies, if it was a creature, return it to the battlefield. It's an Aura enchantment with enchant Forest you control and "Enchanted Forest has '{T}: Add {G}{G}' and '{1}, {T}, Sacrifice this land: Create a tapped 4/4 green Troll Warrior creature token with trample.'"
SVar:DBReturn:DB$ ChangeZone | Defined$ TriggeredNewCardLKICopy | Origin$ Graveyard | Destination$ Battlefield | AnimateSubAbility$ DBAnimate
SVar:DBAnimate:DB$ Animate | Defined$ Remembered | Types$ Enchantment,Aura | RemoveCardTypes$ True | RemoveAllAbilities$ True | Keywords$ Enchant Forest you control | Abilities$ SPAttach | staticAbilities$ STAura | Duration$ Permanent
-SVar:STAura:Mode$ Continuous | Affected$ Land.EnchantedBy | AddAbility$ ABMana & ABToken | Description$ Enchanted Forest has ‘{T}: Add {G}{G}’ and ‘{1}, {T}, Sacrifice this land: Create a tapped 4/4 green Troll Warrior creature token with trample.’
+SVar:STAura:Mode$ Continuous | Affected$ Land.EnchantedBy | AddAbility$ ABMana & ABToken | Description$ Enchanted Forest has '{T}: Add {G}{G}' and '{1}, {T}, Sacrifice this land: Create a tapped 4/4 green Troll Warrior creature token with trample.'
SVar:SPAttach:SP$ Attach | Cost$ 0 | ValidTgts$ Forest.YouCtrl | AILogic$ Pump
SVar:ABMana:AB$ Mana | Cost$ T | Produced$ G | Amount$ 2 | SpellDescription$ Add {G}{G}.
SVar:ABToken:AB$ Token | Cost$ 1 T Sac<1/CARDNAME> | TokenAmount$1 | TokenScript$ g_4_4_troll_warrior_trample | TokenOwner$ You | LegacyImage$ g 4 4 troll warrior trample khm | TokenTapped$ True | SpellDescription$ Create a tapped 4/4 green Troll Warrior creature token with trample.
diff --git a/forge-gui/res/cardsfolder/o/omen_machine.txt b/forge-gui/res/cardsfolder/o/omen_machine.txt
index f2cf5089517..08071df7c0b 100644
--- a/forge-gui/res/cardsfolder/o/omen_machine.txt
+++ b/forge-gui/res/cardsfolder/o/omen_machine.txt
@@ -1,7 +1,7 @@
Name:Omen Machine
ManaCost:6
Types:Artifact
-S:Mode$ Continuous | Affected$ Player | AddKeyword$ You can't draw cards. | Description$ Players can't draw cards.
+S:Mode$ CantDraw | ValidPlayer$ Player | Description$ Players can't draw cards.
T:Mode$ Phase | Phase$ Draw | ValidPlayer$ Player | Execute$ TrigOmenExileCard | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of each player's draw step, that player exiles the top card of their library. If it's a land card, the player puts it onto the battlefield. Otherwise, the player casts it without paying its mana cost if able.
SVar:TrigOmenExileCard:DB$ Dig | DigNum$ 1 | ChangeNum$ All | Defined$ TriggeredPlayer | DestinationZone$ Exile | RememberChanged$ True | SubAbility$ DBOmenLand
SVar:DBOmenLand:DB$ ChangeZone | Origin$ Exile | Destination$ Battlefield | ChangeType$ Land.IsRemembered+ActivePlayerCtrl | ChangeNum$ 1 | DefinedPlayer$ TriggeredPlayer | Chooser$ TriggeredPlayer | Hidden$ True | Mandatory$ True | SubAbility$ DBOmenPlay
diff --git a/forge-gui/res/cardsfolder/p/pillar_of_flame.txt b/forge-gui/res/cardsfolder/p/pillar_of_flame.txt
index e129fef52ac..50d48a5a1e4 100644
--- a/forge-gui/res/cardsfolder/p/pillar_of_flame.txt
+++ b/forge-gui/res/cardsfolder/p/pillar_of_flame.txt
@@ -1,7 +1,6 @@
Name:Pillar of Flame
ManaCost:R
Types:Sorcery
-A:SP$ DealDamage | Cost$ R | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 2 | RememberDamaged$ True | ReplaceDyingDefined$ Remembered | SubAbility$ DBCleanup | SpellDescription$ CARDNAME deals 2 damage to any target. If a creature dealt damage this way would die this turn, exile it instead.
+A:SP$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 2 | RememberDamaged$ True | ReplaceDyingDefined$ Remembered.Creature | SubAbility$ DBCleanup | SpellDescription$ CARDNAME deals 2 damage to any target. If a creature dealt damage this way would die this turn, exile it instead.
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
-SVar:Picture:http://www.wizards.com/global/images/magic/general/pillar_of_flame.jpg
Oracle:Pillar of Flame deals 2 damage to any target. If a creature dealt damage this way would die this turn, exile it instead.
diff --git a/forge-gui/res/cardsfolder/p/plague_boiler.txt b/forge-gui/res/cardsfolder/p/plague_boiler.txt
index cb8abe49a77..f0c5e7ce6af 100644
--- a/forge-gui/res/cardsfolder/p/plague_boiler.txt
+++ b/forge-gui/res/cardsfolder/p/plague_boiler.txt
@@ -6,10 +6,8 @@ SVar:PutPlagueCounter:DB$ PutCounter | Defined$ Self | CounterType$ PLAGUE | Cou
A:AB$ GenericChoice | Cost$ 1 B G | Choices$ DBPutPlagueCounter,DBRemovePlagueCounter | SpellDescription$ Put a plague counter on CARDNAME or remove a plague counter from it.
SVar:DBRemovePlagueCounter:DB$ RemoveCounter | Defined$ Self | CounterType$ PLAGUE | CounterNum$ 1 | SpellDescription$ Remove a plague counter on this card.
SVar:DBPutPlagueCounter:DB$ PutCounter | Defined$ Self | CounterType$ PLAGUE | CounterNum$ 1 | SpellDescription$ Put a plague counter on this card.
-T:Mode$ Always | TriggerZones$ Battlefield | IsPresent$ Card.Self+counters_GE3_PLAGUE | Execute$ TrigSac | TriggerDescription$ When CARDNAME has three or more plague counters on it, sacrifice it. If you do, destroy all nonland permanents.
-SVar:TrigSac:DB$ Sacrifice | Defined$ Self | RememberSacrificed$ True | SubAbility$ DBDestroyAll
-SVar:DBDestroyAll:DB$ DestroyAll | ValidCards$ Permanent.nonLand | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup
-SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
+T:Mode$ Always | TriggerZones$ Battlefield | IsPresent$ Card.Self+counters_GE3_PLAGUE | Execute$ TrigDestroyAll | TriggerDescription$ When CARDNAME has three or more plague counters on it, sacrifice it. If you do, destroy all nonland permanents.
+SVar:TrigDestroyAll:AB$ DestroyAll | ValidCards$ Permanent.nonLand | Cost$ Mandatory Sac<1/CARDNAME>
AI:RemoveDeck:All
SVar:Picture:http://www.wizards.com/global/images/magic/general/plague_boiler.jpg
Oracle:At the beginning of your upkeep, put a plague counter on Plague Boiler.\n{1}{B}{G}: Put a plague counter on Plague Boiler or remove a plague counter from it.\nWhen Plague Boiler has three or more plague counters on it, sacrifice it. If you do, destroy all nonland permanents.
diff --git a/forge-gui/res/cardsfolder/p/plague_reaver.txt b/forge-gui/res/cardsfolder/p/plague_reaver.txt
index 31c2be98e08..a7a9c490aad 100644
--- a/forge-gui/res/cardsfolder/p/plague_reaver.txt
+++ b/forge-gui/res/cardsfolder/p/plague_reaver.txt
@@ -5,7 +5,7 @@ PT:6/5
T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ SacAllOthers | TriggerDescription$ At the beginning of your end step, sacrifice each other creature you control.
SVar:SacAllOthers:DB$ SacrificeAll | ValidCards$ Creature.Other+YouCtrl
A:AB$ Pump | Cost$ Discard<2/Card> Sac<1/CARDNAME> | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | RememberTargets$ True | SubAbility$ DBDelayTrig | StackDescription$ Return CARDNAME to the battlefield under {p:Targeted}'s control at the beginning of their next upkeep. | SpellDescription$ Choose target opponent. Return CARDNAME to the battlefield under that player's control at the beginning of their next upkeep.
-SVar:DBDelayTrig:DB$ DelayedTrigger | TriggerZones$ Graveyard | Mode$ Phase | Phase$ Upkeep | DelayedTriggerDefinedPlayer$ Remembered | RememberObjects$ Remembered | Execute$ DBChange | StackDescription$ None | TriggerDescription$ Return CARDNAME to the battlefield under that player’s control at the beginning of their next upkeep.
+SVar:DBDelayTrig:DB$ DelayedTrigger | TriggerZones$ Graveyard | Mode$ Phase | Phase$ Upkeep | DelayedTriggerDefinedPlayer$ Remembered | RememberObjects$ Remembered | Execute$ DBChange | StackDescription$ None | TriggerDescription$ Return CARDNAME to the battlefield under that player's control at the beginning of their next upkeep.
SVar:DBChange:DB$ ChangeZone | Defined$ Self | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | NewController$ DelayTriggerRemembered
AI:RemoveDeck:All
DeckHas:Ability$Discard & Ability$Sacrifice
diff --git a/forge-gui/res/cardsfolder/p/poppet_stitcher_poppet_factory.txt b/forge-gui/res/cardsfolder/p/poppet_stitcher_poppet_factory.txt
index e4083276b4d..02145c8d9c3 100644
--- a/forge-gui/res/cardsfolder/p/poppet_stitcher_poppet_factory.txt
+++ b/forge-gui/res/cardsfolder/p/poppet_stitcher_poppet_factory.txt
@@ -2,14 +2,14 @@ Name:Poppet Stitcher
ManaCost:2 U
Types:Creature Human Wizard
PT:2/3
-T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever you cast an instant or sorcery spell, create a 2/2 black Zombie creature token with decayed. (It can’t block. When it attacks, sacrifice it at end of combat.)
+T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever you cast an instant or sorcery spell, create a 2/2 black Zombie creature token with decayed. (It can't block. When it attacks, sacrifice it at end of combat.)
SVar:TrigToken:DB$ Token | TokenScript$ b_2_2_zombie_decayed | TokenOwner$ You
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | IsPresent$ Creature.token+YouCtrl | PresentCompare$ GE3 | TriggerZones$ Battlefield | Execute$ TrigTransform | OptionalDecider$ You | TriggerDescription$ At the beginning of your upkeep, if you control three or more creature tokens, you may transform CARDNAME.
SVar:TrigTransform:DB$ SetState | Defined$ Self | Mode$ Transform
AlternateMode:DoubleFaced
DeckNeeds:Type$Instant|Sorcery
DeckHas:Ability$Token
-Oracle:Whenever you cast an instant or sorcery spell, create a 2/2 black Zombie creature token with decayed. (It can’t block. When it attacks, sacrifice it at end of combat.)\nAt the beginning of your upkeep, if you control three or more creature tokens, you may transform Poppet Sticher.
+Oracle:Whenever you cast an instant or sorcery spell, create a 2/2 black Zombie creature token with decayed. (It can't block. When it attacks, sacrifice it at end of combat.)\nAt the beginning of your upkeep, if you control three or more creature tokens, you may transform Poppet Sticher.
ALTERNATE
diff --git a/forge-gui/res/cardsfolder/p/prismari_pledgemage.txt b/forge-gui/res/cardsfolder/p/prismari_pledgemage.txt
index ece2c3fdf13..0e42a85a39f 100644
--- a/forge-gui/res/cardsfolder/p/prismari_pledgemage.txt
+++ b/forge-gui/res/cardsfolder/p/prismari_pledgemage.txt
@@ -3,6 +3,6 @@ ManaCost:UR UR
Types:Creature Orc Wizard
PT:3/3
K:Defender
-T:Mode$ SpellCastOrCopy | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Magecraft — Whenever you cast or copy an instant or sorcery spell, CARDNAME can attack this turn as though it didn’t have defender.
+T:Mode$ SpellCastOrCopy | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Magecraft — Whenever you cast or copy an instant or sorcery spell, CARDNAME can attack this turn as though it didn't have defender.
SVar:TrigPump:DB$ Pump | Defined$ Self | KW$ HIDDEN CARDNAME can attack as though it didn't have defender.
Oracle:Defender\nMagecraft — Whenever you cast or copy an instant or sorcery spell, Prismari Pledgemage can attack this turn as though it didn't have defender.
diff --git a/forge-gui/res/cardsfolder/p/promise_of_loyalty.txt b/forge-gui/res/cardsfolder/p/promise_of_loyalty.txt
index 4b3813dcc23..65e2bf0decc 100644
--- a/forge-gui/res/cardsfolder/p/promise_of_loyalty.txt
+++ b/forge-gui/res/cardsfolder/p/promise_of_loyalty.txt
@@ -5,7 +5,7 @@ A:SP$ RepeatEach | Cost$ 4 W | RepeatPlayers$ Player | RepeatSubAbility$ DBPutCo
SVar:DBPutCounter:DB$ PutCounter | Choices$ Creature.ControlledBy Player.IsRemembered | ChoiceTitle$ Choose a creature you control | Chooser$ Player.IsRemembered | Placer$ Player.IsRemembered | CounterType$ VOW | CounterNum$ 1 | RememberCards$ True | SubAbility$ SacAllOthers
SVar:SacAllOthers:DB$ SacrificeAll | ValidCards$ Creature.IsNotRemembered+ControlledBy Player.IsRemembered
SVar:DBEffect:DB$ Effect | RememberObjects$ Remembered | StaticAbilities$ VowStatic | ForgetOnMoved$ Battlefield | ForgetCounter$ VOW | Duration$ Permanent | SubAbility$ DBCleanup
-SVar:VowStatic:Mode$ CantAttack | ValidCard$ Card.IsRemembered | Target$ You | Description$ Each of these creatures can’t attack you for as long as it has a vow counter on it.
+SVar:VowStatic:Mode$ CantAttack | ValidCard$ Card.IsRemembered | Target$ You | Description$ Each of these creatures can't attack you for as long as it has a vow counter on it.
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
DeckHas:Ability$Counters
Oracle:Each player puts a vow counter on a creature they control and sacrifices the rest. Each of those creatures can't attack you or planeswalkers you control for as long as it has a vow counter on it.
diff --git a/forge-gui/res/cardsfolder/r/rebirth.txt b/forge-gui/res/cardsfolder/r/rebirth.txt
index d4ebb24917b..6b00761c1c2 100644
--- a/forge-gui/res/cardsfolder/r/rebirth.txt
+++ b/forge-gui/res/cardsfolder/r/rebirth.txt
@@ -2,7 +2,7 @@ Name:Rebirth
ManaCost:3 G G G
Types:Sorcery
K:Remove CARDNAME from your deck before playing if you're not playing for ante.
-A:SP$ RepeatEach | Cost$ 3 G G G | RepeatPlayers$ Player | RepeatSubAbility$ Ante | SpellDescription$ Each player may ante the top card of their library. If a player does, that player’s life total becomes 20.
+A:SP$ RepeatEach | Cost$ 3 G G G | RepeatPlayers$ Player | RepeatSubAbility$ Ante | SpellDescription$ Each player may ante the top card of their library. If a player does, that player's life total becomes 20.
SVar:Ante:DB$ Dig | Defined$ Player.IsRemembered | Destination$ Ante | DigNum$ 1 | ChangeNum$ All | RememberChanged$ True | Optional$ True | SubAbility$ 20Life | AILogic$ Rebirth
SVar:20Life:DB$ SetLife | Defined$ Player.IsRemembered | LifeAmount$ 20 | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ EQ1 | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
diff --git a/forge-gui/res/cardsfolder/r/red_suns_zenith.txt b/forge-gui/res/cardsfolder/r/red_suns_zenith.txt
index d30797296d8..d77f91c1d20 100644
--- a/forge-gui/res/cardsfolder/r/red_suns_zenith.txt
+++ b/forge-gui/res/cardsfolder/r/red_suns_zenith.txt
@@ -1,9 +1,8 @@
Name:Red Sun's Zenith
ManaCost:X R
Types:Sorcery
-A:SP$ DealDamage | Cost$ X R | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | RememberDamaged$ True | ReplaceDyingDefined$ Remembered | SubAbility$ DBCleanup | SpellDescription$ CARDNAME deals X damage to any target. If a creature dealt damage this way would die this turn, exile it instead. Shuffle CARDNAME into its owner's library.
+A:SP$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | RememberDamaged$ True | ReplaceDyingDefined$ Remembered.Creature | SubAbility$ DBCleanup | SpellDescription$ CARDNAME deals X damage to any target. If a creature dealt damage this way would die this turn, exile it instead. Shuffle CARDNAME into its owner's library.
SVar:X:Count$xPaid
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | SubAbility$ DBShuffle
-SVar:DBShuffle:DB$ ChangeZone | Origin$ Stack | Destination$ Library | Shuffle$ True
-SVar:Picture:http://www.wizards.com/global/images/magic/general/red_suns_zenith.jpg
+SVar:DBShuffle:DB$ ChangeZone | Origin$ Stack | Destination$ Library | Shuffle$ True | StackDescription$ Shuffle CARDNAME into {p:You}'s library.
Oracle:Red Sun's Zenith deals X damage to any target. If a creature dealt damage this way would die this turn, exile it instead. Shuffle Red Sun's Zenith into its owner's library.
diff --git a/forge-gui/res/cardsfolder/r/risk_factor.txt b/forge-gui/res/cardsfolder/r/risk_factor.txt
index f299dc8bda0..fad19b7460f 100644
--- a/forge-gui/res/cardsfolder/r/risk_factor.txt
+++ b/forge-gui/res/cardsfolder/r/risk_factor.txt
@@ -2,6 +2,5 @@ Name:Risk Factor
ManaCost:2 R
Types:Instant
K:Jump-start
-A:SP$ Pump | StackDescription$ {p:Targeted} may have CARDNAME deal 4 damage to them. If {p:Targeted} doesn't, | Cost$ 2 R | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | UnlessCost$ DamageYou<4> | UnlessPayer$ Targeted | UnlessResolveSubs$ WhenNotPaid | AILogic$ RiskFactor | UnlessAI$ RiskFactor | SubAbility$ DBDraw | IsCurse$ True | SpellDescription$ Target opponent may have CARDNAME deal 4 damage to them. If that player doesn't, you draw three cards.
-SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 3
+A:SP$ Draw | Defined$ You | NumCards$ 3 | StackDescription$ {p:Targeted} may have CARDNAME deal 4 damage to them. If {p:Targeted} doesn't, {p:You} draws three cards. | Cost$ 2 R | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | UnlessCost$ DamageYou<4> | UnlessPayer$ Targeted | UnlessAI$ RiskFactor | IsCurse$ True | SpellDescription$ Target opponent may have CARDNAME deal 4 damage to them. If that player doesn't, you draw three cards.
Oracle:Target opponent may have Risk Factor deal 4 damage to them. If that player doesn't, you draw three cards.\nJump-start (You may cast this card from your graveyard by discarding a card in addition to paying its other costs. Then exile this card.)
diff --git a/forge-gui/res/cardsfolder/s/sanctum_of_calm_waters.txt b/forge-gui/res/cardsfolder/s/sanctum_of_calm_waters.txt
index 2225852425b..5e0c6fc7d96 100644
--- a/forge-gui/res/cardsfolder/s/sanctum_of_calm_waters.txt
+++ b/forge-gui/res/cardsfolder/s/sanctum_of_calm_waters.txt
@@ -1,9 +1,8 @@
Name:Sanctum of Calm Waters
ManaCost:3 U
Types:Legendary Enchantment Shrine
-T:Mode$ Phase | Phase$ Main1 | PreCombatMain$ True | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDraw | OptionalDecider$ You | TriggerDescription$ At the beginning of your precombat main phase, you may draw X cards, where X is the number of Shrines you control. If you do, discard a card.
-SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ X | SubAbility$ DBDiscard
-SVar:DBDiscard:DB$ Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1
+T:Mode$ Phase | Phase$ Main1 | PreCombatMain$ True | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ At the beginning of your precombat main phase, you may draw X cards, where X is the number of Shrines you control. If you do, discard a card.
+SVar:TrigDraw:AB$ Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 | Cost$ Draw
SVar:X:Count$TypeYouCtrl.Shrine
DeckHints:Type$Shrine
Oracle:At the beginning of your precombat main phase, you may draw X cards, where X is the number of Shrines you control. If you do, discard a card.
diff --git a/forge-gui/res/cardsfolder/s/saprazzan_heir.txt b/forge-gui/res/cardsfolder/s/saprazzan_heir.txt
index 275f4b127b2..54544b24343 100644
--- a/forge-gui/res/cardsfolder/s/saprazzan_heir.txt
+++ b/forge-gui/res/cardsfolder/s/saprazzan_heir.txt
@@ -2,8 +2,8 @@ Name:Saprazzan Heir
ManaCost:1 U
Types:Creature Merfolk
PT:1/1
-T:Mode$ AttackerBlocked | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME becomes blocked, you may draw three cards.
-SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 3
+T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME becomes blocked, you may draw three cards.
+SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 3 | OptionalDecider$ You
SVar:HasAttackEffect:Blocked
SVar:Picture:http://www.wizards.com/global/images/magic/general/saprazzan_heir.jpg
Oracle:Whenever Saprazzan Heir becomes blocked, you may draw three cards.
diff --git a/forge-gui/res/cardsfolder/s/sarkhan_fireblood.txt b/forge-gui/res/cardsfolder/s/sarkhan_fireblood.txt
index df5f7de9ead..7dbf51f67a9 100644
--- a/forge-gui/res/cardsfolder/s/sarkhan_fireblood.txt
+++ b/forge-gui/res/cardsfolder/s/sarkhan_fireblood.txt
@@ -1,9 +1,7 @@
Name:Sarkhan, Fireblood
ManaCost:1 R R
Types:Legendary Planeswalker Sarkhan
-A:AB$ Discard | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | NumCards$ 1 | Optional$ True | Mode$ TgtChoose | RememberDiscarded$ True | SubAbility$ DBDraw | SpellDescription$ You may discard a card. If you do, draw a card.
-SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup
-SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
+A:AB$ Draw | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | Defined$ You | NumCards$ 1 | UnlessCost$ Discard<1/Card> | UnlessSwitched$ True | UnlessPayer$ You
A:AB$ Mana | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | Produced$ Combo W U B R G | Amount$ 2 | RestrictValid$ Card.Dragon | SpellDescription$ Add two mana in any combination of colors. Spend this mana only to cast Dragon spells.
A:AB$ Token | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | Ultimate$ True | TokenAmount$ 4 | TokenScript$ r_5_5_dragon_flying | LegacyImage$ r 5 5 dragon flying m19 | SpellDescription$ Create four 5/5 red Dragon creature tokens with flying.
DeckHas:Ability$Token
diff --git a/forge-gui/res/cardsfolder/s/scorching_lava.txt b/forge-gui/res/cardsfolder/s/scorching_lava.txt
index 430a00c0d9c..3085bdf1987 100644
--- a/forge-gui/res/cardsfolder/s/scorching_lava.txt
+++ b/forge-gui/res/cardsfolder/s/scorching_lava.txt
@@ -2,6 +2,6 @@ Name:Scorching Lava
ManaCost:1 R
Types:Instant
K:Kicker:R
-A:SP$ DealDamage | Cost$ 1 R | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 2 | ReplaceDyingDefined$ Targeted | ReplaceDyingCondition$ Kicked | SubAbility$ KickingLava | SpellDescription$ CARDNAME deals 2 damage to any target. If this spell was kicked, that creature can't be regenerated this turn and if it would die this turn, exile it instead.
-SVar:KickingLava:DB$ Pump | KW$ HIDDEN CARDNAME can't be regenerated. | Defined$ Targeted | Condition$ Kicked | ConditionDescription$ If Scorching Lava was kicked,
+A:SP$ DealDamage | Cost$ 1 R | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 2 | ReplaceDyingDefined$ Targeted.Creature | ReplaceDyingCondition$ Kicked | SubAbility$ KickingLava | SpellDescription$ CARDNAME deals 2 damage to any target. If this spell was kicked, that creature can't be regenerated this turn and if it would die this turn, exile it instead.
+SVar:KickingLava:DB$ Pump | KW$ HIDDEN CARDNAME can't be regenerated. | Defined$ Targeted.Creature | Condition$ Kicked
Oracle:Kicker {R} (You may pay an additional {R} as you cast this spell.)\nScorching Lava deals 2 damage to any target. If this spell was kicked, that creature can't be regenerated this turn and if it would die this turn, exile it instead.
diff --git a/forge-gui/res/cardsfolder/s/shell_shield.txt b/forge-gui/res/cardsfolder/s/shell_shield.txt
index 488686970d0..c4dd371fe2c 100644
--- a/forge-gui/res/cardsfolder/s/shell_shield.txt
+++ b/forge-gui/res/cardsfolder/s/shell_shield.txt
@@ -2,6 +2,6 @@ Name:Shell Shield
ManaCost:U
Types:Instant
K:Kicker:1
-A:SP$ Pump | Cost$ U | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature | NumDef$ 3 | SubAbility$ Kicked | SpellDescription$ Target creature gets +0/+3 until end of turn. If CARDNAME was kicked, that creature also gains hexproof until end of turn. (It can’t be the target of spells or abilities your opponents control.)
+A:SP$ Pump | Cost$ U | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature | NumDef$ 3 | SubAbility$ Kicked | SpellDescription$ Target creature gets +0/+3 until end of turn. If CARDNAME was kicked, that creature also gains hexproof until end of turn. (It can't be the target of spells or abilities your opponents control.)
SVar:Kicked:DB$ Pump | Defined$ Targeted | KW$ Hexproof | Condition$ Kicked | ConditionDescription$ If Shell Shield was kicked,
Oracle:Kicker {1} (You may pay an additional {1} as you cast this spell.)\nTarget creature you control gets +0/+3 until end of turn. If this spell was kicked, that creature also gains hexproof until end of turn. (It can't be the target of spells or abilities your opponents control.)
diff --git a/forge-gui/res/cardsfolder/s/sludge_monster.txt b/forge-gui/res/cardsfolder/s/sludge_monster.txt
index ae361693316..fd98178779a 100644
--- a/forge-gui/res/cardsfolder/s/sludge_monster.txt
+++ b/forge-gui/res/cardsfolder/s/sludge_monster.txt
@@ -4,7 +4,7 @@ Types:Creature Horror
PT:5/5
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPutCounter | TriggerDescription$ Whenever CARDNAME enters the battlefield or attacks, put a slime counter on up to one other target creature.
T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPutCounter | TriggerZones$ Battlefield | Secondary$ True | TriggerDescription$ Whenever CARDNAME enters the battlefield or attacks, put a slime counter on up to one other target creature.
-SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature.Other | TgtPrompt$ Select up to one other target creature | TargetMin$ 0 | TargetMax$ 1 | AITgts$ Creature.nonHorror+OppCtrl+counters_LT1_SLIME | CounterType$ SLIME | CounterNum$ 1
+SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature.Other | TgtPrompt$ Select up to one other target creature | TargetMin$ 0 | TargetMax$ 1 | AITgts$ Creature.nonHorror+OppCtrl+counters_LT1_SLIME | IsCurse$ True | CounterType$ SLIME | CounterNum$ 1
S:Mode$ Continuous | Affected$ Creature.nonHorror+counters_GE1_SLIME | RemoveAllAbilities$ True | SetPower$ 2 | SetToughness$ 2 | Description$ Non-Horror creatures with slime counters on them lose all abilities and have base power and toughness 2/2.
DeckHas:Ability$Counters
SVar:HasAttackEffect:TRUE
diff --git a/forge-gui/res/cardsfolder/s/spark_fiend.txt b/forge-gui/res/cardsfolder/s/spark_fiend.txt
index 8e105dacc25..35c897e9439 100644
--- a/forge-gui/res/cardsfolder/s/spark_fiend.txt
+++ b/forge-gui/res/cardsfolder/s/spark_fiend.txt
@@ -2,14 +2,14 @@ Name:Spark Fiend
ManaCost:4 R
Types:Creature Beast
PT:5/6
-T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigRollETB | TriggerDescription$ When Spark Fiend enters the battlefield, roll two six-sided dice. If you rolled 2, 3, or 12, sacrifice Spark Fiend. If you rolled 7 or 11, don’t roll dice for Spark Fiend during any of your following upkeeps. If you rolled any other total, note that total.
+T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigRollETB | TriggerDescription$ When Spark Fiend enters the battlefield, roll two six-sided dice. If you rolled 2, 3, or 12, sacrifice Spark Fiend. If you rolled 7 or 11, don't roll dice for Spark Fiend during any of your following upkeeps. If you rolled any other total, note that total.
SVar:TrigRollETB:DB$ RollDice | Amount$ 2 | ResultSubAbilities$ 2-3:DBSac,12:DBSac,7:DBSafe,Else:DBNote | ResultSVar$ Result
SVar:DBSac:DB$ Sacrifice | Defined$ Self
SVar:Safe:Number$1
SVar:Noted:Number$0
SVar:DBSafe:DB$ StoreSVar | SVar$ Safe | Type$ Number | Expression$ 0
SVar:DBNote:DB$ StoreSVar | SVar$ Noted | Type$ CountSVar | Expression$ Result
-T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | CheckSVar$ Safe | SVarCompare$ NE0 | TriggerZones$ Battlefield | Execute$ TrigRoll | TriggerDescription$ At the beginning of your upkeep, roll two six-sided dice. If you rolled 7, sacrifice Spark Fiend. If you roll the noted total, don’t roll dice for Spark Fiend during any of your following upkeeps. Otherwise, do nothing.
+T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | CheckSVar$ Safe | SVarCompare$ NE0 | TriggerZones$ Battlefield | Execute$ TrigRoll | TriggerDescription$ At the beginning of your upkeep, roll two six-sided dice. If you rolled 7, sacrifice Spark Fiend. If you roll the noted total, don't roll dice for Spark Fiend during any of your following upkeeps. Otherwise, do nothing.
SVar:TrigRoll:DB$ RollDice | Amount$ 2 | ResultSubAbilities$ 7:DBSac | ResultSVar$ Result | SubAbility$ DBCheck
SVar:DBCheck:DB$ StoreSVar | SVar$ Safe | Type$ CountSVar | Expression$ Result/Minus.Noted
Oracle:When Spark Fiend enters the battlefield, roll two six-sided dice. If you rolled 2, 3, or 12, sacrifice Spark Fiend. If you rolled 7 or 11, don't roll dice for Spark Fiend during any of your following upkeeps. If you rolled any other total, note that total.\nAt the beginning of your upkeep, roll two six-sided dice. If you rolled 7, sacrifice Spark Fiend. If you roll the noted total, don't roll dice for Spark Fiend during any of your following upkeeps. Otherwise, do nothing.
diff --git a/forge-gui/res/cardsfolder/s/spirit_of_the_labyrinth.txt b/forge-gui/res/cardsfolder/s/spirit_of_the_labyrinth.txt
index b505ece35aa..7c9f35b1dc5 100644
--- a/forge-gui/res/cardsfolder/s/spirit_of_the_labyrinth.txt
+++ b/forge-gui/res/cardsfolder/s/spirit_of_the_labyrinth.txt
@@ -2,6 +2,5 @@ Name:Spirit of the Labyrinth
ManaCost:1 W
Types:Enchantment Creature Spirit
PT:3/1
-S:Mode$ Continuous | Affected$ Player | AddKeyword$ You can't draw more than one card each turn. | Description$ Each player can't draw more than one card each turn.
-SVar:Picture:http://www.wizards.com/global/images/magic/general/spirit_of_the_labyrinth.jpg
+S:Mode$ CantDraw | ValidPlayer$ Player | DrawLimit$ 1 | Description$ Each player can't draw more than one card each turn.
Oracle:Each player can't draw more than one card each turn.
diff --git a/forge-gui/res/cardsfolder/s/stormsurge_kraken.txt b/forge-gui/res/cardsfolder/s/stormsurge_kraken.txt
index bd94bd7f066..fb803142d8e 100644
--- a/forge-gui/res/cardsfolder/s/stormsurge_kraken.txt
+++ b/forge-gui/res/cardsfolder/s/stormsurge_kraken.txt
@@ -4,8 +4,8 @@ Types:Creature Kraken
PT:5/5
K:Hexproof
S:Mode$ Continuous | Affected$ Card.Self | AddPower$ 2 | AddToughness$ 2 | AddTrigger$ TrigBlocked | AddSVar$ StormsurgeKrakenDraw | CheckSVar$ X | SVarCompare$ GE1 | Description$ Lieutenant — As long as you control your commander, CARDNAME gets +2/+2 and has "Whenever CARDNAME becomes blocked, you may draw two cards."
-SVar:TrigBlocked:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ StormsurgeKrakenDraw | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME becomes blocked, you may draw two cards.
-SVar:StormsurgeKrakenDraw:DB$ Draw | NumCards$ 2
+SVar:TrigBlocked:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ StormsurgeKrakenDraw | TriggerDescription$ Whenever CARDNAME becomes blocked, you may draw two cards.
+SVar:StormsurgeKrakenDraw:DB$ Draw | NumCards$ 2 | OptionalDecider$ You
SVar:X:Count$Valid Card.IsCommander+YouOwn+YouCtrl
SVar:BuffedBy:Card.IsCommander
AI:RemoveDeck:Random
diff --git a/forge-gui/res/cardsfolder/s/surrakar_spellblade.txt b/forge-gui/res/cardsfolder/s/surrakar_spellblade.txt
index 42e97b5e2fb..385c0911b22 100644
--- a/forge-gui/res/cardsfolder/s/surrakar_spellblade.txt
+++ b/forge-gui/res/cardsfolder/s/surrakar_spellblade.txt
@@ -3,9 +3,9 @@ ManaCost:1 U U
Types:Creature Surrakar
PT:2/1
T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Whenever you cast a instant or sorcery spell, you may put a charge counter on CARDNAME.
-T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may draw X cards, where X is the number of charge counters on CARDNAME.
+T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may draw X cards, where X is the number of charge counters on CARDNAME.
SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ CHARGE | CounterNum$ 1
-SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ X
+SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ X | OptionalDecider$ You
SVar:X:Count$CardCounters.CHARGE
SVar:BuffedBy:Instant,Sorcery
SVar:Picture:http://www.wizards.com/global/images/magic/general/surrakar_spellblade.jpg
diff --git a/forge-gui/res/cardsfolder/s/sylvan_library.txt b/forge-gui/res/cardsfolder/s/sylvan_library.txt
index 6108e09cc6b..84f4aed8403 100644
--- a/forge-gui/res/cardsfolder/s/sylvan_library.txt
+++ b/forge-gui/res/cardsfolder/s/sylvan_library.txt
@@ -1,9 +1,8 @@
Name:Sylvan Library
ManaCost:1 G
Types:Enchantment
-T:Mode$ Phase | Phase$ Draw | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDraw | OptionalDecider$ You |TriggerDescription$ At the beginning of your draw step, you may draw two additional cards. If you do, choose two cards in your hand drawn this turn. For each of those cards, pay 4 life or put the card on top of your library.
-SVar:TrigDraw:DB$ Draw | Defined$ TriggeredPlayer | NumCards$ 2 | SubAbility$ ChooseDrawn
-SVar:ChooseDrawn:DB$ ChooseCard | ChoiceZone$ Hand | Choices$ Card.YouOwn+DrawnThisTurn | Amount$ 2 | RememberChosen$ True | Mandatory$ True | AILogic$ Worst | SubAbility$ DBPayOrReturn | NoReveal$ True
+T:Mode$ Phase | Phase$ Draw | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ At the beginning of your draw step, you may draw two additional cards. If you do, choose two cards in your hand drawn this turn. For each of those cards, pay 4 life or put the card on top of your library.
+SVar:TrigDraw:AB$ ChooseCard | ChoiceZone$ Hand | Choices$ Card.YouOwn+DrawnThisTurn | Cost$ Draw<2/You> | Amount$ 2 | RememberChosen$ True | Mandatory$ True | AILogic$ Worst | SubAbility$ DBPayOrReturn | NoReveal$ True
SVar:DBPayOrReturn:DB$ RepeatEach | UseImprinted$ True | RepeatCards$ Card.IsRemembered | Zone$ Hand | RepeatSubAbility$ DBReplace | SubAbility$ DBCleanup | NoReveal$ True | ChooseOrder$ True
SVar:DBReplace:DB$ ChangeZone | Origin$ Hand | Destination$ Library | ChangeType$ Card.IsImprinted | UnlessCost$ PayLife<4> | Mandatory$ True | StackDescription$ Put {c:Imprinted} on top of your library | UnlessPayer$ TriggeredPlayer | SubAbility$ DBCleanup | NoReveal$ True
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
diff --git a/forge-gui/res/cardsfolder/t/taborax_hopes_demise.txt b/forge-gui/res/cardsfolder/t/taborax_hopes_demise.txt
index 137517d0740..8f898cc250d 100755
--- a/forge-gui/res/cardsfolder/t/taborax_hopes_demise.txt
+++ b/forge-gui/res/cardsfolder/t/taborax_hopes_demise.txt
@@ -5,10 +5,8 @@ PT:2/2
K:Flying
S:Mode$ Continuous | Affected$ Card.Self+counters_GE5_P1P1 | AddKeyword$ Lifelink | Description$ CARDNAME has lifelink as long as it has five or more +1/+1 counters on it.
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.nonToken+Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever another nontoken creature you control dies, put a +1/+1 counter on CARDNAME. If that creature was a Cleric, you may draw a card. If you do, you lose 1 life.
-SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBDraw
-SVar:DBDraw:DB$ Draw | NumCards$ 1 | ConditionDefined$ TriggeredCardLKICopy | ConditionPresent$ Creature.Cleric | ConditionCompare$ EQ1 | OptionalDecider$ True | RememberDrawn$ True | SubAbility$ DBLoseLife
-SVar:DBLoseLife:DB$ LoseLife | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ EQ1 | Defined$ You | LifeAmount$ 1 | SubAbility$ DBCleanup
-SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
+SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBLoseLife
+SVar:DBLoseLife:DB$ LoseLife | Defined$ You | LifeAmount$ 1 | UnlessCost$ Draw<1/You> | UnlessSwitched$ True | UnlessPayer$ You | ConditionDefined$ TriggeredCardLKICopy | ConditionPresent$ Creature.Cleric | ConditionCompare$ EQ1
DeckHas:Ability$Counters
DeckHints:Type$Cleric
Oracle:Flying\nTaborax, Hope's Demise has lifelink as long as it has five or more +1/+1 counters on it.\nWhenever another nontoken creature you control dies, put a +1/+1 counter on Taborax. If that creature was a Cleric, you may draw a card. If you do, you lose 1 life.
diff --git a/forge-gui/res/cardsfolder/t/tarmogoyf.txt b/forge-gui/res/cardsfolder/t/tarmogoyf.txt
index e24fcbe995c..e2921310068 100644
--- a/forge-gui/res/cardsfolder/t/tarmogoyf.txt
+++ b/forge-gui/res/cardsfolder/t/tarmogoyf.txt
@@ -3,7 +3,6 @@ ManaCost:1 G
Types:Creature Lhurgoyf
PT:*/1+*
S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | SetToughness$ Y | Description$ CARDNAME's power is equal to the number of card types among cards in all graveyards and its toughness is equal to that number plus 1.
-SVar:X:Count$CardTypes.Graveyard
+SVar:X:Count$CardTypes.ValidGraveyard Card
SVar:Y:SVar$X/Plus.1
-SVar:Picture:http://www.wizards.com/global/images/magic/general/tarmogoyf.jpg
Oracle:Tarmogoyf's power is equal to the number of card types among cards in all graveyards and its toughness is equal to that number plus 1.
diff --git a/forge-gui/res/cardsfolder/t/temporary_truce.txt b/forge-gui/res/cardsfolder/t/temporary_truce.txt
index 8742746b707..57378fe198f 100644
--- a/forge-gui/res/cardsfolder/t/temporary_truce.txt
+++ b/forge-gui/res/cardsfolder/t/temporary_truce.txt
@@ -1,13 +1,10 @@
Name:Temporary Truce
ManaCost:1 W
Types:Sorcery
-A:SP$ RepeatEach | Cost$ 1 W | RepeatPlayers$ Player | RepeatSubAbility$ DBDraw | SpellDescription$ Each player may draw up to two cards. For each card less than two a player draws this way, that player gains 2 life.
-SVar:DBDraw:DB$ Draw | Defined$ Player.IsRemembered | Upto$ True | NumCards$ 2 | RememberDrawn$ True | SubAbility$ DBGainLife | AILogic$ GainLife
-SVar:DBGainLife:DB$ GainLife | LifeAmount$ X | Defined$ Player.IsRemembered | SubAbility$ DBCleanup
-SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
-# Player is remembered here
-SVar:Y:Count$RememberedSize/NMinus.3
+A:SP$ Draw | Defined$ Player | Upto$ True | NumCards$ 2 | SubAbility$ DBRepeat | AILogic$ GainLife | SpellDescription$ Each player may draw up to two cards. For each card less than two a player draws this way, that player gains 2 life.
+SVar:DBRepeat:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBGainLife | StackDescription$ For each card less than two a player draws this way, that player gains 2 life.
+SVar:DBGainLife:DB$ GainLife | LifeAmount$ AFNotDrawnNum | Defined$ Player.IsRemembered
+SVar:Y:Count$SVar$AFNotDrawnNum/NMinus.2
SVar:X:SVar$Y/Twice
AI:RemoveDeck:All
-SVar:Picture:http://www.wizards.com/global/images/magic/general/temporary_truce.jpg
Oracle:Each player may draw up to two cards. For each card less than two a player draws this way, that player gains 2 life.
diff --git a/forge-gui/res/cardsfolder/t/the_countdown_is_at_one.txt b/forge-gui/res/cardsfolder/t/the_countdown_is_at_one.txt
index 592bc0113f8..ba8d0030289 100644
--- a/forge-gui/res/cardsfolder/t/the_countdown_is_at_one.txt
+++ b/forge-gui/res/cardsfolder/t/the_countdown_is_at_one.txt
@@ -2,7 +2,7 @@ Name:The Countdown Is at One
ManaCost:3 R R
Types:Sorcery
A:SP$ Subgame | RememberPlayers$ NotWin | StartingLife$ 1 | SubAbility$ DBEffect | SpellDescription$ Players play a Magic subgame, starting at 1 life and using their libraries as their decks.
-SVar:DBEffect:DB$ Effect | Name$ The Countdown Is at One Effect | RememberObjects$ Player.IsRemembered | ReplacementEffects$ DmgEvent | Duration$ Permanent | SpellDescription$ For the rest of the main game, if a source would deal damage to a player who didn’t win the subgame, it deals double that damage to that player instead.
+SVar:DBEffect:DB$ Effect | Name$ The Countdown Is at One Effect | RememberObjects$ Player.IsRemembered | ReplacementEffects$ DmgEvent | Duration$ Permanent | SpellDescription$ For the rest of the main game, if a source would deal damage to a player who didn't win the subgame, it deals double that damage to that player instead.
SVar:DmgEvent:Event$ DamageDone | ValidTarget$ Player.IsRemembered | ReplaceWith$ DmgTwice | Description$ If a source would deal damage to a player who didn't win the subgame, it deals double that damage to that player instead.
SVar:DmgTwice:DB$ ReplaceEffect | VarName$ DamageAmount | VarValue$ X
SVar:X:ReplaceCount$DamageAmount/Twice
diff --git a/forge-gui/res/cardsfolder/t/the_ravens_warning.txt b/forge-gui/res/cardsfolder/t/the_ravens_warning.txt
index a1351020c64..07fa060a912 100644
--- a/forge-gui/res/cardsfolder/t/the_ravens_warning.txt
+++ b/forge-gui/res/cardsfolder/t/the_ravens_warning.txt
@@ -4,8 +4,8 @@ Types:Enchantment Saga
K:Saga:3:DBToken,DBEffect,DBWish
SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ u_1_1_bird_flying | TokenOwner$ You | SubAbility$ DBGainLife | SpellDescription$ Create a 1/1 blue Bird creature token with flying. You gain 2 life.
SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 2
-SVar:DBEffect:DB$ Effect | Triggers$ TrigDamage | SpellDescription$ Whenever one or more creatures you control with flying deal combat damage to a player this turn, look at that player’s hand and draw a card.
-SVar:TrigDamage:Mode$ DamageDoneOnce | ValidSource$ Creature.YouCtrl+withFlying | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigPeek | TriggerDescription$ Whenever one or more creatures you control with flying deal combat damage to a player this turn, look at that player’s hand and draw a card.
+SVar:DBEffect:DB$ Effect | Triggers$ TrigDamage | SpellDescription$ Whenever one or more creatures you control with flying deal combat damage to a player this turn, look at that player's hand and draw a card.
+SVar:TrigDamage:Mode$ DamageDoneOnce | ValidSource$ Creature.YouCtrl+withFlying | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigPeek | TriggerDescription$ Whenever one or more creatures you control with flying deal combat damage to a player this turn, look at that player's hand and draw a card.
SVar:TrigPeek:DB$ RevealHand | Defined$ TriggeredTarget | SubAbility$ DBDraw | SpellDescription$ Look at that player's hand.
SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 | SpellDescription$ Draw a card.
SVar:DBWish:DB$ ChangeZone | Origin$ Sideboard | Destination$ Library | OptionalDecider$ You | ChangeType$ Card.YouOwn | ChangeNum$ 1 | Optional$ True | Hidden$ True | SpellDescription$ You may put a card you own from outside the game on top of your library.
diff --git a/forge-gui/res/cardsfolder/t/thunderous_orator.txt b/forge-gui/res/cardsfolder/t/thunderous_orator.txt
index 544b330f48b..50858a47a0a 100644
--- a/forge-gui/res/cardsfolder/t/thunderous_orator.txt
+++ b/forge-gui/res/cardsfolder/t/thunderous_orator.txt
@@ -4,13 +4,13 @@ Types:Creature Kor Wizard
PT:2/2
K:Vigilance
T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ PumpFlying | TriggerDescription$ Whenever CARDNAME attacks, it gains flying until end of turn if you control a creature with flying. The same is true for first strike, double strike, deathtouch, indestructible, lifelink, menace, and trample.
-SVar:PumpFlying:DB$ Pump | KW$ Flying | ConditionPresent$ Creature.YouCtrl+withFlying | SubAbility$ PumpFirstStrike
-SVar:PumpFirstStrike:DB$ Pump | KW$ First Strike | ConditionPresent$ Creature.YouCtrl+withFirst Strike | SubAbility$ PumpDoubleStrike
-SVar:PumpDoubleStrike:DB$ Pump | KW$ Double Strike | ConditionPresent$ Creature.YouCtrl+withDouble Strike | SubAbility$ PumpDeathtouch
-SVar:PumpDeathtouch:DB$ Pump | KW$ Deathtouch | ConditionPresent$ Creature.YouCtrl+withDeathtouch | SubAbility$ PumpIndestructible
-SVar:PumpIndestructible:DB$ Pump | KW$ Indestructible | ConditionPresent$ Creature.YouCtrl+withIndestructible | SubAbility$ PumpLifelink
-SVar:PumpLifelink:DB$ Pump | KW$ Lifelink | ConditionPresent$ Creature.YouCtrl+withLifelink | SubAbility$ PumpMenace
-SVar:PumpMenace:DB$ Pump | KW$ Menace | ConditionPresent$ Creature.YouCtrl+withMenace | SubAbility$ PumpTrample
-SVar:PumpTrample:DB$ Pump | KW$ Trample | ConditionPresent$ Creature.YouCtrl+withTrample
+SVar:PumpFlying:DB$ Pump | Defined$ Self | KW$ Flying | ConditionPresent$ Creature.YouCtrl+withFlying | SubAbility$ PumpFirstStrike
+SVar:PumpFirstStrike:DB$ Pump | Defined$ Self | KW$ First Strike | ConditionPresent$ Creature.YouCtrl+withFirst Strike | SubAbility$ PumpDoubleStrike
+SVar:PumpDoubleStrike:DB$ Pump | Defined$ Self | KW$ Double Strike | ConditionPresent$ Creature.YouCtrl+withDouble Strike | SubAbility$ PumpDeathtouch
+SVar:PumpDeathtouch:DB$ Pump | Defined$ Self | KW$ Deathtouch | ConditionPresent$ Creature.YouCtrl+withDeathtouch | SubAbility$ PumpIndestructible
+SVar:PumpIndestructible:DB$ Pump | Defined$ Self | KW$ Indestructible | ConditionPresent$ Creature.YouCtrl+withIndestructible | SubAbility$ PumpLifelink
+SVar:PumpLifelink:DB$ Pump | Defined$ Self | KW$ Lifelink | ConditionPresent$ Creature.YouCtrl+withLifelink | SubAbility$ PumpMenace
+SVar:PumpMenace:DB$ Pump | Defined$ Self | KW$ Menace | ConditionPresent$ Creature.YouCtrl+withMenace | SubAbility$ PumpTrample
+SVar:PumpTrample:DB$ Pump | Defined$ Self | KW$ Trample | ConditionPresent$ Creature.YouCtrl+withTrample
DeckHints:Keyword$Flying & Keyword$First Strike & Keyword$Double Strike & Keyword$Deathtouch & Keyword$Indestructible & Keyword$Lifelink & Keyword$Menace & Keyword$Trample
Oracle:Vigilance\nWhenever Thunderous Orator attacks, it gains flying until end of turn if you control a creature with flying. The same is true for first strike, double strike, deathtouch, indestructible, lifelink, menace, and trample.
diff --git a/forge-gui/res/cardsfolder/t/topsy_turvy.txt b/forge-gui/res/cardsfolder/t/topsy_turvy.txt
index c23f4c4c340..4597cc6183c 100644
--- a/forge-gui/res/cardsfolder/t/topsy_turvy.txt
+++ b/forge-gui/res/cardsfolder/t/topsy_turvy.txt
@@ -1,7 +1,7 @@
Name:Topsy Turvy
ManaCost:2 U
Types:Enchantment
-S:Mode$ Continuous | Affected$ Player | AddKeyword$ The phases of your turn are reversed. | Description$ The phases of each player’s turn are reversed. (The phases are, in reverse order, ending, postcombat main, combat, precombat main, and beginning.)
+S:Mode$ Continuous | Affected$ Player | AddKeyword$ The phases of your turn are reversed. | Description$ The phases of each player's turn are reversed. (The phases are, in reverse order, ending, postcombat main, combat, precombat main, and beginning.)
S:Mode$ Continuous | Affected$ Player | AddKeyword$ The turn order is reversed. | CheckSVar$ X | SVarCompare$ GT2 | Description$ As long as there are more than two players in the game, the turn order is reversed.
SVar:X:PlayerCountPlayers$Amount
Oracle:The phases of each player's turn are reversed. (The phases are, in reverse order, ending, postcombat main, combat, precombat main, and beginning.)\nAs long as there are more than two players in the game, the turn order is reversed.
diff --git a/forge-gui/res/cardsfolder/t/toralf_god_of_fury_toralfs_hammer.txt b/forge-gui/res/cardsfolder/t/toralf_god_of_fury_toralfs_hammer.txt
index 431af7e2549..57871c3904b 100644
--- a/forge-gui/res/cardsfolder/t/toralf_god_of_fury_toralfs_hammer.txt
+++ b/forge-gui/res/cardsfolder/t/toralf_god_of_fury_toralfs_hammer.txt
@@ -14,7 +14,7 @@ ALTERNATE
Name:Toralf's Hammer
ManaCost:1 R
Types:Legendary Artifact Equipment
-S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddAbility$ HammerDamage | Description$ Equipped creature has "{1}{R}, {T}, Unattach CARDNAME: It deals 3 damage to any target. Return CARDNAME to it owner’s hand."
+S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddAbility$ HammerDamage | Description$ Equipped creature has "{1}{R}, {T}, Unattach CARDNAME: It deals 3 damage to any target. Return CARDNAME to it owner's hand."
SVar:HammerDamage:AB$ DealDamage | Cost$ 1 R T Unattach | NumDmg$ 3 | DamageSource$ OriginalHost | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | SubAbility$ HammerCatch | SpellDescription$ ORIGINALHOST deals 3 damage to any target. Return ORIGINALHOST to its owner's hand.
SVar:HammerCatch:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | Defined$ OriginalHost
S:Mode$ Continuous | Affected$ Card.EquippedBy+Legendary | AddPower$ 3 | Description$ Equipped creature gets +3/+0 as long as it's legendary.
diff --git a/forge-gui/res/cardsfolder/t/touch_of_the_void.txt b/forge-gui/res/cardsfolder/t/touch_of_the_void.txt
index 569d8f7cb0f..3d0c9d1a6d0 100644
--- a/forge-gui/res/cardsfolder/t/touch_of_the_void.txt
+++ b/forge-gui/res/cardsfolder/t/touch_of_the_void.txt
@@ -2,7 +2,6 @@ Name:Touch of the Void
ManaCost:2 R
Types:Sorcery
K:Devoid
-A:SP$ DealDamage | Cost$ 2 R | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 3 | RememberDamaged$ True | ReplaceDyingDefined$ Remembered | SubAbility$ DBCleanup | SpellDescription$ CARDNAME deals 3 damage to any target. If a creature dealt damage this way would die this turn, exile it instead.
+A:SP$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 3 | RememberDamaged$ True | ReplaceDyingDefined$ Remembered.Creature | SubAbility$ DBCleanup | SpellDescription$ CARDNAME deals 3 damage to any target. If a creature dealt damage this way would die this turn, exile it instead.
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
-SVar:Picture:http://www.wizards.com/global/images/magic/general/touch_of_the_void.jpg
Oracle:Devoid (This card has no color.)\nTouch of the Void deals 3 damage to any target. If a creature dealt damage this way would die this turn, exile it instead.
diff --git a/forge-gui/res/cardsfolder/t/truce.txt b/forge-gui/res/cardsfolder/t/truce.txt
index cb5d202a588..5c7c108a184 100644
--- a/forge-gui/res/cardsfolder/t/truce.txt
+++ b/forge-gui/res/cardsfolder/t/truce.txt
@@ -1,13 +1,10 @@
Name:Truce
ManaCost:2 W
Types:Instant
-A:SP$ RepeatEach | Cost$ 2 W | RepeatPlayers$ Player | RepeatSubAbility$ DBDraw | SpellDescription$ Each player may draw up to two cards. For each card less than two a player draws this way, that player gains 2 life.
-SVar:DBDraw:DB$ Draw | Defined$ Player.IsRemembered | Upto$ True | NumCards$ 2 | RememberDrawn$ True | SubAbility$ DBGainLife | AILogic$ GainLife
-SVar:DBGainLife:DB$ GainLife | LifeAmount$ X | Defined$ Player.IsRemembered | SubAbility$ DBCleanup
-SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
-# Player is remembered here
-SVar:Y:Count$RememberedSize/NMinus.3
+A:SP$ Draw | Defined$ Player | Upto$ True | NumCards$ 2 | SubAbility$ DBRepeat | AILogic$ GainLife | SpellDescription$ Each player may draw up to two cards. For each card less than two a player draws this way, that player gains 2 life.
+SVar:DBRepeat:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBGainLife | StackDescription$ For each card less than two a player draws this way, that player gains 2 life.
+SVar:DBGainLife:DB$ GainLife | LifeAmount$ AFNotDrawnNum | Defined$ Player.IsRemembered
+SVar:Y:Count$SVar$AFNotDrawnNum/NMinus.2
SVar:X:SVar$Y/Twice
AI:RemoveDeck:All
-SVar:Picture:http://www.wizards.com/global/images/magic/general/truce.jpg
Oracle:Each player may draw up to two cards. For each card less than two a player draws this way, that player gains 2 life.
diff --git a/forge-gui/res/cardsfolder/t/tymaret_calls_the_dead.txt b/forge-gui/res/cardsfolder/t/tymaret_calls_the_dead.txt
index 318fc6bacb8..bf98bc6bba7 100644
--- a/forge-gui/res/cardsfolder/t/tymaret_calls_the_dead.txt
+++ b/forge-gui/res/cardsfolder/t/tymaret_calls_the_dead.txt
@@ -2,11 +2,8 @@ Name:Tymaret Calls the Dead
ManaCost:2 B
Types:Enchantment Saga
K:Saga:3:DBMill,DBMill,DBGainLife
-SVar:DBMill:DB$ Mill | Defined$ You | NumCards$ 3 | SubAbility$ DBChooseCard | SpellDescription$ Mill three cards. Then you may exile a creature or enchantment card from your graveyard. If you do, create a 2/2 black Zombie creature token.
-SVar:DBChooseCard:DB$ ChooseCard | Choices$ Creature.YouCtrl,Enchantment.YouCtrl | Optional$ Yes | ChoiceTitle$ Choose a creature or enchantment to exile | ChoiceZone$ Graveyard | Amount$ 1 | AILogic$ WorstCard | SubAbility$ DBChangeZone
-SVar:DBChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | Defined$ ChosenCard | RememberChanged$ True | SubAbility$ DBToken
-SVar:DBToken:DB$ Token | TokenScript$ b_2_2_zombie | TokenOwner$ You | TokenAmount$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup
-SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True | ClearRemembered$ True
+SVar:DBMill:DB$ Mill | Defined$ You | NumCards$ 3 | SubAbility$ DBToken | SpellDescription$ Mill three cards. Then you may exile a creature or enchantment card from your graveyard. If you do, create a 2/2 black Zombie creature token.
+SVar:DBToken:DB$ Token | TokenScript$ b_2_2_zombie | TokenOwner$ You | TokenAmount$ 1 | UnlessCost$ ExileFromGrave<1/Creature;Enchantment/creature or enchantment card> | UnlessSwitched$ True | UnlessPayer$ You
SVar:DBGainLife:DB$ GainLife | LifeAmount$ X | SubAbility$ DBScry | SpellDescription$ You gain X life and scry X, where X is the number of Zombies you control.
SVar:DBScry:DB$ Scry | ScryNum$ X
SVar:X:Count$Valid Zombie.YouCtrl
diff --git a/forge-gui/res/cardsfolder/u/ugin_the_ineffable.txt b/forge-gui/res/cardsfolder/u/ugin_the_ineffable.txt
index da5f0aa87ff..f34c5a9f83a 100644
--- a/forge-gui/res/cardsfolder/u/ugin_the_ineffable.txt
+++ b/forge-gui/res/cardsfolder/u/ugin_the_ineffable.txt
@@ -10,7 +10,7 @@ SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True
SVar:TrigLeavesBattlefield:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.IsImprinted | Execute$ DBReturn | TriggerZones$ Command | TriggerDescription$ When that token leaves the battlefield, put the exiled card into your hand.
SVar:DBReturn:DB$ ChangeZone | Defined$ RememberedLKI | Origin$ Exile | Destination$ Hand | SubAbility$ DBExile
SVar:DBExile:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile
-SVar:MayLook:Mode$ Continuous | MayLookAt$ You | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ You may look at the exiled face-down card again any time you wish. If another player gains control of the Spirit token, that player can’t look at the exiled card.
+SVar:MayLook:Mode$ Continuous | MayLookAt$ You | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ You may look at the exiled face-down card again any time you wish. If another player gains control of the Spirit token, that player can't look at the exiled card.
A:AB$ Destroy | Cost$ SubCounter<3/LOYALTY> | ValidTgts$ Permanent.nonColorless | TgtPrompt$ Select target permanent that's one or more colors | Planeswalker$ True | SpellDescription$ Destroy target permanent that's one or more colors.
DeckHas:Ability$Token
DeckHints:Color$Colorless
diff --git a/forge-gui/res/cardsfolder/u/uvilda_dean_of_perfection_nassari_dean_of_expression.txt b/forge-gui/res/cardsfolder/u/uvilda_dean_of_perfection_nassari_dean_of_expression.txt
index 3c6c07b058c..81edf328196 100644
--- a/forge-gui/res/cardsfolder/u/uvilda_dean_of_perfection_nassari_dean_of_expression.txt
+++ b/forge-gui/res/cardsfolder/u/uvilda_dean_of_perfection_nassari_dean_of_expression.txt
@@ -8,7 +8,7 @@ SVar:DBAddTriggers:DB$ Animate | Defined$ Remembered | Triggers$ TrigRemoveCount
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:TrigRemoveCounter:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Exile | Execute$ DBRemoveCounter | TriggerDescription$ At the beginning of your upkeep, if this card is exiled, remove a hone counter from it.
SVar:DBRemoveCounter:DB$ RemoveCounter | Defined$ Self | CounterType$ HONE | CounterNum$ 1
-SVar:TrigCast:Mode$ CounterRemoved | TriggerZones$ Exile | ValidCard$ Card.Self | CounterType$ HONE | NewCounterAmount$ 0 | Execute$ DBCast | TriggerDescription$ When the last hone counter is removed from this card, if it’s exiled, you may cast it. It costs {4} less to cast this way.
+SVar:TrigCast:Mode$ CounterRemoved | TriggerZones$ Exile | ValidCard$ Card.Self | CounterType$ HONE | NewCounterAmount$ 0 | Execute$ DBCast | TriggerDescription$ When the last hone counter is removed from this card, if it's exiled, you may cast it. It costs {4} less to cast this way.
SVar:DBCast:DB$ Play | Defined$ Self | PlayReduceCost$ 4 | ValidSA$ Spell
AlternateMode:Modal
SVar:BuffedBy:Instant,Sorcery
diff --git a/forge-gui/res/cardsfolder/upcoming/aim_for_the_head.txt b/forge-gui/res/cardsfolder/upcoming/aim_for_the_head.txt
new file mode 100644
index 00000000000..fbeb8222faa
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/aim_for_the_head.txt
@@ -0,0 +1,7 @@
+Name:Aim for the Head
+ManaCost:2 B
+Types:Sorcery
+A:SP$ Charm | Choices$ DBChangeZone1,DBChangeZone2 | Defined$ You
+SVar:DBChangeZone1:DB$ ChangeZone | ValidTgts$ Creature.Zombie | TgtPrompt$ Choose target Zombie | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target Zombie.
+SVar:DBChangeZone2:DB$ ChangeZone | Origin$ Hand | Destination$ Exile | DefinedPlayer$ Targeted | ValidTgts$ Opponent | Chooser$ Targeted | ChangeType$ Card | ChangeNum$ 2 | IsCurse$ True | Mandatory$ True | SpellDescription$ Target opponent exiles two cards from their hand.
+Oracle:Choose one —\n• Exile target Zombie.\n• Target opponent exiles two cards from their hand.
diff --git a/forge-gui/res/cardsfolder/upcoming/alchemists_retrieval.txt b/forge-gui/res/cardsfolder/upcoming/alchemists_retrieval.txt
new file mode 100644
index 00000000000..94b745ec71d
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/alchemists_retrieval.txt
@@ -0,0 +1,6 @@
+Name:Alchemist's Retrieval
+ManaCost:U
+Types:Instant
+A:SP$ ChangeZone | ValidTgts$ Permanent.YouCtrl+nonLand | TgtPrompt$ Select target nonland permanent you control | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target nonland permanent [you control] to its owner's hand.
+A:SP$ ChangeZone | Cost$ 1 U | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent | Origin$ Battlefield | Destination$ Hand | PrecostDesc$ Cleave | CostDesc$ {1}{U} | NonBasicSpell$ True | SpellDescription$ (You may cast this spell for its cleave cost. If you do, remove the words in square brackets.)
+Oracle:Cleave {1}{U} (You may cast this spell for its cleave cost. If you do, remove the words in square brackets.)\nReturn target nonland permanent [you control] to its owner's hand.
diff --git a/forge-gui/res/cardsfolder/upcoming/ancestral_anger.txt b/forge-gui/res/cardsfolder/upcoming/ancestral_anger.txt
new file mode 100644
index 00000000000..0dc4c08d62f
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/ancestral_anger.txt
@@ -0,0 +1,8 @@
+Name:Ancestral Anger
+ManaCost:R
+Types:Sorcery
+A:SP$ Pump | Cost$ R | NumCards$ 1 | ValidTgts$ Creature | KW$ Trample | NumAtt$ +X | SubAbility$ DBDraw | SpellDescription$ Until end of turn, target creature gains trample and gets +X/+0, where X is 1 plus the number of cards named Ancestral Anger in your graveyard.
+SVar:DBDraw:DB$ Draw | NumCards$ 1 | SpellDescription$ Draw a card.
+SVar:X:Count$ValidGraveyard Card.YouOwn+namedAncestral Anger/Plus.1
+DeckHints:Name$Ancestral Anger
+Oracle:Until end of turn, target creature gains trample and gets +X/+0, where X is 1 plus the number of cards named Ancestral Anger in your graveyard.\nDraw a card.
diff --git a/forge-gui/res/cardsfolder/upcoming/apprentice_sharpshooter.txt b/forge-gui/res/cardsfolder/upcoming/apprentice_sharpshooter.txt
index 647b0249b42..7bb04e6e6f8 100644
--- a/forge-gui/res/cardsfolder/upcoming/apprentice_sharpshooter.txt
+++ b/forge-gui/res/cardsfolder/upcoming/apprentice_sharpshooter.txt
@@ -1,5 +1,5 @@
Name:Apprentice Sharpshooter
-ManaCost:1 G
+ManaCost:2 G
Types:Creature Human Archer
PT:1/4
K:Reach
diff --git a/forge-gui/res/cardsfolder/upcoming/arterial_alchemy.txt b/forge-gui/res/cardsfolder/upcoming/arterial_alchemy.txt
new file mode 100644
index 00000000000..6cb32c4b351
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/arterial_alchemy.txt
@@ -0,0 +1,11 @@
+Name:Arterial Alchemy
+ManaCost:2 R
+Types:Enchantment
+T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a Blood token for each opponent you have. (It's an artifact with "{1}, {T}, Discard a card, Sacrifice this artifact: Draw a card.")
+SVar:TrigToken:DB$ Token | TokenAmount$ X | TokenScript$ c_a_blood_draw
+SVar:X:PlayerCountOpponents$Amount
+S:Mode$ Continuous | Affected$ Blood.token+YouCtrl | AddType$ Equipment | AddStaticAbility$ BloodEquip | AddKeyword$ Equip:2 | Description$ Blood tokens you control are Equipment in addition to their other types and have "Equipped creature gets +2/+0" and equip {2}.
+SVar:BloodEquip:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 2 | Description$ Equipped creature gets +2/+0.
+DeckHas:Ability$Token & Ability$Sacrifice & Type$Blood|Equipment
+DeckHints:Type$Blood
+Oracle:When Arterial Alchemy enters the battlefield, create a Blood token for each opponent you have. (It's an artifact with "{1}, {T}, Discard a card, Sacrifice this artifact: Draw a card.")\nBlood tokens you control are Equipment in addition to their other types and have "Equipped creature gets +2/+0" and equip {2}.
diff --git a/forge-gui/res/cardsfolder/upcoming/avabruck_caretaker_hollowhenge_huntmaster.txt b/forge-gui/res/cardsfolder/upcoming/avabruck_caretaker_hollowhenge_huntmaster.txt
new file mode 100644
index 00000000000..b33838a3c73
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/avabruck_caretaker_hollowhenge_huntmaster.txt
@@ -0,0 +1,26 @@
+Name:Avabruck Caretaker
+ManaCost:4 G G
+Types:Creature Human Werewolf
+PT:4/4
+K:Hexproof
+T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of combat on your turn, put two +1/+1 counters on another target creature you control.
+SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature.Other+YouCtrl | TgtPrompt$ Select another target creature you control | CounterType$ P1P1 | CounterNum$ 2
+K:Daybound
+AlternateMode:DoubleFaced
+DeckHas:Ability$Counters
+Oracle:Hexproof\nAt the beginning of combat on your turn, put two +1/+1 counters on another target creature you control.\nDaybound (If a player casts no spells during their own turn, it becomes night next turn.)
+
+ALTERNATE
+
+Name:Hollowhenge Huntmaster
+ManaCost:no cost
+Colors:green
+Types:Creature Werewolf
+PT:6/6
+K:Hexproof
+S:Mode$ Continuous | Affected$ Permanent.Other+YouCtrl | AddKeyword$ Hexproof | Description$ Other permanents you control have hexproof.
+T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounterAll | TriggerDescription$ At the beginning of combat on your turn, put two +1/+1 counters on each creature you control.
+SVar:TrigPutCounterAll:DB$ PutCounterAll | ValidCards$ Creature.YouCtrl | CounterType$ P1P1 | CounterNum$ 2
+K:Nightbound
+DeckHas:Ability$Counters
+Oracle:Hexproof\nOther permanents you control have hexproof.\nAt the beginning of combat on your turn, put two +1/+1 counters on each creature you control.\nNightbound (If a player casts at least two spells during their own turn, it becomes day next turn.)
diff --git a/forge-gui/res/cardsfolder/upcoming/ballista_watcher_ballista_wielder.txt b/forge-gui/res/cardsfolder/upcoming/ballista_watcher_ballista_wielder.txt
new file mode 100644
index 00000000000..e96b4771c92
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/ballista_watcher_ballista_wielder.txt
@@ -0,0 +1,21 @@
+Name:Ballista Watcher
+ManaCost:2 R R
+Types:Creature Human Soldier Werewolf
+PT:4/3
+K:Daybound
+A:AB$ DealDamage | Cost$ 2 R T | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to any target.
+AlternateMode:DoubleFaced
+Oracle:{2}{R}, {T}: Ballista Watcher deals 1 damage to any target.\nDaybound (If a player casts no spells during their own turn, it becomes night next turn.)
+
+ALTERNATE
+
+Name:Ballista Wielder
+ManaCost:no cost
+Colors:red
+Types:Creature Werewolf
+PT:5/5
+K:Nightbound
+A:AB$ DealDamage | Cost$ 2 R | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 1 | RememberDamaged$ True | SubAbility$ DBNoBlock | SpellDescription$ CARDNAME deals 1 damage to any target. A creature dealt damage this way can't block this turn.
+SVar:DBNoBlock:DB$ Pump | ConditionDefined$ Remembered | ConditionPresent$ Creature | KW$ HIDDEN CARDNAME can't block. | Defined$ Remembered | SubAbility$ DBCleanup | StackDescription$ A creature dealt damage this way can't block this turn.
+SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
+Oracle:{2}{R}: Ballista Wielder deals 1 damage to any target. A creature dealt damage this way can't block this turn.\nNightbound (If a player casts at least two spells during their own turn, it becomes day next turn.)
diff --git a/forge-gui/res/cardsfolder/upcoming/binding_geist_spectral_binding.txt b/forge-gui/res/cardsfolder/upcoming/binding_geist_spectral_binding.txt
new file mode 100644
index 00000000000..0a7a556c36f
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/binding_geist_spectral_binding.txt
@@ -0,0 +1,24 @@
+Name:Binding Geist
+ManaCost:2 U
+Types:Creature Spirit
+PT:3/1
+K:Disturb:1 U
+T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, target creature an opponent controls gets -2/-0 until end of turn.
+SVar:TrigPump:DB$ Pump | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | NumAtt$ -2 | IsCurse$ True
+AlternateMode:DoubleFaced
+DeckHas:Ability$Graveyard
+SVar:HasAttackEffect:TRUE
+Oracle:Whenever Binding Geist attacks, target creature an opponent controls gets -2/-0 until end of turn.\nDisturb {1}{U} (You may cast this card from your graveyard transformed for its disturb cost.)
+
+ALTERNATE
+
+Name:Spectral Binding
+ManaCost:no cost
+Colors:blue
+Types:Enchantment Aura
+K:Enchant creature
+A:SP$ Attach | ValidTgts$ Creature | TgtPrompt$ Select target creature | AILogic$ Curse
+S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ -2 | Description$ Enchanted creature gets -2/-0.
+R:Event$ Moved | ValidCard$ Card.Self | Destination$ Graveyard | ReplaceWith$ Exile | Description$ If CARDNAME would be put into a graveyard from anywhere, exile it instead.
+SVar:Exile:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Exile | Defined$ ReplacedCard
+Oracle:Enchant creature\nEnchanted creature gets -2/-0.\nIf Spectral Binding would be put into a graveyard from anywhere, exile it instead.
diff --git a/forge-gui/res/cardsfolder/upcoming/bleed_dry.txt b/forge-gui/res/cardsfolder/upcoming/bleed_dry.txt
new file mode 100644
index 00000000000..fd252d094c8
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/bleed_dry.txt
@@ -0,0 +1,5 @@
+Name:Bleed Dry
+ManaCost:2 B B
+Types:Instant
+A:SP$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -13 | NumDef$ -13 | IsCurse$ True | ReplaceDyingDefined$ Targeted | StackDescription$ {c:Targeted} gets -13/-13 until end of turn. If that creature would die this turn, exile it instead. | SpellDescription$ Target creature gets -13/-13 until end of turn. If that creature would die this turn, exile it instead.
+Oracle:Target creature gets -13/-13 until end of turn. If that creature would die this turn, exile it instead.
diff --git a/forge-gui/res/cardsfolder/upcoming/blood_fountain.txt b/forge-gui/res/cardsfolder/upcoming/blood_fountain.txt
new file mode 100644
index 00000000000..3814eb58160
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/blood_fountain.txt
@@ -0,0 +1,8 @@
+Name:Blood Fountain
+ManaCost:B
+Types:Artifact
+T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ DBToken | TriggerDescription$ When CARDNAME enters the battlefield, create a Blood token. (It's an artifact with "{1}, {T}, Discard a card, Sacrifice this artifact: Draw a card.")
+SVar:DBToken:DB$ Token | TokenScript$ c_a_blood_draw
+A:AB$ ChangeZone | Cost$ 3 B T Sac<1/CARDNAME> | Origin$ Graveyard | Destination$ Hand | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Select up to two target creature cards in your graveyard | ValidTgts$ Creature.YouOwn | SpellDescription$ Return up to two target creature cards from your graveyard to your hand.
+DeckHas:Ability$Token & Ability$Sacrifice & Type$Blood & Ability$Graveyard
+Oracle:When Blood Fountain enters the battlefield, create a Blood token. (It's an artifact with "{1}, {T}, Discard a card, Sacrifice this artifact: Draw a card.")\n{3}{B}, {T}, Sacrifice Blood Fountain: Return up to two target creature cards from your graveyard to your hand.
diff --git a/forge-gui/res/cardsfolder/upcoming/blood_hypnotist.txt b/forge-gui/res/cardsfolder/upcoming/blood_hypnotist.txt
index a87f420e7c6..ab97834d3a6 100644
--- a/forge-gui/res/cardsfolder/upcoming/blood_hypnotist.txt
+++ b/forge-gui/res/cardsfolder/upcoming/blood_hypnotist.txt
@@ -3,7 +3,7 @@ ManaCost:2 R
Types:Creature Vampire
PT:3/3
K:CARDNAME can't block.
-T:Mode$ Sacrificed | ValidCard$ Blood.token+YouCtrl | TriggerZone$ Battlefield | Execute$ TrigPump | ActivationLimit$ 1 | TriggerDescription$ Whenever you sacrifice one or more Blood tokens, target creature can't block this turn. This ability triggers only once each turn.
+T:Mode$ Sacrificed | ValidCard$ Blood.token+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | ActivationLimit$ 1 | TriggerDescription$ Whenever you sacrifice one or more Blood tokens, target creature can't block this turn. This ability triggers only once each turn.
SVar:TrigPump:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME can't block. | IsCurse$ True
DeckNeeds:Type$Blood
Oracle:Blood Hypnotist can't block.\nWhenever you sacrifice one or more Blood tokens, target creature can't block this turn. This ability triggers only once each turn.
diff --git a/forge-gui/res/cardsfolder/upcoming/blood_petal_celebrant.txt b/forge-gui/res/cardsfolder/upcoming/blood_petal_celebrant.txt
new file mode 100644
index 00000000000..6bca4e41a14
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/blood_petal_celebrant.txt
@@ -0,0 +1,9 @@
+Name:Blood Petal Celebrant
+ManaCost:1 R
+Types:Creature Vampire
+PT:2/1
+S:Mode$ Continuous | Affected$ Card.Self+attacking | AddKeyword$ First strike | Description$ CARDNAME has first strike as long as it's attacking.
+T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME dies, create a Blood token. (It's an artifact with "{1}, {T}, Discard a card, Sacrifice this artifact: Draw a card.")
+SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_blood_draw | TokenOwner$ You
+DeckHas:Ability$Token & Ability$Sacrifice & Type$Blood
+Oracle:Blood Petal Celebrant has first strike as long as it's attacking.\nWhen Blood Petal Celebrant dies, create a Blood token. (It's an artifact with "{1}, {T}, Discard a card, Sacrifice this artifact: Draw a card.")
diff --git a/forge-gui/res/cardsfolder/upcoming/blood_servitor.txt b/forge-gui/res/cardsfolder/upcoming/blood_servitor.txt
new file mode 100644
index 00000000000..9f4c11fc287
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/blood_servitor.txt
@@ -0,0 +1,8 @@
+Name:Blood Servitor
+ManaCost:3
+Types:Artifact Creature Construct
+PT:2/2
+T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigBlood | TriggerDescription$ When CARDNAME enters the battlefield, create a Blood token. (It's an artifact with "{1}, {T}, Discard a card, Sacrifice this artifact: Draw a card.")
+SVar:TrigBlood:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_blood_draw | TokenOwner$ You
+DeckHas:Ability$Token & Ability$Sacrifice & Type$Blood
+Oracle:When Blood Servitor enters the battlefield, create a Blood token. (It's an artifact with "{1}, {T}, Discard a card, Sacrifice this artifact: Draw a card.")
diff --git a/forge-gui/res/cardsfolder/upcoming/bloodcrazed_socialite.txt b/forge-gui/res/cardsfolder/upcoming/bloodcrazed_socialite.txt
new file mode 100644
index 00000000000..29da220ad87
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/bloodcrazed_socialite.txt
@@ -0,0 +1,13 @@
+Name:Bloodcrazed Socialite
+ManaCost:3 B
+Types:Creature Vampire
+PT:3/3
+K:Menace
+T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ DBToken | TriggerDescription$ When CARDNAME enters the battlefield, create a Blood token.
+SVar:DBToken:DB$ Token | TokenScript$ c_a_blood_draw
+T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, you may sacrifice a Blood token. If you do, it gets +2/+2 until end of turn.
+SVar:TrigPump:AB$ Pump | Cost$ Sac<1/Blood.token/Blood token> | Defined$ Self | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ CARDNAME gets +2/+2 until end of turn.
+DeckHas:Ability$Token & Ability$Sacrifice & Type$Blood
+DeckHints:Type$Blood
+SVar:HasAttackEffect:TRUE
+Oracle:Menace\nWhen Bloodcrazed Socialite enters the battlefield, create a Blood token. (It's an artifact with "{1}, {T}, Discard a card, Sacrifice this artifact: Draw a card.")\nWhenever Bloodcrazed Socialite attacks, you may sacrifice a Blood token. If you do, it gets +2/+2 until end of turn.
diff --git a/forge-gui/res/cardsfolder/upcoming/bloody_betrayal.txt b/forge-gui/res/cardsfolder/upcoming/bloody_betrayal.txt
new file mode 100755
index 00000000000..18163b3da11
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/bloody_betrayal.txt
@@ -0,0 +1,7 @@
+Name:Bloody Betrayal
+ManaCost:2 R
+Types:Sorcery
+A:SP$ GainControl | ValidTgts$ Creature | TgtPrompt$ Select target creature | Untap$ True | AddKWs$ Haste | LoseControl$ EOT | SubAbility$ DBToken | SpellDescription$ Gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn.
+SVar:DBToken:DB$ Token | TokenScript$ c_a_blood_draw | SpellDescription$ Create a Blood token. (It's an artifact with "{1}, {T}, Discard a card, Sacrifice this artifact: Draw a card.")
+DeckHas:Ability$Token & Ability$Sacrifice & Type$Blood
+Oracle:Gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn. Create a Blood token. (It's an artifact with "{1}, {T}, Discard a card, Sacrifice this artifact: Draw a card.")
diff --git a/forge-gui/res/cardsfolder/upcoming/breath_of_the_sleepless.txt b/forge-gui/res/cardsfolder/upcoming/breath_of_the_sleepless.txt
new file mode 100644
index 00000000000..d7f24482165
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/breath_of_the_sleepless.txt
@@ -0,0 +1,9 @@
+Name:Breath of the Sleepless
+ManaCost:3 U
+Types:Enchantment
+S:Mode$ Continuous | EffectZone$ Battlefield | Affected$ Spirit.nonToken+YouCtrl | MayPlay$ True | MayPlayPlayer$ CardOwner | MayPlayWithFlash$ True | MayPlayDontGrantZonePermissions$ True | AffectedZone$ Hand,Graveyard,Library,Exile | Description$ You may cast Spirit spells this turn as though they had flash.
+T:Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | OpponentTurn$ True | Execute$ TrigTap | TriggerDescription$ Whenever you cast a creature spell during an opponent's turn, tap up to one target creature.
+SVar:TrigTap:DB$ Tap | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Creature | TgtPrompt$ Select up to one target creature
+DeckHints:Type$Spirit
+SVar:BuffedBy:Creature.withFlash
+Oracle:You may cast Spirit spells as though they had flash.\nWhenever you cast a creature spell during an opponent's turn, tap up to one target creature.
diff --git a/forge-gui/res/cardsfolder/upcoming/brides_gown.txt b/forge-gui/res/cardsfolder/upcoming/brides_gown.txt
new file mode 100644
index 00000000000..df09c11dfac
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/brides_gown.txt
@@ -0,0 +1,8 @@
+Name:Bride's Gown
+ManaCost:1 W
+Types:Artifact Equipment
+S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 2 | Description$ Equipped creature gets +2/+0. It gets an additional +0/+2 and has deathtouch as long as an Equipment named Groom's Finery is attached to a creature you control.
+S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddToughness$ 2 | AddKeyword$ First strike | IsPresent$ Equipment.AttachedTo Creature.YouCtrl+namedGroom's Finery | Secondary$ True
+K:Equip:2
+DeckHints:Name$Groom's Finery
+Oracle:Equipped creature gets +2/+0. It gets an additional +0/+2 and has first strike as long as an Equipment named Groom's Finery is attached to a creature you control.\nEquip {2} ({2}: Attach to target creature you control. Equip only as a sorcery.)
diff --git a/forge-gui/res/cardsfolder/upcoming/cartographers_survey.txt b/forge-gui/res/cardsfolder/upcoming/cartographers_survey.txt
new file mode 100644
index 00000000000..fd8e263d25f
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/cartographers_survey.txt
@@ -0,0 +1,5 @@
+Name:Cartographer's Survey
+ManaCost:3 G
+Types:Sorcery
+A:SP$ Dig | DigNum$ 7 | ChangeNum$ 2 | Optional$ True | PrimaryPrompt$ You may choose up to two land cards | ChangeValid$ Land | DestinationZone$ Battlefield | Tapped$ True | RestRandomOrder$ True | StackDescription$ SpellDescription | SpellDescription$ Look at the top seven cards of your library. Put up to two land cards from among them onto the battlefield tapped. Put the rest on the bottom of your library in a random order.
+Oracle:Look at the top seven cards of your library. Put up to two land cards from among them onto the battlefield tapped. Put the rest on the bottom of your library in a random order.
diff --git a/forge-gui/res/cardsfolder/upcoming/catapult_fodder_catapult_captain.txt b/forge-gui/res/cardsfolder/upcoming/catapult_fodder_catapult_captain.txt
new file mode 100644
index 00000000000..13fa40e4380
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/catapult_fodder_catapult_captain.txt
@@ -0,0 +1,20 @@
+Name:Catapult Fodder
+ManaCost:2 B
+Types:Creature Zombie
+PT:1/5
+T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Battlefield | IsPresent$ Creature.YouCtrl+powerLTtoughness | PresentCompare$ GE3 | Execute$ TrigTransform | TriggerDescription$ At the beginning of combat on your turn, if you control three or more creatures that each have toughness greater than their power, transform CARDNAME.
+SVar:TrigTransform:DB$ SetState | Defined$ Self | Mode$ Transform
+SVar:PlayMain1:TRUE
+AlternateMode:DoubleFaced
+Oracle:At the beginning of combat on your turn, if you control three or more creatures that each have toughness greater than their power, transform Catapult Fodder.
+
+ALTERNATE
+
+Name:Catapult Captain
+ManaCost:no cost
+Colors:black
+Types:Creature Zombie
+PT:2/6
+A:AB$ LoseLife | Cost$ 2 B T Sac<1/Creature.Other/another creature> | ValidTgts$ Opponent | LifeAmount$ X | TgtPrompt$ Select target opponent | SpellDescription$ Target opponent loses life equal to the sacrificed creature's toughness.
+SVar:X:Sacrificed$CardToughness
+Oracle:{2}{B}, {T}, Sacrifice another creature: Target opponent loses life equal to the sacrificed creature's toughness.
diff --git a/forge-gui/res/cardsfolder/upcoming/cemetery_desecrator.txt b/forge-gui/res/cardsfolder/upcoming/cemetery_desecrator.txt
new file mode 100644
index 00000000000..33e9ffaa5a9
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/cemetery_desecrator.txt
@@ -0,0 +1,15 @@
+Name:Cemetery Desecrator
+ManaCost:4 B B
+Types:Creature Zombie
+PT:4/4
+T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield or dies, exile another card from a graveyard.
+T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigExile | Secondary$ True | TriggerDescription$ When CARDNAME enters the battlefield or dies, exile another card from a graveyard.
+SVar:TrigExile:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | Hidden$ True | RememberChanged$ True | ChangeType$ Card.Other | ChangeNum$ 1 | Mandatory$ True | AILogic$ ExilePreference:HighestCMC | SubAbility$ DBImmediateTrigger
+SVar:DBImmediateTrigger:DB$ ImmediateTrigger | ConditionDefined$ Remembered | ConditionPresent$ Card | Execute$ TrigCharm | TriggerDescription$ When you do, ABILITY
+SVar:TrigCharm:DB$ Charm | Choices$ DBRemoveCounter,DBPump
+SVar:DBRemoveCounter:DB$ RemoveCounter | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | CounterType$ Any | CounterNum$ X | SubAbility$ DBCleanup | SpellDescription$ Remove X counters from target permanent, where X is the mana value of the exiled card.
+SVar:DBPump:DB$ Pump | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | IsCurse$ True | NumAtt$ -X | NumDef$ -X | SubAbility$ DBCleanup | SpellDescription$ Target creature an opponent controls gets -X/-X until end of turn, where X is the mana value of the exiled card.
+SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
+SVar:X:Remembered$CardManaCost
+DeckHas:Ability$Graveyard
+Oracle:Menace\nWhen Cemetery Desecrator enters the battlefield or dies, exile another card from a graveyard. When you do, choose one —\n• Remove X counters from target permanent, where X is the mana value of the exiled card.\n• Target creature an opponent controls gets -X/-X until end of turn, where X is the mana value of the exiled card.
diff --git a/forge-gui/res/cardsfolder/upcoming/cemetery_gatekeeper.txt b/forge-gui/res/cardsfolder/upcoming/cemetery_gatekeeper.txt
new file mode 100644
index 00000000000..6b666851a42
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/cemetery_gatekeeper.txt
@@ -0,0 +1,12 @@
+Name:Cemetery Gatekeeper
+ManaCost:1 R
+Types:Creature Vampire
+PT:2/1
+K:First strike
+T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile a card from a graveyard.
+SVar:TrigExile:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | ChangeType$ Card | ChangeNum$ 1 | SelectPrompt$ Select a card from a graveyard | Mandatory$ True | Hidden$ True | Imprint$ True | AILogic$ ExilePreference:MostProminentOppType
+T:Mode$ LandPlayed | ValidCard$ Land.sharesCardTypeWith Imprinted.ExiledWithSource | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a player plays a land or casts a spell, if it shares a card type with the exiled card, Cemetery Gatekeeper deals 2 damage to that player.
+T:Mode$ SpellCast | ValidCard$ Card.sharesCardTypeWith Imprinted.ExiledWithSource | ValidActivatingPlayer$ Player | TriggerZones$ Battlefield | Execute$ TrigDamage | Secondary$ True | TriggerDescription$ Whenever a player plays a land or casts a spell, if it shares a card type with the exiled card, Cemetery Gatekeeper deals 2 damage to that player.
+SVar:TrigDamage:DB$ DealDamage | NumDmg$ 2 | Defined$ TriggeredCardController
+SVar:AICastPreference:NeverCastIfLifeBelow$ 8
+Oracle:First strike\nWhen Cemetery Gatekeeper enters the battlefield, exile a card from a graveyard.\nWhenever a player plays a land or casts a spell, if it shares a card type with the exiled card, Cemetery Gatekeeper deals 2 damage to that player.
diff --git a/forge-gui/res/cardsfolder/upcoming/cemetery_illuminator.txt b/forge-gui/res/cardsfolder/upcoming/cemetery_illuminator.txt
new file mode 100644
index 00000000000..bdda273ec21
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/cemetery_illuminator.txt
@@ -0,0 +1,12 @@
+Name:Cemetery Illuminator
+ManaCost:1 U U
+Types:Creature Spirit
+PT:2/3
+K:Flying
+T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield or attacks, exile a card from a graveyard.
+T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigExile | Secondary$ True | TriggerDescription$ Whenever CARDNAME enters the battlefield or attacks, exile a card from a graveyard.
+SVar:TrigExile:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | ChangeType$ Card | ChangeNum$ 1 | SelectPrompt$ Select a card from a graveyard | Mandatory$ True | Hidden$ True | Imprint$ True | AILogic$ ExilePreference:MostProminentOwnType
+S:Mode$ Continuous | Affected$ Card.TopLibrary+YouCtrl | AffectedZone$ Library | MayLookAt$ You | Description$ You may look at the top card of your library any time.
+S:Mode$ Continuous | EffectZone$ Battlefield | Affected$ Card.nonLand+TopLibrary+YouCtrl+sharesCardTypeWith Imprinted.ExiledWithSource | AffectedZone$ Library | MayPlay$ True | MayPlayLimit$ 1 | Description$ Once each turn, you may cast a spell from the top of your library if it shares a card type with a card exiled with CARDNAME.
+DeckHas:Ability$Graveyard
+Oracle:Flying\nWhenever Cemetery Illuminator enters the battlefield or attacks, exile a card from a graveyard.\nYou may look at the top card of your library any time.\nOnce each turn, you may cast a spell from the top of your library if it shares a card type with a card exiled with Cemetery Illuminator.
diff --git a/forge-gui/res/cardsfolder/upcoming/cemetery_protector.txt b/forge-gui/res/cardsfolder/upcoming/cemetery_protector.txt
index 913eea7fe6e..a48f1e2068d 100644
--- a/forge-gui/res/cardsfolder/upcoming/cemetery_protector.txt
+++ b/forge-gui/res/cardsfolder/upcoming/cemetery_protector.txt
@@ -4,7 +4,7 @@ Types:Creature Human Soldier
PT:3/4
K:Flash
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile a card from a graveyard.
-SVar:TrigExile:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | ChangeType$ Card | ChangeNum$ 1 | SelectPrompt$ Select a card from a graveyard | Mandatory$ True | Hidden$ True | Imprint$ True
+SVar:TrigExile:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | ChangeType$ Card | ChangeNum$ 1 | SelectPrompt$ Select a card from a graveyard | Mandatory$ True | Hidden$ True | Imprint$ True | AILogic$ ExilePreference:Land
T:Mode$ LandPlayed | ValidCard$ Land.YouOwn+sharesCardTypeWith Imprinted.ExiledWithSource | Execute$ TrigToken | TriggerZones$ Battlefield | TriggerDescription$ Whenever you play a land or cast a spell, if it shares a card type with the exiled card, create a 1/1 white Human creature token.
T:Mode$ SpellCast | ValidCard$ Card.sharesCardTypeWith Imprinted.ExiledWithSource | ValidActivatingPlayer$ You | Execute$ TrigToken | TriggerZones$ Battlefield | Secondary$ True | TriggerDescription$ Whenever you play a land or cast a spell, if it shares a card type with the exiled card, create a 1/1 white Human creature token.
SVar:TrigToken:DB$ Token | TokenScript$ w_1_1_human
diff --git a/forge-gui/res/cardsfolder/upcoming/cemetery_prowler.txt b/forge-gui/res/cardsfolder/upcoming/cemetery_prowler.txt
new file mode 100644
index 00000000000..6b6cf854896
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/cemetery_prowler.txt
@@ -0,0 +1,14 @@
+Name:Cemetery Prowler
+ManaCost:1 G G
+Types:Creature Wolf
+PT:3/4
+K:Vigilance
+T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield or attacks, exile a card from a graveyard.
+T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigExile | Secondary$ True | TriggerDescription$ Whenever CARDNAME enters the battlefield or attacks, exile a card from a graveyard.
+SVar:TrigExile:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | ChangeType$ Card | ChangeNum$ 1 | SelectPrompt$ Select a card from a graveyard | Mandatory$ True | Hidden$ True | Imprint$ True | AILogic$ ExilePreference:MostProminentNonLandNonExiledOwnType
+S:Mode$ ReduceCost | ValidCard$ Card | Type$ Spell | Amount$ AffectedX | Activator$ You | Description$ Spells you cast cost {1} less to cast for each card type they share with cards exiled with CARDNAME.
+SVar:AffectedX:Count$TypesSharedWith Imprinted.ExiledWithSource
+T:Mode$ ChangesZone | Origin$ Battlefield | ValidCard$ Card.Self | Destination$ Any | Execute$ DBCleanup | Static$ True
+SVar:DBCleanup:DB$ Cleanup | ClearImprinted$ True
+DeckHints:Ability$Graveyard & Ability$Discard
+Oracle:Vigilance\nWhenever Cemetery Prowler enters the battlefield or attacks, exile a card from a graveyard.\nSpells you cast cost {1} less to cast for each card type they share with cards exiled with Cemetery Prowler.
diff --git a/forge-gui/res/cardsfolder/upcoming/ceremonial_knife.txt b/forge-gui/res/cardsfolder/upcoming/ceremonial_knife.txt
new file mode 100644
index 00000000000..c5a0a1497b6
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/ceremonial_knife.txt
@@ -0,0 +1,9 @@
+Name:Ceremonial Knife
+ManaCost:1
+Types:Artifact Equipment
+S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 1 | AddTrigger$ TrigDamageDone | Description$ Equipped creature gets +1/+0 and has "Whenever this creature deals combat damage, create a Blood token." (It's an artifact with "{1}, {T}, Discard a card, Sacrifice this artifact: Draw a card.")
+SVar:TrigDamageDone:Mode$ DamageDone | CombatDamage$ True | ValidSource$ Card.Self | Execute$ TrigBlood | TriggerDescription$ Whenever this creature deals combat damage, create a Blood token." (It's an artifact with "{1}, {T}, Discard a card, Sacrifice this artifact: Draw a card.")
+SVar:TrigBlood:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_blood_draw | TokenOwner$ You
+K:Equip:2
+DeckHas:Ability$Token & Ability$Sacrifice & Type$Blood
+Oracle:Equipped creature gets +1/+0 and has "Whenever this creature deals combat damage, create a Blood token." (It's an artifact with "{1}, {T}, Discard a card, Sacrifice this artifact: Draw a card.")\nEquip {2}
diff --git a/forge-gui/res/cardsfolder/upcoming/chill_of_the_grave.txt b/forge-gui/res/cardsfolder/upcoming/chill_of_the_grave.txt
new file mode 100644
index 00000000000..269d044985f
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/chill_of_the_grave.txt
@@ -0,0 +1,10 @@
+Name:Chill of the Grave
+ManaCost:2 U
+Types:Instant
+S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ 1 | EffectZone$ All | IsPresent$ Zombie.YouCtrl | Description$ This spell costs {1} less to cast if you control a Zombie.
+A:SP$ Tap | ValidTgts$ Creature | SubAbility$ DBPump | SpellDescription$ Tap target creature. It doesn't untap during its controller's next untap step.
+SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent | SubAbility$ DBDraw | StackDescription$ SpellDescription | SpellDescription$ It doesn't untap during its controller's next untap step.
+SVar:DBDraw:DB$ Draw | NumCards$ 1 | SpellDescription$ Draw a card.
+SVar:BuffedBy:Zombie
+DeckHints:Type$Zombie
+Oracle:This spell costs {1} less to cast if you control a Zombie.\nTap target creature. It doesn't untap during its controller's next untap step.\nDraw a card.
diff --git a/forge-gui/res/cardsfolder/upcoming/cobbled_lancer.txt b/forge-gui/res/cardsfolder/upcoming/cobbled_lancer.txt
new file mode 100644
index 00000000000..86a475744c1
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/cobbled_lancer.txt
@@ -0,0 +1,8 @@
+Name:Cobbled Lancer
+ManaCost:U
+Types:Creature Zombie Horse
+PT:3/3
+A:SP$ PermanentCreature | Cost$ U ExileFromGrave<1/Creature/creature card>
+A:AB$ Draw | Cost$ 3 U ExileFromGrave<1/CARDNAME> | NumCards$ 1 | ActivationZone$ Graveyard | SpellDescription$ Draw a card.
+DeckHas:Ability$Graveyard
+Oracle:As an additional cost to cast this spell, exile a creature card from your graveyard.\n{3}{U}, Exile Cobbled Lancer from your graveyard: Draw a card.
diff --git a/forge-gui/res/cardsfolder/upcoming/courier_bat.txt b/forge-gui/res/cardsfolder/upcoming/courier_bat.txt
new file mode 100644
index 00000000000..f7fc7ec9939
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/courier_bat.txt
@@ -0,0 +1,12 @@
+Name:Courier Bat
+ManaCost:2 B
+Types:Creature Bat
+PT:2/2
+K:Flying
+T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | CheckSVar$ X | SVarCompare$ GE1 | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, if you gained life this turn, return up to one target creature card from your graveyard to your hand.
+SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Choose up to one target creature card in your graveyard | ValidTgts$ Creature.YouOwn
+SVar:X:Count$LifeYouGainedThisTurn
+SVar:NeedsToPlayVar:X GE1
+DeckHas:Ability$Graveyard
+DeckHints:Ability$LifeGain
+Oracle:Flying\nWhen Courier Bat enters the battlefield, if you gained life this turn, return up to one target creature card from your graveyard to your hand.
diff --git a/forge-gui/res/cardsfolder/upcoming/cradle_of_safety.txt b/forge-gui/res/cardsfolder/upcoming/cradle_of_safety.txt
new file mode 100644
index 00000000000..b9b88af04cf
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/cradle_of_safety.txt
@@ -0,0 +1,10 @@
+Name:Cradle of Safety
+ManaCost:1 U
+Types:Enchantment Aura
+K:Flash
+K:Enchant creature you control
+A:SP$ Attach | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | AILogic$ Pump
+T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, enchanted creature gains hexproof until end of turn. (It can't be the target of spells or abilities your opponents control.)
+SVar:TrigPump:DB$ Pump | Defined$ Enchanted | KW$ Hexproof
+S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 1 | AddToughness$ 1 | Description$ Enchanted creature gets +1/+1.
+Oracle:Flash\nEnchant creature you control\nWhen Cradle of Safety enters the battlefield, enchanted creature gains hexproof until end of turn. (It can't be the target of spells or abilities your opponents control.)\nEnchanted creature gets +1/+1.
diff --git a/forge-gui/res/cardsfolder/upcoming/crawling_infestation.txt b/forge-gui/res/cardsfolder/upcoming/crawling_infestation.txt
new file mode 100644
index 00000000000..8c866bf3333
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/crawling_infestation.txt
@@ -0,0 +1,9 @@
+Name:Crawling Infestation
+ManaCost:2 G
+Types:Enchantment
+T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigMill | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ At the beginning of your upkeep, you may mill two cards. (You may put the top two cards of your library into your graveyard.)
+SVar:TrigMill:DB$ Mill | NumCards$ 2 | Defined$ You
+T:Mode$ ChangesZoneAll | ValidCards$ Creature.YouOwn+nonToken | Origin$ Any | Destination$ Graveyard | TriggerZones$ Battlefield | ActivationLimit$ 1 | PlayerTurn$ True | Execute$ TrigToken | TriggerDescription$ Whenever one or more creature cards are put into your graveyard from anywhere during your turn, create a 1/1 green Insect creature token. This ability triggers only once each turn.
+SVar:TrigToken:DB$ Token | TokenScript$ g_1_1_insect
+DeckHas:Ability$Mill & Ability$Token
+Oracle:At the beginning of your upkeep, you may mill two cards. (You may put the top two cards of your library into your graveyard.)\nWhenever one or more creature cards are put into your graveyard from anywhere during your turn, create a 1/1 green Insect creature token. This ability triggers only once each turn.
diff --git a/forge-gui/res/cardsfolder/upcoming/creepy_puppeteer.txt b/forge-gui/res/cardsfolder/upcoming/creepy_puppeteer.txt
new file mode 100644
index 00000000000..abbbe390391
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/creepy_puppeteer.txt
@@ -0,0 +1,10 @@
+Name:Creepy Puppeteer
+ManaCost:3 R
+Types:Creature Human Rogue
+PT:4/3
+K:Haste
+Oracle:Haste
+T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigAnimate | OptionalDecider$ You | IsPresent$ Creature.attacking+Other | PresentCompare$ EQ1 | TriggerDescription$ Whenever CARDNAME attacks, if you attacked with exactly one other creature this combat, you may have that creature's base power and toughness become 4/3 until end of turn.
+SVar:TrigAnimate:DB$ AnimateAll | ValidCards$ Creature.attacking+Other | Power$ 4 | Toughness$ 3
+SVar:HasAttackEffect:TRUE
+Oracle:Whenever Creepy Puppeteer attacks, if you attacked with exactly one other creature this combat, you may have that creature's base power and toughness become 4/3 until end of turn.
diff --git a/forge-gui/res/cardsfolder/upcoming/crossway_troublemakers.txt b/forge-gui/res/cardsfolder/upcoming/crossway_troublemakers.txt
new file mode 100644
index 00000000000..6f0980434eb
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/crossway_troublemakers.txt
@@ -0,0 +1,10 @@
+Name:Crossway Troublemakers
+ManaCost:5 B
+Types:Creature Vampire
+PT:5/5
+S:Mode$ Continuous | Affected$ Vampire.attacking+YouCtrl | AddKeyword$ Deathtouch & Lifelink | Description$ Attacking Vampires you control have deathtouch and lifelink.
+T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Vampire.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever a Vampire you control dies, you may pay 2 life. If you do, draw a card.
+SVar:TrigDraw:AB$ Draw | Cost$ PayLife<2> | Defined$ You | NumCards$ 1
+DeckHints:Type$Vampire
+DeckHas:Ability$LifeGain
+Oracle:Attacking Vampires you control have deathtouch and lifelink.\nWhenever a Vampire you control dies, you may pay 2 life. If you do, draw a card.
diff --git a/forge-gui/res/cardsfolder/upcoming/cruel_witness.txt b/forge-gui/res/cardsfolder/upcoming/cruel_witness.txt
new file mode 100644
index 00000000000..9066dd0f839
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/cruel_witness.txt
@@ -0,0 +1,10 @@
+Name:Cruel Witness
+ManaCost:2 U U
+Types:Creature Bird Horror
+PT:3/3
+K:Flying
+T:Mode$ SpellCast | ValidCard$ Card.nonCreature | ValidActivatingPlayer$ You | Execute$ TrigDig | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a noncreature spell, look at the top card of your library. You may put that card into your graveyard.
+SVar:TrigDig:DB$ Dig | DigNum$ 1 | DestinationZone$ Graveyard | Optional$ True | LibraryPosition2$ 0
+SVar:BuffedBy:Card.nonLand+nonCreature
+DeckHas:Ability$Graveyard
+Oracle:Flying\nWhenever you cast a noncreature spell, look at the top card of your library. You may put that card into your graveyard.
diff --git a/forge-gui/res/cardsfolder/upcoming/dawnhart_disciple.txt b/forge-gui/res/cardsfolder/upcoming/dawnhart_disciple.txt
new file mode 100644
index 00000000000..f5b7c088418
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/dawnhart_disciple.txt
@@ -0,0 +1,9 @@
+Name:Dawnhart Disciple
+ManaCost:1 G
+Types:Creature Human Warlock
+PT:2/2
+T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Human.Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever another Human enters the battlefield under your control, CARDNAME gets +1/+1 until end of turn.
+SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ +1 | NumDef$ +1
+DeckHints:Type$Human
+SVar:BuffedBy:Human
+Oracle:Whenever another Human enters the battlefield under your control, Dawnhart Disciple gets +1/+1 until end of turn.
diff --git a/forge-gui/res/cardsfolder/upcoming/daybreak_combatants.txt b/forge-gui/res/cardsfolder/upcoming/daybreak_combatants.txt
new file mode 100644
index 00000000000..df753d3951c
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/daybreak_combatants.txt
@@ -0,0 +1,9 @@
+Name:Daybreak Combatants
+ManaCost:2 R
+Types:Creature Human Warrior
+PT:2/2
+K:Haste
+T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, target creature gets +2/+0 until end of turn.
+SVar:TrigPump:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | AILogic$ Pump | NumAtt$ +2
+SVar:PlayMain1:TRUE
+Oracle:Haste\nWhen Daybreak Combatants enters the battlefield, target creature gets +2/+0 until end of turn.
diff --git a/forge-gui/res/cardsfolder/upcoming/desperate_farmer_depraved_harvester.txt b/forge-gui/res/cardsfolder/upcoming/desperate_farmer_depraved_harvester.txt
new file mode 100644
index 00000000000..b34f6acb496
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/desperate_farmer_depraved_harvester.txt
@@ -0,0 +1,21 @@
+Name:Desperate Farmer
+ManaCost:2 B
+Types:Creature Human Peasant
+PT:2/2
+K:Lifelink
+T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ When another creature you control dies, transform CARDNAME.
+SVar:TrigTransform:DB$ SetState | Defined$ Self | Mode$ Transform
+AlternateMode:DoubleFaced
+DeckHas:Ability$LifeGain
+Oracle:Lifelink\nWhen another creature you control dies, transform Desperate Farmer.
+
+ALTERNATE
+
+Name:Depraved Harvester
+ManaCost:no cost
+Types:Creature Human Knight
+Colors:black
+PT:4/3
+K:Lifelink
+DeckHas:Ability$LifeGain
+Oracle:Lifelink
diff --git a/forge-gui/res/cardsfolder/upcoming/diregraf_scavenger.txt b/forge-gui/res/cardsfolder/upcoming/diregraf_scavenger.txt
new file mode 100644
index 00000000000..4526dce8482
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/diregraf_scavenger.txt
@@ -0,0 +1,12 @@
+Name:Diregraf Scavenger
+ManaCost:3 B
+Types:Creature Zombie Bear
+PT:2/3
+K:Deathtouch
+T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ Whenever CARDNAME enters the battlefield, exile up to one target card from a graveyard. If a creature card was exiled this way, each opponent loses 2 life and you gain 2 life.
+SVar:TrigExile:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Card | AITgts$ Creature.OppOwn | TgtPrompt$ Select up to one target card from a graveyard | RememberChanged$ True | SubAbility$ DBDrain
+SVar:DBDrain:DB$ LoseLife | ConditionDefined$ Remembered | ConditionPresent$ Creature | Defined$ Player.Opponent | LifeAmount$ 2 | SubAbility$ DBGainLife
+SVar:DBGainLife:DB$ GainLife | ConditionDefined$ Remembered | ConditionPresent$ Creature | Defined$ You | LifeAmount$ 2 | SubAbility$ DBCleanup
+SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
+DeckHas:Ability$Graveyard & Ability$LifeGain
+Oracle:Deathtouch\nWhen Diregraf Scavenger enters the battlefield, exile up to one target card from a graveyard. If a creature card was exiled this way, each opponent loses 2 life and you gain 2 life.
diff --git a/forge-gui/res/cardsfolder/upcoming/disorder_in_the_court.txt b/forge-gui/res/cardsfolder/upcoming/disorder_in_the_court.txt
new file mode 100644
index 00000000000..22ce4a8a647
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/disorder_in_the_court.txt
@@ -0,0 +1,11 @@
+Name:Disorder in the Court
+ManaCost:X W U
+Types:Instant
+A:SP$ ChangeZone | ValidTgts$ Creature | TgtPrompt$ Select X target creatures | TargetMin$ X | TargetMax$ X | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | SubAbility$ DBInvestigate | SpellDescription$ Exile X target creatures, then investigate X times. Return the exiled cards to the battlefield tapped under their owners' control at the beginning of the next end step. (To investigate, create a colorless Clue artifact token with "{2}, Sacrifice this artifact: Draw a card.")
+SVar:DBInvestigate:DB$ Investigate | Num$ X | SubAbility$ DBDelTrig
+SVar:DBDelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigReturn | RememberObjects$ RememberedLKI | TriggerDescription$ Return the exiled cards to the battlefield tapped under their owners' control at the beginning of the next end step. | SubAbility$ DBCleanup
+SVar:TrigReturn:DB$ ChangeZone | Origin$ Exile | Destination$ Battlefield | Defined$ DelayTriggerRememberedLKI | Tapped$ True
+SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
+SVar:X:Count$xPaid
+DeckHas:Ability$Investigate & Ability$Token & Ability$Sacrifice
+Oracle:Exile X target creatures, then investigate X times. Return the exiled cards to the battlefield tapped under their owners' control at the beginning of the next end step. (To investigate, create a colorless Clue artifact token with "{2}, Sacrifice this artifact: Draw a card.")
diff --git a/forge-gui/res/cardsfolder/upcoming/dollhouse_of_horrors.txt b/forge-gui/res/cardsfolder/upcoming/dollhouse_of_horrors.txt
index b95d6d1ef97..ddd7a459c36 100644
--- a/forge-gui/res/cardsfolder/upcoming/dollhouse_of_horrors.txt
+++ b/forge-gui/res/cardsfolder/upcoming/dollhouse_of_horrors.txt
@@ -1,10 +1,10 @@
Name:Dollhouse of Horrors
ManaCost:5
Types:Artifact
-A:AB$ CopyPermanent | Cost$ 1 T ExileFromGrave<1/Creature> | Defined$ Exiled | SetPower$ 0 | SetToughness$ 0 | AddTypes$ Construct & Artifact | AddStaticAbilities$ ConstructBuff | SorcerySpeed$ True | SubAbility$ DBPump | StackDescription$ Create a token that's a copy of {c:Exiled}, except it's a 0/0 Construct artifact in addition to its other types and it has "This creature gets +1/+1 for each Construct you control." | SpellDescription$ Create a token that's a copy of the exiled card, except it's a 0/0 Construct artifact in addition to its other types and it has "This creature gets +1/+1 for each Construct you control."
-SVar:DBPump:DB$ Pump | Defined$ Exiled | StackDescription$ That creature gains haste until end of turn. | SpellDescription$ That creature gains haste until end of turn. Activate only as a sorcery.
+A:AB$ CopyPermanent | Cost$ 1 T ExileFromGrave<1/Creature> | Defined$ Exiled | SetPower$ 0 | SetToughness$ 0 | AddTypes$ Construct & Artifact | AddStaticAbilities$ ConstructBuff | SorcerySpeed$ True | PumpKeywords$ Haste | PumpDuration$ EOT | StackDescription$ Create a token that's a copy of {c:Exiled}, except it's a 0/0 Construct artifact in addition to its other types and it has "This creature gets +1/+1 for each Construct you control." That creature gains haste until end of turn. | SpellDescription$ Create a token that's a copy of the exiled card, except it's a 0/0 Construct artifact in addition to its other types and it has "This creature gets +1/+1 for each Construct you control." That creature gains haste until end of turn.
SVar:ConstructBuff:Mode$ Continuous | Affected$ Card.Self | AddPower$ X | AddToughness$ X | Description$ This creature gets +1/+1 for each Construct you control.
SVar:X:Count$Valid Construct.YouCtrl
+SVar:AIPreference:ExileFromGraveCost$Creature.YouOwn+inZoneGraveyard
DeckHas:Ability$Token & Ability$Graveyard & Type$Artifact
DeckHints:Type$Construct
Oracle:{1}, {T}: Exile a creature card from your graveyard: Create a token that's a copy of the exiled card, except it's a 0/0 Construct artifact in addition to its other types and it has "This creature gets +1/+1 for each Construct you control." That creature gains haste until end of turn. Activate only as a sorcery.
diff --git a/forge-gui/res/cardsfolder/upcoming/donal_herald_of_wings.txt b/forge-gui/res/cardsfolder/upcoming/donal_herald_of_wings.txt
new file mode 100644
index 00000000000..6ab6dd3e51e
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/donal_herald_of_wings.txt
@@ -0,0 +1,10 @@
+Name:Donal, Herald of Wings
+ManaCost:2 U U
+Types:Legendary Creature Human Wizard
+PT:3/3
+T:Mode$ SpellCast | TriggerZones$ Battlefield | ValidCard$ Creature.withFlying+nonLegendary | ValidActivatingPlayer$ You | NoResolvingCheck$ True | ActivationLimit$ 1 | Execute$ TrigCopy | OptionalDecider$ You | TriggerDescription$ Whenever you cast a nonlegendary creature spell with flying, you may copy it, except the copy is a 1/1 Spirit in addition to its other types. Do this only once each turn. (The copy becomes a token.)
+SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | CopySetPower$ 1 | CopySetToughness$ 1 | CopyAddTypes$ Spirit
+DeckHas:Ability$Token
+DeckHints:Keyword$Flying
+SVar:BuffedBy:Creature.withFlying
+Oracle:Whenever you cast a nonlegendary creature spell with flying, you may copy it, except the copy is a 1/1 Spirit in addition to its other types. Do this only once each turn. (The copy becomes a token.)
diff --git a/forge-gui/res/cardsfolder/upcoming/doom_weaver.txt b/forge-gui/res/cardsfolder/upcoming/doom_weaver.txt
new file mode 100644
index 00000000000..8a513a8c15e
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/doom_weaver.txt
@@ -0,0 +1,12 @@
+Name:Doom Weaver
+ManaCost:4 B B
+Types:Creature Spider Horror
+PT:1/8
+K:Reach
+K:Soulbond
+S:Mode$ Continuous | Affected$ Creature.PairedWith,Creature.Self+Paired | AddTrigger$ DiesTrigger | Description$ As long as CARDNAME is paired with another creature, each of those creatures has "When this creature dies, draw cards equal to its power."
+SVar:DiesTrigger:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerController$ TriggeredCardController | TriggerDescription$ When this creature dies, draw cards equal to its power.
+SVar:TrigDraw:DB$ Draw | NumCards$ XPower
+SVar:XPower:TriggeredCard$CardPower
+SVar:BuffedBy:Creature
+Oracle:Reach\nSoulbond (You may pair this creature with another unpaired creature when either enters the battlefield. They remain paired for as long as you control both of them.)\nAs long as Doom Weaver is paired with another creature, each of those creatures has "When this creature dies, draw cards equal to its power."
diff --git a/forge-gui/res/cardsfolder/upcoming/dread_fugue.txt b/forge-gui/res/cardsfolder/upcoming/dread_fugue.txt
new file mode 100644
index 00000000000..b9a1fc13966
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/dread_fugue.txt
@@ -0,0 +1,6 @@
+Name:Dread Fugue
+ManaCost:B
+Types:Sorcery
+A:SP$ Discard | ValidTgts$ Player | TgtPrompt$ Select target player | Mode$ RevealYouChoose | DiscardValid$ Card.nonLand+cmcLE2 | NumCards$ 1 | SpellDescription$ Target player reveals their hand. You choose a nonland card from it [with mana value 2 or less]. That player discards that card. | StackDescription$ {p:Targeted} reveals their hand. {p:You} chooses a nonland card from it with mana value 2 or less. {p:Targeted} discards that card.
+A:SP$ Discard | Cost$ 2 B | ValidTgts$ Player | TgtPrompt$ Select target player | Mode$ RevealYouChoose | DiscardValid$ Card.nonLand | NumCards$ 1 | PrecostDesc$ Cleave | CostDesc$ {2}{B} | NonBasicSpell$ True | SpellDescription$ (You may cast this spell for its cleave cost. If you do, remove the words in square brackets.) | StackDescription$ {p:Targeted} reveals their hand. {p:You} chooses a nonland card from it. {p:Targeted} discards that card.
+Oracle:Cleave {2}{B} (You may cast this spell for its cleave cost. If you do, remove the words in square brackets.)\nTarget player reveals their hand. You choose a nonland card from it [with mana value 2 or less]. That player discards that card.
diff --git a/forge-gui/res/cardsfolder/upcoming/dreadlight_monstrosity.txt b/forge-gui/res/cardsfolder/upcoming/dreadlight_monstrosity.txt
new file mode 100644
index 00000000000..668b3a24de2
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/dreadlight_monstrosity.txt
@@ -0,0 +1,7 @@
+Name:Dreadlight Monstrosity
+ManaCost:4 U U
+Types:Creature Crab Horror
+PT:5/5
+K:Ward:2
+A:AB$ Pump | Cost$ 3 U U | Defined$ Self | KW$ HIDDEN Unblockable | IsPresent$ Card.YouOwn | PresentZone$ Exile | SpellDescription$ CARDNAME can't be blocked this turn. Activate only if you own a card in exile.
+Oracle:Ward {2} (Whenever this creature becomes the target of a spell or ability an opponent controls, counter it unless that player pays {2}.)\n{3}{U}{U}: Dreadlight Monstrosity can't be blocked this turn. Activate only if you own a card in exile.
diff --git a/forge-gui/res/cardsfolder/upcoming/drogskol_reinforcements.txt b/forge-gui/res/cardsfolder/upcoming/drogskol_reinforcements.txt
new file mode 100644
index 00000000000..4b48bffc2ec
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/drogskol_reinforcements.txt
@@ -0,0 +1,10 @@
+Name:Drogskol Reinforcements
+ManaCost:3 W
+Types:Creature Spirit Soldier
+PT:2/2
+K:Melee
+S:Mode$ Continuous | Affected$ Spirit.Other+YouCtrl | AddKeyword$ Melee | Description$ Other Spirits you control have melee.
+R:Event$ DamageDone | ActiveZones$ Battlefield | Prevent$ True | ValidTarget$ Spirit.YouCtrl | IsCombat$ False | Description$ Prevent all noncombat damage that would be dealt to Spirits you control.
+SVar:PlayMain1:TRUE
+DeckHints$Type:Spirit
+Oracle:Melee (Whenever this creature attacks, it gets +1/+1 until end of turn for each opponent you attacked this combat.)\nOther Spirits you control have melee.\nPrevent all noncombat damage that would be dealt to Spirits you control.
diff --git a/forge-gui/res/cardsfolder/upcoming/edgar_charmed_groom_edgar_markovs_coffin.txt b/forge-gui/res/cardsfolder/upcoming/edgar_charmed_groom_edgar_markovs_coffin.txt
new file mode 100644
index 00000000000..f974dce5515
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/edgar_charmed_groom_edgar_markovs_coffin.txt
@@ -0,0 +1,26 @@
+Name:Edgar, Charmed Groom
+ManaCost:2 W B
+Types:Legendary Creature Vampire Noble
+PT:4/4
+S:Mode$ Continuous | Affected$ Creature.Vampire+Other+YouCtrl | AddPower$ 1 | AddToughness$ 1 | Description$ Other Vampires you control get +1/+1.
+T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, return it to the battlefield transformed under its owner's control.
+SVar:TrigReturn:DB$ ChangeZone | Origin$ Graveyard | Defined$ TriggeredNewCardLKICopy | Destination$ Battlefield | Transformed$ True
+AlternateMode:DoubleFaced
+DeckHints:Type$Vampire
+Oracle:Other Vampires you control get +1/+1.\nWhen Edgar, Charmed Groom dies, return it to the battlefield transformed under its owner's control.
+
+ALTERNATE
+
+Name:Edgar Markov's Coffin
+ManaCost:no cost
+Colors:white,black
+Types:Legendary Artifact
+T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ At the beginning of your upkeep, create a 1/1 white and black Vampire creature token with lifelink and put a bloodline counter on CARDNAME. Then if there are three or more bloodline counters on it, remove those counters and transform it.
+SVar:TrigToken:DB$ Token | TokenScript$ wb_1_1_vampire_lifelink | SubAbility$ DBPutCounter
+SVar:DBPutCounter:DB$ PutCounter | CounterType$ BLOODLINE | CounterNum$ 1 | SubAbility$ DBRemoveCounters
+SVar:DBRemoveCounters:DB$ RemoveCounter | ConditionPresent$ Card.Self+counters_GE3_BLOODLINE | CounterType$ BLOODLINE | CounterNum$ All | RememberRemoved$ True | SubAbility$ DBTransform
+SVar:DBTransform:DB$ SetState | Defined$ Self | Mode$ Transform | ConditionCheckSVar$ X | ConditionSVarCompare$ GE3 | SubAbility$ DBCleanup
+SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
+SVar:X:Count$RememberedSize
+DeckHas:Ability$Token & Ability$LifeGain & Ability$Counters
+Oracle:At the beginning of your upkeep, create a 1/1 white and black Vampire creature token with lifelink and put a bloodline counter on Edgar Markov's Coffin. Then if there are three or more bloodline counters on it, remove those counters and transform it.
diff --git a/forge-gui/res/cardsfolder/upcoming/end_the_festivities.txt b/forge-gui/res/cardsfolder/upcoming/end_the_festivities.txt
new file mode 100755
index 00000000000..60bdefbcd32
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/end_the_festivities.txt
@@ -0,0 +1,5 @@
+Name:End the Festivities
+ManaCost:R
+Types:Sorcery
+A:SP$ DamageAll | NumDmg$ 1 | ValidPlayers$ Player.Opponent | ValidCards$ Creature.OppCtrl,Planeswalker.OppCtrl | ValidDescription$ each opponent and each creature and planeswalker they control. | SpellDescription$ CARDNAME deals 1 damage to each opponent and each creature and planeswalker they control.
+Oracle:End the Festivities deals 1 damage to each opponent and each creature and planeswalker they control.
diff --git a/forge-gui/res/cardsfolder/upcoming/estwald_shieldbasher.txt b/forge-gui/res/cardsfolder/upcoming/estwald_shieldbasher.txt
new file mode 100755
index 00000000000..b4b6a6e6ffe
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/estwald_shieldbasher.txt
@@ -0,0 +1,8 @@
+Name:Estwald Shieldbasher
+ManaCost:3 W
+Types:Creature Human Soldier
+PT:4/2
+T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, you may pay {1}. If you do, it gains indestructible until end of turn. (Damage and effects that say "destroy" don't destroy it.)
+SVar:TrigPump:AB$ Pump | Cost$ 1 | Defined$ Self | KW$ Indestructible
+SVar:HasAttackEffect:TRUE
+Oracle:Whenever Estwald Shieldbasher attacks, you may pay {1}. If you do, it gains indestructible until end of turn. (Damage and effects that say "destroy" don't destroy it.)
diff --git a/forge-gui/res/cardsfolder/upcoming/ethereal_investigator.txt b/forge-gui/res/cardsfolder/upcoming/ethereal_investigator.txt
new file mode 100644
index 00000000000..49245c97345
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/ethereal_investigator.txt
@@ -0,0 +1,12 @@
+Name:Ethereal Investigator
+ManaCost:3 U
+Types:Creature Spirit
+PT:2/3
+K:Flying
+T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigInvestigate | TriggerDescription$ When CARDNAME enters the battlefield, investigate X times, where X is the number of opponents you have. (To investigate, create a colorless Clue artifact token with "{2}, Sacrifice this artifact: Draw a card.")
+SVar:TrigInvestigate:DB$ Investigate | Num$ X
+SVar:X:PlayerCountOpponents$Amount
+T:Mode$ Drawn | ValidCard$ Card.YouCtrl | Number$ 2 | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever you draw your second card each turn, put a +1/+1 counter on CARDNAME.
+SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ w_1_1_spirit_flying
+DeckHas:Ability$Token & Ability$Sacrifice
+Oracle:Flying\nWhen Ethereal Investigator enters the battlefield, investigate X times, where X is the number of opponents you have. (To investigate, create a colorless Clue artifact token with "{2}, Sacrifice this artifact: Draw a card.")\nWhenever you draw your second card each turn, create a 1/1 white Spirit creature token with flying.
diff --git a/forge-gui/res/cardsfolder/upcoming/falkenrath_celebrants.txt b/forge-gui/res/cardsfolder/upcoming/falkenrath_celebrants.txt
new file mode 100755
index 00000000000..0e2db23295a
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/falkenrath_celebrants.txt
@@ -0,0 +1,9 @@
+Name:Falkenrath Celebrants
+ManaCost:4 R
+Types:Creature Vampire
+PT:4/4
+K:Menace
+T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create two Blood tokens. (They're artifacts with "{1}, {T}, Discard a card, Sacrifice this artifact: Draw a card.")
+SVar:TrigToken:DB$ Token | TokenAmount$ 2 | TokenScript$ c_a_blood_draw
+DeckHas:Ability$Token & Ability$Sacrifice & Type$ Blood
+Oracle:Menace (This creature can't be blocked except by two or more creatures.)\nWhen Falkenrath Celebrants enters the battlefield, create two Blood tokens. (They're artifacts with "{1}, {T}, Discard a card, Sacrifice this artifact: Draw a card.")
diff --git a/forge-gui/res/cardsfolder/upcoming/fear_of_death.txt b/forge-gui/res/cardsfolder/upcoming/fear_of_death.txt
new file mode 100644
index 00000000000..16924f9e8d5
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/fear_of_death.txt
@@ -0,0 +1,12 @@
+Name:Fear of Death
+ManaCost:1 U
+Types:Enchantment Aura
+K:Enchant creature
+A:SP$ Attach | ValidTgts$ Creature | AILogic$ Curse
+T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigMill | TriggerDescription$ When CARDNAME enters the battlefield, mill two cards.
+SVar:TrigMill:DB$ Mill | NumCards$ 2 | Defined$ You
+S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ -X | Description$ Enchanted creature gets -X/-0, where X is the number of cards in your graveyard.
+SVar:X:Count$InYourYard
+DeckHas:Ability$Mill
+DeckHints:Ability$Graveyard
+Oracle:Enchant creature\nWhen Fear of Death enters the battlefield, mill two cards. (Put the top two cards of your library into your graveyard.)\nEnchanted creature gets -X/-0, where X is the number of cards in your graveyard.
diff --git a/forge-gui/res/cardsfolder/upcoming/fearful_villager_fearsome_werewolf.txt b/forge-gui/res/cardsfolder/upcoming/fearful_villager_fearsome_werewolf.txt
index 392b9205ad0..eee1f0a0596 100644
--- a/forge-gui/res/cardsfolder/upcoming/fearful_villager_fearsome_werewolf.txt
+++ b/forge-gui/res/cardsfolder/upcoming/fearful_villager_fearsome_werewolf.txt
@@ -1,5 +1,5 @@
Name:Fearful Villager
-ManaCost:2 R R
+ManaCost:2 R
Types:Creature Human Werewolf
PT:2/3
K:Menace
diff --git a/forge-gui/res/cardsfolder/upcoming/fierce_retribution.txt b/forge-gui/res/cardsfolder/upcoming/fierce_retribution.txt
new file mode 100644
index 00000000000..db54881f657
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/fierce_retribution.txt
@@ -0,0 +1,6 @@
+Name:Fierce Retribution
+ManaCost:1 W
+Types:Instant
+A:SP$ Destroy | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature | SpellDescription$ Destroy target [attacking] creature.
+A:SP$ Destroy | Cost$ 5 W | ValidTgts$ Creature | TgtPrompt$ Select target creature | PrecostDesc$ Cleave | CostDesc$ {5}{W} | NonBasicSpell$ True | SpellDescription$ (You may cast this spell for its cleave cost. If you do, remove the words in square brackets.)
+Oracle:Cleave {5}{W} (You may cast this spell for its cleave cost. If you do, remove the words in square brackets.)\nDestroy target [attacking] creature.
diff --git a/forge-gui/res/cardsfolder/upcoming/flame_blessed_bolt.txt b/forge-gui/res/cardsfolder/upcoming/flame_blessed_bolt.txt
new file mode 100755
index 00000000000..1af60b72499
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/flame_blessed_bolt.txt
@@ -0,0 +1,5 @@
+Name:Flame-Blessed Bolt
+ManaCost:R
+Types:Instant
+A:SP$ DealDamage | ValidTgts$ Creature,Planeswalker | TgtPrompt$ Select target creature or planeswalker | NumDmg$ 2 | ReplaceDyingDefined$ Targeted | SpellDescription$ CARDNAME deals 2 damage to target creature or planeswalker. If that creature or planeswalker would die this turn, exile it instead.
+Oracle:Flame-Blessed Bolt deals 2 damage to target creature or planeswalker. If that creature or planeswalker would die this turn, exile it instead.
diff --git a/forge-gui/res/cardsfolder/upcoming/fleeting_spirit.txt b/forge-gui/res/cardsfolder/upcoming/fleeting_spirit.txt
new file mode 100644
index 00000000000..69b0fcbd216
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/fleeting_spirit.txt
@@ -0,0 +1,11 @@
+Name:Fleeting Spirit
+ManaCost:1 W
+Types:Creature Spirit
+PT:3/1
+A:AB$ Pump | Cost$ W ExileFromGrave<3/Card> | Defined$ Self | KW$ First strike | SpellDescription$ CARDNAME gains first strike until end of turn.
+A:AB$ ChangeZone | Cost$ Discard<1/Card> | Defined$ Self | Origin$ Battlefield | Destination$ Exile | SubAbility$ DelTrig | SpellDescription$ Exile CARDNAME. Return it to the battlefield under its owner's control at the beginning of the next end step.
+SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigReturn | TriggerDescription$ Return CARDNAME to the battlefield under its owner's control at the beginning of the next end step.
+SVar:TrigReturn:DB$ ChangeZone | Origin$ Exile | Destination$ Battlefield | Defined$ Self
+AI:RemoveDeck:All
+DeckHas:Ability$Discard & Ability$Graveyard
+Oracle:{W}, Exile three cards from your graveyard: Fleeting Spirit gains first strike until end of turn.\nDiscard a card: Exile Fleeting Spirit. Return it to the battlefield under its owner's control at the beginning of the next end step.
diff --git a/forge-gui/res/cardsfolder/upcoming/flourishing_hunter.txt b/forge-gui/res/cardsfolder/upcoming/flourishing_hunter.txt
new file mode 100644
index 00000000000..dc80d276dbf
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/flourishing_hunter.txt
@@ -0,0 +1,9 @@
+Name:Flourishing Hunter
+ManaCost:4 G G
+Types:Creature Wolf Spirit
+PT:6/6
+T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain life equal to the greatest toughness among other creatures you control.
+SVar:TrigGainLife:DB$ GainLife | LifeAmount$ X
+SVar:X:Count$GreatestToughness_Creature.YouCtrl+Other
+DeckHas:Ability$LifeGain
+Oracle:When Flourishing Hunter enters the battlefield, you gain life equal to the greatest toughness among other creatures you control.
diff --git a/forge-gui/res/cardsfolder/upcoming/foreboding_statue_forsaken_thresher.txt b/forge-gui/res/cardsfolder/upcoming/foreboding_statue_forsaken_thresher.txt
new file mode 100644
index 00000000000..4a0485a733d
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/foreboding_statue_forsaken_thresher.txt
@@ -0,0 +1,22 @@
+Name:Foreboding Statue
+ManaCost:3
+Types:Artifact Creature Construct
+PT:1/2
+A:AB$ Mana | Cost$ T | Produced$ Any | Amount$ 1 | SubAbility$ DBPutCounter | SpellDescription$ Add one mana of any color.
+SVar:DBPutCounter:DB$ PutCounter | Defined$ Self | Defined$ Self | CounterType$ OMEN | CounterNum$ 1 | SpellDescription$ Put an omen counter on CARDNAME.
+T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | IsPresent$ Card.Self+counters_GE3_OMEN | TriggerZones$ Battlefield | Execute$ TrigUntap | TriggerDescription$ At the beginning of your end step, if there are three or more omen counters on CARDNAME, untap it, then transform it.
+SVar:TrigUntap:DB$ Untap | Defined$ Self | SubAbility$ DBTransform
+SVar:DBTransform:DB$ SetState | Defined$ Self | Mode$ Transform
+AlternateMode:DoubleFaced
+DeckHas:Ability$Counters
+Oracle:{T}: Add one mana of any color. Put an omen counter on Foreboding Statue.\nAt the beginning of your end step, if there are three or more omen counters on Foreboding Statue, untap it, then transform it.
+
+ALTERNATE
+
+Name:Forsaken Thresher
+ManaCost:no cost
+Types:Artifact Creature Construct
+PT:5/5
+T:Mode$ Phase | PreCombatMain$ True | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigMana | TriggerDescription$ At the beginning of your precombat main phase, add one mana of any color.
+SVar:TrigMana:DB$ Mana | Produced$ Any
+Oracle:At the beginning of your precombat main phase, add one mana of any color.
diff --git a/forge-gui/res/cardsfolder/upcoming/gift_of_fangs.txt b/forge-gui/res/cardsfolder/upcoming/gift_of_fangs.txt
new file mode 100644
index 00000000000..c4b57a17958
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/gift_of_fangs.txt
@@ -0,0 +1,9 @@
+Name:Gift of Fangs
+ManaCost:B
+Types:Enchantment Aura
+K:Enchant creature
+A:SP$ Attach | Cost$ B | ValidTgts$ Creature | AILogic$ SpecificCard | AIValid$ Vampire
+S:Mode$ Continuous | Affected$ Creature.EnchantedBy+Vampire | AddPower$ 2 | AddToughness$ 2 | Description$ Enchanted creature gets +2/+2 as long as it's a Vampire. Otherwise, it gets -2/-2.
+S:Mode$ Continuous | Affected$ Creature.EnchantedBy+nonVampire | AddPower$ -2 | AddToughness$ -2 | Secondary$ True
+DeckHints:Type$Vampire
+Oracle:Enchant creature\nEnchanted creature gets +2/+2 as long as it's a Vampire. Otherwise, it gets -2/-2.
diff --git a/forge-gui/res/cardsfolder/upcoming/glass_cast_heart.txt b/forge-gui/res/cardsfolder/upcoming/glass_cast_heart.txt
new file mode 100644
index 00000000000..64b2d72c9ac
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/glass_cast_heart.txt
@@ -0,0 +1,11 @@
+Name:Glass-Cast Heart
+ManaCost:2 B
+Types:Artifact
+T:Mode$ AttackersDeclared | ValidAttackers$ Vampire.YouCtrl | Execute$ TrigToken | TriggerZones$ Battlefield | TriggerDescription$ Whenever one or more Vampires you control attack, create a Blood token. (It's an artifact with "{1}, {T}, Discard a card, Sacrifice this artifact: Draw a card.")
+SVar:TrigToken:DB$ Token | TokenScript$ c_a_blood_draw
+A:AB$ Token | Cost$ B T PayLife<1> | TokenScript$ wb_1_1_vampire_lifelink | StackDescription$ SpellDescription | SpellDescription$ Create a 1/1 white and black Vampire creature token with lifelink.
+A:AB$ LoseLife | Cost$ B B T Sac<1/CARDNAME> Sac<13/Blood.token/Blood token> | CostDesc$ {B}{B}, {T}, Sacrifice CARDNAME and thirteen Blood tokens: | Defined$ Player.Opponent | LifeAmount$ 13 | SubAbility$ DBGainLife | SpellDescription$ Each opponent loses 13 life and you gain 13 life.
+SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 13
+DeckHints:Type$Vampire
+DeckHas:Ability$Token & Ability$Sacrifice & Ability$LifeGain & Type$Blood|Vampire
+Oracle:Whenever one or more Vampires you control attack, create a Blood token. (It's an artifact with "{1}, {T}, Discard a card, Sacrifice this artifact: Draw a card.")\n{B}, {T}, Pay 1 life: Create a 1/1 white and black Vampire creature token with lifelink.\n{B}{B}, {T}, Sacrifice Glass-Cast Heart and thirteen Blood tokens: Each opponent loses 13 life and you gain 13 life.
diff --git a/forge-gui/res/cardsfolder/upcoming/grisly_ritual.txt b/forge-gui/res/cardsfolder/upcoming/grisly_ritual.txt
new file mode 100644
index 00000000000..3382b1e2dc8
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/grisly_ritual.txt
@@ -0,0 +1,7 @@
+Name:Grisly Ritual
+ManaCost:5 B
+Types:Sorcery
+A:SP$ Destroy | Cost$ 5 B | ValidTgts$ Creature,Planeswalker | TgtPrompt$ Select target creature or planeswalker | SubAbility$ DBToken | SpellDescription$ Destroy target creature or planeswalker.
+SVar:DBToken:DB$ Token | TokenAmount$ 2 | TokenScript$ c_a_blood_draw | SpellDescription$ Create two Blood tokens. (They're artifacts with "{1}, {T}, Discard a card, Sacrifice this artifact: Draw a card.")
+DeckHas:Ability$Token & Ability$Sacrifice & Type$Blood
+Oracle:Destroy target creature or planeswalker. Create two Blood tokens. (They're artifacts with "{1}, {T}, Discard a card, Sacrifice this artifact: Draw a card.")
diff --git a/forge-gui/res/cardsfolder/upcoming/gryffwing_cavalry.txt b/forge-gui/res/cardsfolder/upcoming/gryffwing_cavalry.txt
new file mode 100644
index 00000000000..de4d6b067de
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/gryffwing_cavalry.txt
@@ -0,0 +1,10 @@
+Name:Gryffwing Cavalry
+ManaCost:3 W
+Types:Creature Human Knight
+PT:2/2
+K:Flying
+K:Training
+T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, you may pay {1}{W}. If you do, another target attacking creature without flying gains flying until end of turn.
+SVar:TrigPump:AB$ Pump | Cost$ 1 W | ValidTgts$ Creature.Other+attacking+withoutFlying | TgtPrompt$ Select another target attacking creature without flying | KW$ Flying
+SVar:HasAttackEffect:TRUE
+Oracle:Flying\nTraining (Whenever this creature attacks with another creature with greater power, put a +1/+1 counter on this creature.)\nWhenever Gryffwing Cavalry attacks, you may pay {1}{W}. If you do, another target attacking creature without flying gains flying until end of turn.
diff --git a/forge-gui/res/cardsfolder/upcoming/gutter_skulker_gutter_shortcut.txt b/forge-gui/res/cardsfolder/upcoming/gutter_skulker_gutter_shortcut.txt
new file mode 100644
index 00000000000..ffbbc6b8e5d
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/gutter_skulker_gutter_shortcut.txt
@@ -0,0 +1,22 @@
+Name:Gutter Skulker
+ManaCost:3 U
+Types:Creature Spirit
+PT:3/3
+K:Disturb:3 U
+S:Mode$ Continuous | Affected$ Card.Self+attacking | AddHiddenKeyword$ Unblockable | IsPresent$ Card.Other+attacking | PresentCompare$ EQ0 | Description$ CARDNAME can't be blocked as long as it's attacking alone.
+AlternateMode:DoubleFaced
+DeckHas:Ability$Graveyard
+Oracle:Gutter Skulker can't be blocked as long as it's attacking alone.\nDisturb {3}{U} (You may cast this card from your graveyard transformed for its disturb cost.)
+
+ALTERNATE
+
+Name:Gutter Shortcut
+ManaCost:no cost
+Colors:blue
+Types:Enchantment Aura
+K:Enchant creature
+A:SP$ Attach | ValidTgts$ Creature | TgtPrompt$ Select target creature | AILogic$ Pump
+S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddHiddenKeyword$ Unblockable | IsPresent$ Card.Other+attacking | PresentCompare$ EQ0 | Description$ Enchanted creature can't be blocked as long as it's attacking alone.
+R:Event$ Moved | ValidCard$ Card.Self | Destination$ Graveyard | ReplaceWith$ Exile | Description$ If CARDNAME would be put into a graveyard from anywhere, exile it instead.
+SVar:Exile:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Exile | Defined$ ReplacedCard
+Oracle:Enchant creature\nEnchanted creature can't be blocked as long as it's attacking alone.\nIf Gutter Shortcut would be put into a graveyard from anywhere, exile it instead.
diff --git a/forge-gui/res/cardsfolder/upcoming/haunted_library.txt b/forge-gui/res/cardsfolder/upcoming/haunted_library.txt
new file mode 100644
index 00000000000..0b0035c63b6
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/haunted_library.txt
@@ -0,0 +1,7 @@
+Name:Haunted Library
+ManaCost:1 W
+Types:Enchantment
+T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.OppCtrl | TriggerZones$ Battlefield | Execute$ TrigToken | OptionalDecider$ You | TriggerDescription$ Whenever a creature an opponent controls dies, you may pay {1}. If you do, create a 1/1 white Spirit creature token with flying.
+SVar:TrigToken:AB$Token | Cost$ 1 | TokenAmount$ 1 | TokenScript$ w_1_1_spirit_flying | TokenOwner$ You
+DeckHas:Ability$Token
+Oracle:Whenever a creature an opponent controls dies, you may pay {1}. If you do, create a 1/1 white Spirit creature token with flying.
diff --git a/forge-gui/res/cardsfolder/upcoming/haunting_imitation.txt b/forge-gui/res/cardsfolder/upcoming/haunting_imitation.txt
new file mode 100644
index 00000000000..e61ab85e184
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/haunting_imitation.txt
@@ -0,0 +1,10 @@
+Name:Haunting Imitation
+ManaCost:2 U
+Types:Sorcery
+A:SP$ Dig | Defined$ Player | DigNum$ 1 | Reveal$ True | NoMove$ True | RememberRevealed$ True | SubAbility$ DBRepeatEach | StackDescription$ SpellDescription | SpellDescription$ Each player reveals the top card of their library. For each creature card revealed this way, create a token that's a copy of that card, except it's 1/1, it's a Spirit in addition to its other types, and it has flying. If no creature cards were revealed this way, return Haunting Imitation to its owner's hand.
+SVar:DBRepeatEach:DB$ RepeatEach | RepeatCards$ Creature.IsRemembered | Zone$ Library | UseImprinted$ True | RepeatSubAbility$ DBToken | SubAbility$ DBReturn
+SVar:DBToken:DB$ CopyPermanent | Defined$ Imprinted | SetPower$ 1 | SetToughness$ 1 | AddTypes$ Spirit | AddKeywords$ Flying
+SVar:DBReturn:DB$ ChangeZone | Defined$ Self | Origin$ Stack | Destination$ Hand | ConditionDefined$ Remembered | ConditionPresent$ Creature | ConditionCompare$ EQ0 | SubAbility$ DBCleanup | StackDescription$ None
+SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
+DeckHas:Ability$Token & Type$Spirit
+Oracle: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.
diff --git a/forge-gui/res/cardsfolder/upcoming/heron_blessed_geist.txt b/forge-gui/res/cardsfolder/upcoming/heron_blessed_geist.txt
new file mode 100644
index 00000000000..82f733149d6
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/heron_blessed_geist.txt
@@ -0,0 +1,10 @@
+Name:Heron-Blessed Geist
+ManaCost:4 W
+Types:Creature Spirit
+PT:3/3
+K:Flying
+A:AB$ Token | Cost$ 3 W ExileFromGrave<1/CARDNAME> | ActivationZone$ Graveyard | SorcerySpeed$ True | TokenAmount$ 2 | IsPresent$ Enchantment.YouCtrl | TokenScript$ w_1_1_spirit_flying | StackDescription$ Create two 1/1 white Spirit creature tokens with flying. | SpellDescription$ Create two 1/1 white Spirit creature tokens with flying. Activate only if you control and enchantment and only as a sorcery.
+SVar:BuffedBy:Enchantment
+DeckHas:Ability$Token
+DeckHints:Type$Enchantment
+Oracle:Flying\n{3}{W}, Exile Heron-Blessed Geist from your graveyard: Create two 1/1 white Spirit creature tokens with flying. Activate only if you control an enchantment and only as a sorcery.
diff --git a/forge-gui/res/cardsfolder/upcoming/heron_of_hope.txt b/forge-gui/res/cardsfolder/upcoming/heron_of_hope.txt
new file mode 100644
index 00000000000..f9bb88cb89b
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/heron_of_hope.txt
@@ -0,0 +1,11 @@
+Name:Heron of Hope
+ManaCost:3 W
+Types:Creature Bird
+PT:2/3
+K:Flying
+R:Event$ GainLife | ActiveZones$ Battlefield | ValidPlayer$ You | ReplaceWith$ GainLife | AiLogic$ DoubleLife | Description$ If you would gain life, you gain that much life plus 1 instead.
+SVar:GainLife:DB$ ReplaceEffect | VarName$ LifeGained | VarValue$ X
+SVar:X:ReplaceCount$LifeGained/Plus.1
+A:AB$ Pump | Cost$ 1 W | Defined$ Self | KW$ Lifelink | SpellDescription$ CARDNAME gains lifelink until end of turn.
+DeckHas:Ability$LifeGain
+Oracle:Flying\nIf you would gain life, you gain that much life plus 1 instead.\n{1}{W}: Heron of Hope gains lifelink until end of turn.
diff --git a/forge-gui/res/cardsfolder/upcoming/hollowhenge_overlord.txt b/forge-gui/res/cardsfolder/upcoming/hollowhenge_overlord.txt
new file mode 100644
index 00000000000..54828e46738
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/hollowhenge_overlord.txt
@@ -0,0 +1,12 @@
+Name:Hollowhenge Overlord
+ManaCost:4 G G
+Types:Creature Wolf
+PT:4/4
+K:Flash
+T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ At the beginning of your upkeep, for each creature you control that's a Wolf or a Werewolf, create a 2/2 green Wolf creature token.
+SVar:TrigToken:DB$ Token | TokenAmount$ X | TokenScript$ g_2_2_wolf
+SVar:X:Count$Valid Creature.Wolf+YouCtrl,Creature.Werewolf+YouCtrl
+DeckHints:Type$Wolf|Werewolf
+DeckHas:Ability$Token
+SVar:BuffedBy:Wolf,Werewolf
+Oracle:Flash\nAt the beginning of your upkeep, for each creature you control that’s a Wolf or a Werewolf, create a 2/2 green Wolf creature token.
diff --git a/forge-gui/res/cardsfolder/upcoming/honored_heirloom.txt b/forge-gui/res/cardsfolder/upcoming/honored_heirloom.txt
index f562cb8bbe9..72332739b74 100644
--- a/forge-gui/res/cardsfolder/upcoming/honored_heirloom.txt
+++ b/forge-gui/res/cardsfolder/upcoming/honored_heirloom.txt
@@ -1,4 +1,5 @@
Name:Honored Heirloom
+ManaCost:3
Types:Artifact
A:AB$ Mana | Cost$ T | Produced$ Any | SpellDescription$ Add one mana of any color.
A:AB$ ChangeZone | Cost$ 2 T | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Select target card in a graveyard | ValidTgts$ Card | SpellDescription$ Exile target card from a graveyard.
diff --git a/forge-gui/res/cardsfolder/upcoming/hookhand_mariner_riphook_raider.txt b/forge-gui/res/cardsfolder/upcoming/hookhand_mariner_riphook_raider.txt
new file mode 100644
index 00000000000..60720639d8e
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/hookhand_mariner_riphook_raider.txt
@@ -0,0 +1,18 @@
+Name:Hookhand Mariner
+ManaCost:3 G
+Types:Creature Human Werewolf
+PT:4/4
+K:Daybound
+AlternateMode:DoubleFaced
+Oracle:Daybound (If a player casts no spells during their own turn, it becomes night next turn.)
+
+ALTERNATE
+
+Name:Riphook Raider
+ManaCost:no cost
+Colors:green
+Types:Creature Werewolf
+PT:6/4
+K:Nightbound
+S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.powerLE2 | Description$ CARDNAME can't be blocked by creatures with power 2 or less.
+Oracle:Riphook Raider can't be blocked by creatures with power 2 or less.\nNightbound (If a player casts at least two spells during their own turn, it becomes day next turn.)
diff --git a/forge-gui/res/cardsfolder/upcoming/howling_moon.txt b/forge-gui/res/cardsfolder/upcoming/howling_moon.txt
new file mode 100644
index 00000000000..67d326516be
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/howling_moon.txt
@@ -0,0 +1,10 @@
+Name:Howling Moon
+ManaCost:2 G
+Types:Enchantment
+T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ At the beginning of combat on your turn, target Wolf or Werewolf you control gets +2/+2 until end of turn.
+SVar:TrigPump:DB$ Pump | ValidTgts$ Wolf.YouCtrl,Werewolf.YouCtrl | TgtPrompt$ Select target Wolf or Werewolf you control | NumAtt$ 2 | NumDef$ 2
+T:Mode$ SpellCast | ValidActivatingPlayer$ Opponent | ActivatorThisTurnCast$ EQ2 | NoResolvingCheck$ True | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever an opponent casts their second spell each turn, create a 2/2 green Wolf creature token.
+SVar:TrigToken:DB$ Token | TokenScript$ g_2_2_wolf
+DeckHints:Type$Wolf|Werewolf
+DeckHas:Ability$Token
+Oracle:At the beginning of combat on your turn, target Wolf or Werewolf you control gets +2/+2 until end of turn.\nWhenever an opponent casts their second spell each turn, create a 2/2 green Wolf creature token.
diff --git a/forge-gui/res/cardsfolder/upcoming/hungry_ridgewolf.txt b/forge-gui/res/cardsfolder/upcoming/hungry_ridgewolf.txt
new file mode 100644
index 00000000000..c4c42694897
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/hungry_ridgewolf.txt
@@ -0,0 +1,7 @@
+Name:Hungry Ridgewolf
+ManaCost:1 R
+Types:Creature Wolf
+PT:2/2
+S:Mode$ Continuous | Affected$ Card.Self | AddPower$ 1 | AddKeyword$ Trample | IsPresent$ Wolf.Other+YouCtrl,Werewolf.Other+YouCtrl | Description$ As long as you control another Wolf or Werewolf, CARDNAME gets +1/+0 and has trample.
+DeckHints:Type$Wolf|Werewolf
+Oracle:As long as you control another Wolf or Werewolf, Hungry Ridgewolf gets +1/+0 and has trample.
diff --git a/forge-gui/res/cardsfolder/upcoming/ill_tempered_loner_howlpack_avenger.txt b/forge-gui/res/cardsfolder/upcoming/ill_tempered_loner_howlpack_avenger.txt
new file mode 100644
index 00000000000..35862336b34
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/ill_tempered_loner_howlpack_avenger.txt
@@ -0,0 +1,28 @@
+Name:Ill-Tempered Loner
+ManaCost:2 R R
+Types:Creature Human Werewolf
+PT:3/3
+T:Mode$ DamageDoneOnce | Execute$ TrigDamage | ValidTarget$ Card.Self | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME is dealt damage, it deals that much damage to any target.
+SVar:TrigDamage:DB$ DealDamage | NumDmg$ X | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target
+SVar:X:TriggerCount$DamageAmount
+SVar:HasCombatEffect:TRUE
+A:AB$ Pump | Cost$ 1 R | Defined$ Self | NumAtt$ +2 | SpellDescription$ CARDNAME gets +2/+0 until end of turn.
+K:Daybound
+AlternateMode:DoubleFaced
+Oracle:Whenever Ill-Tempered Loner is dealt damage, it deals that much damage to any target.\n{1}{R}: Ill-Tempered Loner gets +2/+0 until end of turn.\nDaybound (If a player casts no spells during their own turn, it becomes night next turn.)
+
+ALTERNATE
+
+Name:Howlpack Avenger
+ManaCost:no cost
+Colors:red
+Types:Creature Werewolf
+PT:4/4
+T:Mode$ DamageDoneOnce | Execute$ TrigDamage | ValidTarget$ Permanent.YouCtrl | TriggerZones$ Battlefield | TriggerDescription$ Whenever a permanent you control is dealt damage, CARDNAME deals that much damage to any target.
+SVar:TrigDamage:DB$ DealDamage | NumDmg$ X | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target
+SVar:X:TriggerCount$DamageAmount
+S:Mode$ Continuous | Affected$ Permanent.YouCtrl | AddSVar$ CE
+SVar:CE:SVar:HasCombatEffect:TRUE
+A:AB$ Pump | Cost$ 1 R | Defined$ Self | NumAtt$ +2 | SpellDescription$ CARDNAME gets +2/+0 until end of turn.
+K:Nightbound
+Oracle:Whenever a permanent you control is dealt damage, Howlpack Avenger deals that much damage to any target.\n{1}{R}: Howlpack Avenger gets +2/+0 until end of turn.\nNightbound (If a player casts at least two spells during their own turn, it becomes day next turn.)
diff --git a/forge-gui/res/cardsfolder/upcoming/imperious_mindbreaker.txt b/forge-gui/res/cardsfolder/upcoming/imperious_mindbreaker.txt
new file mode 100755
index 00000000000..1ce910e88f3
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/imperious_mindbreaker.txt
@@ -0,0 +1,13 @@
+Name:Imperious Mindbreaker
+ManaCost:1 U U
+Types:Creature Human Wizard
+PT:1/4
+K:Soulbond
+S:Mode$ Continuous | Affected$ Creature.PairedWith,Creature.Self+Paired | AddTrigger$ AttackTrig | AddSVar$ AE & TrigMill | Description$ As long as CARDNAME is paired with another creature, each of those creatures has "Whenever this creature attacks, each opponent mills cards equal to its toughness."
+SVar:AttackTrig:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigMill | TriggerDescription$ Whenever this creature attacks, each opponent mills cards equal to its toughness.
+SVar:TrigMill:DB$ Mill | NumCards$ X | Defined$ Player.Opponent
+SVar:X:TriggeredAttacker$CardToughness
+SVar:AE:SVar:HasAttackEffect:TRUE
+SVar:BuffedBy:Creature
+DeckHas:Ability$Mill
+Oracle:Soulbond (You may pair this creature with another unpaired creature when either enters the battlefield. They remain paired for as long as you control both of them.)\nAs long as Imperious Mindbreaker is paired with another creature, each of those creatures has "Whenever this creature attacks, each opponent mills cards equal to its toughness."
diff --git a/forge-gui/res/cardsfolder/upcoming/imposing_grandeur.txt b/forge-gui/res/cardsfolder/upcoming/imposing_grandeur.txt
new file mode 100644
index 00000000000..195113c4292
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/imposing_grandeur.txt
@@ -0,0 +1,9 @@
+Name:Imposing Grandeur
+ManaCost:4 R
+Types:Sorcery
+A:SP$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBDraw | SpellDescription$ Each player may discard their hand and draw cards equal to the greatest mana value of a commander they own on the battlefield or in the command zone.
+SVar:DBDraw:DB$ Draw | UnlessCost$ Discard<1/Hand> | UnlessPayer$ Remembered | UnlessSwitched$ True | Defined$ Remembered | NumCards$ X
+SVar:X:Count$HighestCMC_Card.IsCommander+YouOwn+inZoneBattlefield,Card.IsCommander+YouOwn+inZoneCommand
+DeckHas:Ability$Discard
+AI:RemoveDeck:NonCommander
+Oracle:Each player may discard their hand and draw cards equal to the greatest mana value of a commander they own on the battlefield or in the command zone.
diff --git a/forge-gui/res/cardsfolder/upcoming/infestation_expert_infested_werewolf.txt b/forge-gui/res/cardsfolder/upcoming/infestation_expert_infested_werewolf.txt
new file mode 100644
index 00000000000..4a166d768ca
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/infestation_expert_infested_werewolf.txt
@@ -0,0 +1,27 @@
+Name:Infestation Expert
+ManaCost:4 G
+Types:Creature Human Werewolf
+PT:3/4
+T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ Whenever CARDNAME enters the battlefield or attacks, create a 1/1 green Insect creature token.
+T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigToken | Secondary$ True | TriggerDescription$ Whenever CARDNAME enters the battlefield or attacks, create a 1/1 green Insect creature token.
+SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ g_1_1_insect
+K:Daybound
+AlternateMode:DoubleFaced
+DeckHas:Ability$Token
+SVar:HasAttackEffect:TRUE
+Oracle:Whenever Infestation Expert enters the battlefield or attacks, create a 1/1 green Insect creature token.\nDaybound (If a player casts no spells during their own turn, it becomes night next turn.)
+
+ALTERNATE
+
+Name:Infested Werewolf
+ManaCost:no cost
+Colors:green
+Types:Creature Werewolf
+PT:4/5
+T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ Whenever CARDNAME enters the battlefield or attacks, create two 1/1 green Insect creature tokens.
+T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigToken | Secondary$ True | TriggerDescription$ Whenever CARDNAME enters the battlefield or attacks, create two 1/1 green Insect creature tokens.
+SVar:TrigToken:DB$ Token | TokenAmount$ 2 | TokenScript$ g_1_1_insect
+K:Nightbound
+DeckHas:Ability$Token
+SVar:HasAttackEffect:TRUE
+Oracle:Whenever Infested Werewolf enters the battlefield or attacks, create two 1/1 green Insect creature tokens.\nNightbound (If a player casts at least two spells during their own turn, it becomes day next turn.)
\ No newline at end of file
diff --git a/forge-gui/res/cardsfolder/upcoming/jacob_hauken_inspector_haukens_insight.txt b/forge-gui/res/cardsfolder/upcoming/jacob_hauken_inspector_haukens_insight.txt
new file mode 100644
index 00000000000..782ff50649c
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/jacob_hauken_inspector_haukens_insight.txt
@@ -0,0 +1,32 @@
+Name:Jacob Hauken, Inspector
+ManaCost:1 U
+Types:Legendary Creature Human Advisor
+PT:1/2
+A:AB$ Draw | Cost$ T | NumCards$ 1 | SubAbility$ DBExile | StackDescription$ {p:You} draws a card, | SpellDescription$ Draw a card,
+SVar:DBExile:DB$ ChangeZone | Origin$ Hand | Destination$ Exile | ChangeType$ Card | ChangeNum$ 1 | ExileFaceDown$ True | Imprint$ True | Mandatory$ True | SubAbility$ DBEffect | StackDescription$ then exiles a card from their hand face down. | SpellDescription$ then exile a card from your hand face down.
+SVar:DBEffect:DB$ Effect | RememberObjects$ Imprinted | StaticAbilities$ STLook | Duration$ Permanent | ForgetOnMoved$ Exile | SubAbility$ DBTransform | SpellDescription$ You may look at that card for as long as it remains exiled.
+SVar:STLook:Mode$ Continuous | MayLookAt$ You | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ You may look at this card for as long as it remains exiled.
+SVar:DBTransform:DB$ SetState | UnlessCost$ 4 U U | UnlessSwitched$ True | UnlessPayer$ You | Defined$ Self | Mode$ Transform | StackDescription$ SpellDescription | SpellDescription$ You may pay {4}{U}{U}. If you do, transform CARDNAME.
+T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsImprinted | Execute$ DBForget
+SVar:DBForget:DB$ Pump | Defined$ TriggeredCard | ForgetImprinted$ TriggeredCard
+T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup
+SVar:DBCleanup:DB$ Cleanup | ClearImprinted$ True
+AlternateMode:DoubleFaced
+Oracle:{T}: Draw a card, then exile a card from your hand face down. You may look at that card for as long as it remains exiled. You may pay {4}{U}{U}. If you do, transform Jacob Hauken, Inspector.
+
+ALTERNATE
+
+Name:Hauken's Insight
+ManaCost:no cost
+Colors:blue
+Types:Legendary Enchantment
+T:Mode$ Phase | Phase$ Upkeep | TriggerZones$ Battlefield | ValidPlayer$ You | Execute$ TrigExile | TriggerDescription$ At the beginning of your upkeep, exile the top card of your library face down. You may look at that card for as long as it remains exiled.
+SVar:TrigExile:DB$ Dig | Defined$ You | DigNum$ 1 | ChangeNum$ All | DestinationZone$ Exile | ExileFaceDown$ True | Imprint$ True | SubAbility$ DBEffect
+SVar:DBEffect:DB$ Effect | RememberObjects$ Imprinted | StaticAbilities$ STLook | Duration$ Permanent | ForgetOnMoved$ Exile
+SVar:STLook:Mode$ Continuous | MayLookAt$ You | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ You may look at this card for as long as it remains exiled.
+S:Mode$ Continuous | EffectZone$ Battlefield | Affected$ Card.IsImprinted+ExiledWithSource | AffectedZone$ Exile | MayPlay$ True | MayPlayLimit$ 1 | MayPlayWithoutManaCost$ True | Description$ Once during each of your turns, you may play a land or cast a spell from among the cards exiled with this permanent without paying its mana cost.
+T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsImprinted | Execute$ DBForget
+SVar:DBForget:DB$ Pump | Defined$ TriggeredCard | ForgetImprinted$ TriggeredCard
+T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup
+SVar:DBCleanup:DB$ Cleanup | ClearImprinted$ True
+Oracle:At the beginning of your upkeep, exile the top card of your library face down. You may look at that card for as long as it remains exiled.\nOnce during each of your turns, you may play a land or cast a spell from among the cards exiled with this permanent without paying its mana cost.
diff --git a/forge-gui/res/cardsfolder/upcoming/kamber_the_plunderer.txt b/forge-gui/res/cardsfolder/upcoming/kamber_the_plunderer.txt
new file mode 100644
index 00000000000..3c8946aa14b
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/kamber_the_plunderer.txt
@@ -0,0 +1,13 @@
+Name:Kamber, the Plunderer
+ManaCost:3 B
+Types:Legendary Creature Vampire Rogue
+PT:3/4
+K:Partner:Laurine, the Diversion
+K:Lifelink
+T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.OppCtrl | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever a creature an opponent controls dies, you gain 1 life and create a Blood token.
+SVar:TrigGainLife:DB$ GainLife | LifeAmount$ 1 | SubAbility$ DBToken
+SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_blood_draw | TokenOwner$ You
+SVar:PlayMain1:TRUE
+DeckHints:Name$Laurine, the Diversion
+DeckHas:Ability$Token & Ability$Sacrifice & Type$Blood & Ability$LifeGain
+Oracle:Partner with Laurine, the Diversion (When this creature enters the battlefield, target player may put Laurine into their hand from their library, then shuffle.)\nLifelink\nWhenever a creature an opponent controls dies, you gain 1 life and create a Blood token. (It's an artifact with "{1}, {T}, Discard a card, Sacrifice this artifact: Draw a card.")
diff --git a/forge-gui/res/cardsfolder/upcoming/katilda_dawnhart_martyr_katildas_rising_dawn.txt b/forge-gui/res/cardsfolder/upcoming/katilda_dawnhart_martyr_katildas_rising_dawn.txt
new file mode 100644
index 00000000000..997999778c1
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/katilda_dawnhart_martyr_katildas_rising_dawn.txt
@@ -0,0 +1,32 @@
+Name:Katilda, Dawnhart Martyr
+ManaCost:1 W W
+Types:Legendary Creature Spirit Warlock
+PT:*/*
+K:Flying
+K:Lifelink
+K:Protection from Vampires
+K:Disturb:3 W W
+S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | SetToughness$ X | Description$ CARDNAME's power and toughness are each equal to the number of permanents you control that are Spirits and/or enchantments.
+SVar:X:Count$Valid Spirit.YouCtrl,Enchantment.YouCtrl
+SVar:NeedsToPlayVar:X GE2
+SVar:BuffedBy:Enchantment,Spirit
+DeckHints:Type$Spirit|Enchantment
+DeckHas:Ability$LifeGain & Ability$Graveyard
+AlternateMode:DoubleFaced
+Oracle:Flying, lifelink, protection from Vampires\nKatilda, Dawnhart Martyr's power and toughness are each equal to the number of permanents you control that are Spirits and/or enchantments.\nDisturb {3}{W}{W} (You may cast this card from your graveyard transformed for its disturb cost.)
+
+ALTERNATE
+
+Name:Katilda's Rising Dawn
+ManaCost:no cost
+Colors:white
+Types:Legendary Enchantment Aura
+K:Enchant creature
+A:SP$ Attach | ValidTgts$ Creature | TgtPrompt$ Select target creature | AILogic$ Pump
+S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ X | AddToughness$ X | AddKeyword$ Flying & Lifelink & Protection from Vampires | Description$ Enchanted creature has flying, lifelink, and protection from Vampires, and it gets +X/+X, where X is the number of permanents you control that are Spirits and/or enchantments.
+SVar:X:Count$Valid Spirit.YouCtrl,Enchantment.YouCtrl
+SVar:BuffedBy:Enchantment,Spirit
+R:Event$ Moved | ValidCard$ Card.Self | Destination$ Graveyard | ReplaceWith$ Exile | Description$ If CARDNAME would be put into a graveyard from anywhere, exile it instead.
+SVar:Exile:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Exile | Defined$ ReplacedCard
+DeckHas:Ability$LifeGain
+Oracle:Enchant creature\nEnchanted creature has flying, lifelink, and protection from Vampires, and it gets +X/+X, where X is the number of permanents you control that are Spirits and/or enchantments.\nIf Katilda's Rising Dawn would be put into a graveyard from anywhere, exile it instead.
diff --git a/forge-gui/res/cardsfolder/upcoming/kaya_geist_hunter.txt b/forge-gui/res/cardsfolder/upcoming/kaya_geist_hunter.txt
new file mode 100644
index 00000000000..7afdf948827
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/kaya_geist_hunter.txt
@@ -0,0 +1,15 @@
+Name:Kaya, Geist Hunter
+ManaCost:1 W B
+Types:Legendary Planeswalker Kaya
+Loyalty:3
+A:AB$ PumpAll | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | ValidCards$ Creature.YouCtrl | KW$ Deathtouch | SubAbility$ DBPutCounter | SpellDescription$ Creatures you control gain deathtouch until end of turn.
+SVar:DBPutCounter:DB$ PutCounter | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Creature.token+YouCtrl | TgtPrompt$ Select up to one target creature token you control | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on up to one target creature token you control.
+A:AB$ Effect | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | ReplacementEffects$ TokenReplace | SpellDescription$ Until end of turn, if one or more tokens would be created under your control, twice that many of those tokens are created instead.
+SVar:TokenReplace:Event$ CreateToken | ActiveZones$ Battlefield | ValidToken$ Card.YouCtrl | ReplaceWith$ DoubleToken | Description$ If one or more tokens would be created under your control, twice that many of those tokens are created instead.
+SVar:DoubleToken:DB$ ReplaceToken | Type$ Amount | ValidCard$ Card.YouCtrl
+A:AB$ ChangeZoneAll | Cost$ SubCounter<6/LOYALTY> | Planeswalker$ True | Ultimate$ True | ChangeType$ Card | Origin$ Graveyard | Destination$ Exile | RememberChanged$ True | SubAbility$ DBToken | SpellDescription$ Exile all cards from all graveyards, then create a 1/1 white Spirit creature token with flying for each card exiled this way.
+SVar:DBToken:DB$ Token | TokenScript$ w_1_1_spirit_flying | TokenAmount$ X
+SVar:X:Remembered$Amount
+DeckHas:Ability$Counters & Ability$Token & Type$Spirit
+DeckHints:Ability$Token
+Oracle:[+1]: Creatures you control gain deathtouch until end of turn. Put a +1/+1 counter on up to one target creature token you control.\n[−2]: Until end of turn, if one or more tokens would be created under your control, twice that many of those tokens are created instead.\n[−6]: Exile all cards from all graveyards, then create a 1/1 white Spirit creature token with flying for each card exiled this way.
diff --git a/forge-gui/res/cardsfolder/upcoming/kessig_flamebreather.txt b/forge-gui/res/cardsfolder/upcoming/kessig_flamebreather.txt
new file mode 100644
index 00000000000..7193a5f5f79
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/kessig_flamebreather.txt
@@ -0,0 +1,8 @@
+Name:Kessig Flamebreather
+ManaCost:1 R
+Types:Creature Human Shaman
+PT:1/3
+T:Mode$ SpellCast | ValidCard$ Card.nonCreature | ValidActivatingPlayer$ You | Execute$ TrigDamage | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a noncreature spell, CARDNAME deals 1 damage to each opponent.
+SVar:TrigDamage:DB$ DealDamage | Defined$ Player.Opponent | NumDmg$ 1
+SVar:BuffedBy:Card.nonLand+nonCreature
+Oracle:Whenever you cast a noncreature spell, Kessig Flamebreather deals 1 damage to each opponent.
diff --git a/forge-gui/res/cardsfolder/upcoming/lacerate_flesh.txt b/forge-gui/res/cardsfolder/upcoming/lacerate_flesh.txt
new file mode 100644
index 00000000000..4761136577d
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/lacerate_flesh.txt
@@ -0,0 +1,7 @@
+Name:Lacerate Flesh
+ManaCost:4 R
+Types:Sorcery
+A:SP$ DealDamage | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 4 | ExcessSVar$ X | SubAbility$ DBToken | SpellDescription$ CARDNAME deals 4 damage to target creature.
+SVar:DBToken:DB$ Token | TokenScript$ c_a_blood_draw | TokenAmount$ X | SpellDescription$ Create a number of Blood tokens equal to the amount of excess damage dealt to that creature this way. (They're artifacts with "{1}, {T}, Discard a card, Sacrifice this artifact: Draw a card.")
+DeckHas:Ability$Token & Ability$Sacrifice & Type$Blood
+Oracle:Lacerate Flesh deals 4 damage to target creature. Create a number of Blood tokens equal to the amount of excess damage dealt to that creature this way. (They're artifacts with "{1}, {T}, Discard a card, Sacrifice this artifact: Draw a card.")
diff --git a/forge-gui/res/cardsfolder/upcoming/lambholt_raconteur_lambholt_ravager.txt b/forge-gui/res/cardsfolder/upcoming/lambholt_raconteur_lambholt_ravager.txt
new file mode 100644
index 00000000000..2f98f74fdf5
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/lambholt_raconteur_lambholt_ravager.txt
@@ -0,0 +1,23 @@
+Name:Lambholt Raconteur
+ManaCost:3 R
+Types:Creature Human Werewolf
+PT:2/4
+T:Mode$ SpellCast | ValidCard$ Card.nonCreature | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever you cast a noncreature spell, CARDNAME deals 1 damage to each opponent.
+SVar:TrigDamage:DB$ DealDamage | NumDmg$ 1 | Defined$ Player.Opponent
+K:Daybound
+AlternateMode:DoubleFaced
+SVar:BuffedBy:Card.nonCreature+nonLand
+Oracle:Whenever you cast a noncreature spell, Lambholt Raconteur deals 1 damage to each opponent.\nDaybound (If a player casts no spells during their own turn, it becomes night next turn.)
+
+ALTERNATE
+
+Name:Lambholt Ravager
+ManaCost:no cost
+Colors:red
+Types:Creature Werewolf
+PT:4/4
+T:Mode$ SpellCast | ValidCard$ Card.nonCreature | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever you cast a noncreature spell, CARDNAME deals 2 damage to each opponent.
+SVar:TrigDamage:DB$ DealDamage | NumDmg$ 2 | Defined$ Player.Opponent
+K:Nightbound
+SVar:BuffedBy:Card.nonCreature+nonLand
+Oracle:Whenever you cast a noncreature spell, Lambholt Ravager deals 2 damage to each opponent.\nNightbound (If a player casts at least two spells during their own turn, it becomes day next turn.)
diff --git a/forge-gui/res/cardsfolder/upcoming/lantern_of_the_lost.txt b/forge-gui/res/cardsfolder/upcoming/lantern_of_the_lost.txt
new file mode 100755
index 00000000000..816b94da793
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/lantern_of_the_lost.txt
@@ -0,0 +1,8 @@
+Name:Lantern of the Lost
+ManaCost:1
+Types:Artifact
+T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, exile target card from a graveyard.
+SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Select target card in a graveyard | ValidTgts$ Card
+A:AB$ ChangeZoneAll | Cost$ 1 T Exile<1/CARDNAME> | Origin$ Graveyard | Destination$ Exile | ChangeType$ Card | AILogic$ ExileGraveyards | SubAbility$ DBDraw | SpellDescription$ Exile all cards from all graveyards, then draw a card.
+SVar:DBDraw:DB$ Draw | NumCards$ 1 | StackDescription$ None
+Oracle:When Lantern of the Lost enters the battlefield, exile target card from a graveyard.\n{1}, {T}, Exile Lantern of the Lost: Exile all cards from all graveyards, then draw a card.
diff --git a/forge-gui/res/cardsfolder/upcoming/laurine_the_diversion.txt b/forge-gui/res/cardsfolder/upcoming/laurine_the_diversion.txt
new file mode 100644
index 00000000000..6549a76b709
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/laurine_the_diversion.txt
@@ -0,0 +1,11 @@
+Name:Laurine, the Diversion
+ManaCost:2 R
+Types:Legendary Creature Human Rogue
+PT:3/3
+K:Partner:Kamber, the Plunderer
+K:First strike
+A:AB$ Goad | Cost$ 2 Sac<1/Artifact;Creature/artifact or creature> | ValidTgts$ Creature | TgtPrompt$ Select target creature SpellDescription$ Goad target creature.
+SVar:AIPreference:SacCost$Artifact.token+nonCreature,Creature.token+powerLE1,Creature.cmcLE1+powerLE1
+DeckHints:Name$Kamber, the Plunderer
+DeckHas:Ability$Sacrifice
+Oracle:Partner with Kamber, the Plunderer (When this creature enters the battlefield, target player may put Kamber into their hand from their library, then shuffle.)\nFirst strike\n{2}, Sacrifice an artifact or creature: Goad target creature. (Until your next turn, that creature attacks each combat if able and attacks a player other than you if able.)
diff --git a/forge-gui/res/cardsfolder/upcoming/lightning_wolf.txt b/forge-gui/res/cardsfolder/upcoming/lightning_wolf.txt
new file mode 100644
index 00000000000..4554757c17a
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/lightning_wolf.txt
@@ -0,0 +1,6 @@
+Name:Lightning Wolf
+ManaCost:3 R
+Types:Creature Wolf
+PT:4/3
+A:AB$ Pump | Cost$ 1 R | Defined$ Self | KW$ First Strike | SorcerySpeed$ True | SpellDescription$ CARDNAME gains first strike until end of turn. Activate only as a sorcery.
+Oracle:{1}{R}: Lightning Wolf gains first strike until end of turn. Activate only as a sorcery.
diff --git a/forge-gui/res/cardsfolder/upcoming/markov_enforcer.txt b/forge-gui/res/cardsfolder/upcoming/markov_enforcer.txt
new file mode 100644
index 00000000000..c8ef513d9dd
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/markov_enforcer.txt
@@ -0,0 +1,12 @@
+Name:Markov Enforcer
+ManaCost:4 R R
+Types:Creature Vampire Soldier
+PT:6/6
+T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self,Vampire.Other+YouCtrl | Execute$ TrigFight | TriggerDescription$ Whenever CARDNAME or another Vampire enters the battlefield under your control, CARDNAME fights up to one target creature an opponent controls.
+SVar:TrigFight:DB$ Fight | Defined$ Self | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select up to one target creature an opponent controls
+T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.DamagedBy | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever a creature dealt damage by CARDNAME this turn dies, create a Blood token. (It's an artifact with "{1}, {T}, Discard a card, Sacrifice this artifact: Draw a card.")
+SVar:TrigToken:DB$ Token | TokenScript$ c_a_blood_draw
+SVar:BuffedBy:Creature.Vampire
+DeckHints:Type$Vampire
+DeckHas:Ability$Token & Ability$Sacrifice & Type$Blood
+Oracle:Whenever Markov Enforcer or another Vampire enters the battlefield under your control, Markov Enforcer fights up to one target creature an opponent controls.\nWhenever a creature dealt damage by Markov Enforcer this turn dies, create a Blood token. (It's an artifact with "{1}, {T}, Discard a card, Sacrifice this artifact: Draw a card.")
diff --git a/forge-gui/res/cardsfolder/upcoming/midnight_arsonist.txt b/forge-gui/res/cardsfolder/upcoming/midnight_arsonist.txt
new file mode 100644
index 00000000000..2ca1c5869c1
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/midnight_arsonist.txt
@@ -0,0 +1,11 @@
+Name:Midnight Arsonist
+ManaCost:3 R
+Types:Creature Vampire
+PT:3/2
+T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, destroy up to X target artifacts without mana abilities, where X is the number of Vampires you control.
+SVar:TrigDestroy:DB$ Destroy | TargetMin$ 0 | TargetMax$ X | ValidTgts$ Artifact.withoutManaAbility | TgtPrompt$ Select up to X target artifacts without mana abilities
+SVar:X:Count$Valid Vampire.YouCtrl
+DeckHints:Type$Vampire
+AI:RemoveDeck:Random
+SVar:BuffedBy:Vampire
+Oracle:When Midnight Arsonist enters the battlefield, destroy up to X target artifacts without mana abilities, where X is the number of Vampires you control.
diff --git a/forge-gui/res/cardsfolder/upcoming/militia_rallier.txt b/forge-gui/res/cardsfolder/upcoming/militia_rallier.txt
new file mode 100644
index 00000000000..e9ecf7aee80
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/militia_rallier.txt
@@ -0,0 +1,9 @@
+Name:Militia Rallier
+ManaCost:2 W
+Types:Creature Human Soldier
+PT:3/3
+K:CARDNAME can't attack alone.
+T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigUntap | TriggerDescription$ Whenever CARDNAME attacks, untap target creature.
+SVar:TrigUntap:DB$ Untap | ValidTgts$ Creature | TgtPrompt$ Select target creature
+SVar:HasAttackEffect:TRUE
+Oracle:Militia Rallier can't attack alone.\nWhenever Militia Rallier attacks, untap target creature.
diff --git a/forge-gui/res/cardsfolder/upcoming/millicent_restless_revenant.txt b/forge-gui/res/cardsfolder/upcoming/millicent_restless_revenant.txt
index c4de476aa80..5f3190601f2 100644
--- a/forge-gui/res/cardsfolder/upcoming/millicent_restless_revenant.txt
+++ b/forge-gui/res/cardsfolder/upcoming/millicent_restless_revenant.txt
@@ -6,7 +6,7 @@ K:Flying
S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ This spell costs {1} less to cast for each Spirit you control.
SVar:X:Count$TypeYouCtrl.Spirit
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self,Spirit.Other+nonToken+YouCtrl | Execute$ TrigToken | TriggerDescription$ Whenever CARDNAME or another nontoken Spirit you control dies or deals combat damage to a player, create a 1/1 white Spirit creature token with flying.
-T:Mode$ DamageDone | ValidSource$ Card.Self,Spirit.Other+nonToken+YouCtrl | ValidTarget$ Player | Execute$ TrigToken | CombatDamage$ True | Secondary$ True | TriggerDescription$ Whenever CARDNAME or another nontoken Spirit you control dies or deals combat damage to a player, create a 1/1 white Spirit creature token with flying.
+T:Mode$ DamageDone | ValidSource$ Card.Self,Spirit.Other+nonToken+YouCtrl | ValidTarget$ Player | Execute$ TrigToken | TriggerZones$ Battlefield | CombatDamage$ True | Secondary$ True | TriggerDescription$ Whenever CARDNAME or another nontoken Spirit you control dies or deals combat damage to a player, create a 1/1 white Spirit creature token with flying.
SVar:TrigToken:DB$ Token | TokenScript$ w_1_1_spirit_flying
DeckHints:Type$Spirit & Ability$Disturb
DeckHas:Ability$Token
diff --git a/forge-gui/res/cardsfolder/upcoming/mirage_phalanx.txt b/forge-gui/res/cardsfolder/upcoming/mirage_phalanx.txt
new file mode 100644
index 00000000000..b3d4fad33f7
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/mirage_phalanx.txt
@@ -0,0 +1,11 @@
+Name:Mirage Phalanx
+ManaCost:4 R R
+Types:Creature Human Soldier
+PT:4/4
+K:Soulbond
+S:Mode$ Continuous | Affected$ Creature.PairedWith,Creature.Self+Paired | AddTrigger$ PhaseTrigger | Description$ As long as CARDNAME is paired with another creature, each of those creatures has "At the beginning of combat on your turn, create a token that's a copy of this creature, except it has haste and loses soulbond. Exile it at end of combat."
+SVar:PhaseTrigger:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigCopy | TriggerDescription$ At the beginning of combat on your turn, create a token that's a copy of this creature, except it has haste and loses soulbond. Exile it at end of combat.
+SVar:TrigCopy:DB$ CopyPermanent | Defined$ Self | RemoveKeywords$ Soulbond | AddKeywords$ Haste | AtEOT$ ExileCombat
+DeckHas:Ability$Token
+SVar:BuffedBy:Creature
+Oracle:Soulbond (You may pair this creature with another unpaired creature when either enters the battlefield. They remain paired for as long as you control both of them.)\nAs long as Mirage Phalanx is paired with another creature, each of those creatures has "At the beginning of combat on your turn, create a token that's a copy of this creature, except it has haste and loses soulbond. Exile it at end of combat."
diff --git a/forge-gui/res/cardsfolder/upcoming/natures_embrace.txt b/forge-gui/res/cardsfolder/upcoming/natures_embrace.txt
new file mode 100644
index 00000000000..0a47139f97a
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/natures_embrace.txt
@@ -0,0 +1,9 @@
+Name:Nature's Embrace
+ManaCost:2 G
+Types:Enchantment Aura
+K:Enchant creature or land
+A:SP$ Attach | Cost$ 2 G | ValidTgts$ Creature,Land | AILogic$ Pump
+S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 2 | AddToughness$ 2 | Description$ As long as enchanted permanent is a creature, it gets +2/+2.
+S:Mode$ Continuous | Affected$ Land.EnchantedBy | AddAbility$ DBMana | Description$ As long as enchanted permanent is a land, it has "{T}: Add two mana of any one color."
+SVar:DBMana:AB$ Mana | Cost$ T | Produced$ Any | Amount$ 2 | SpellDescription$ Add two mana of any one color.
+Oracle:Enchant creature or land\nAs long as enchanted permanent is a creature, it gets +2/+2.\nAs long as enchanted permanent is a land, it has "{T}: Add two mana of any one color."
diff --git a/forge-gui/res/cardsfolder/upcoming/nebelgast_beguiler.txt b/forge-gui/res/cardsfolder/upcoming/nebelgast_beguiler.txt
new file mode 100644
index 00000000000..5d7698fe993
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/nebelgast_beguiler.txt
@@ -0,0 +1,8 @@
+Name:Nebelgast Beguiler
+ManaCost:4 W
+Types:Creature Spirit
+PT:2/5
+K:Flying
+A:AB$ Tap | Cost$ W T | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Tap target creature.
+SVar:NonCombatPriority:1
+Oracle:Flying\n{W}, {T}: Tap target creature.
diff --git a/forge-gui/res/cardsfolder/upcoming/nurturing_presence.txt b/forge-gui/res/cardsfolder/upcoming/nurturing_presence.txt
new file mode 100644
index 00000000000..a25489eb16d
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/nurturing_presence.txt
@@ -0,0 +1,13 @@
+Name:Nurturing Presence
+ManaCost:1 W
+Types:Enchantment Aura
+K:Enchant creature
+A:SP$ Attach | ValidTgts$ Creature | AILogic$ Pump
+S:Mode$ Continuous | Affected$ Card.EnchantedBy | AddTrigger$ NurturingChangeZone | AddSVar$ NurturingPump | Description$ Enchanted creature has "Whenever a creature enters the battlefield under your control, this creature gets +1/+1 until end of turn."
+SVar:NurturingChangeZone:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | Execute$ NurturingPump | TriggerDescription$ Whenever another creature enters the battlefield under your control, CARDNAME gets +1/+1 until end of turn.
+SVar:NurturingPump:DB$ Pump | Defined$ Self | NumAtt$ 1 | NumDef$ 1
+T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a 1/1 white Spirit creature token with flying.
+SVar:TrigToken:DB$ Token | TokenScript$ w_1_1_spirit_flying
+SVar:BuffedBy:Creature
+DeckHas:Ability$Token
+Oracle:Enchant creature\nEnchanted creature has "Whenever a creature enters the battlefield under your control, this creature gets +1/+1 until end of turn."\nWhen Nurturing Presence enters the battlefield, create a 1/1 white Spirit creature token with flying.
diff --git a/forge-gui/res/cardsfolder/upcoming/oakshade_stalker_moonlit_ambusher.txt b/forge-gui/res/cardsfolder/upcoming/oakshade_stalker_moonlit_ambusher.txt
new file mode 100644
index 00000000000..505eff46835
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/oakshade_stalker_moonlit_ambusher.txt
@@ -0,0 +1,19 @@
+Name:Oakshade Stalker
+ManaCost:2 G
+Types:Creature Human Ranger Werewolf
+PT:3/3
+K:MayFlashCost:2
+K:Daybound
+AlternateMode:DoubleFaced
+Oracle:You may cast this spell as though it had flash if you pay {2} more to cast it.\nDaybound (If a player casts no spells during their own turn, it becomes night next turn.)
+
+ALTERNATE
+
+Name:Moonlit Ambusher
+ManaCost:no cost
+Colors:green
+Types:Creature Werewolf
+PT:6/3
+K:Nightbound
+Oracle:Nightbound (If a player casts at least two spells during their own turn, it becomes day next turn.)
+
diff --git a/forge-gui/res/cardsfolder/upcoming/occult_epiphany.txt b/forge-gui/res/cardsfolder/upcoming/occult_epiphany.txt
new file mode 100644
index 00000000000..066b02b2ad3
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/occult_epiphany.txt
@@ -0,0 +1,11 @@
+Name:Occult Epiphany
+ManaCost:X U
+Types:Instant
+A:SP$ Draw | NumCards$ X | SubAbility$ DBDiscard | SpellDescription$ Draw X cards,
+SVar:DBDiscard:DB$ Discard | Defined$ You | Mode$ TgtChoose | NumCards$ X | RememberDiscarded$ True | SubAbility$ DBToken | SpellDescription$ then discard X cards.
+SVar:DBToken:DB$ Token | TokenScript$ w_1_1_spirit_flying | TokenAmount$ Y | SubAbility$ DBCleanup | SpellDescription$ Create a 1/1 white Spirit creature token with flying for each card type among cards discarded this way.
+SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
+SVar:X:Count$xPaid
+SVar:Y:Count$CardTypes.Remembered
+DeckHas:Ability$Discard & Ability$Token & Type$Spirit
+Oracle:Draw X cards, then discard X cards. Create a 1/1 white Spirit creature token with flying for each card type among cards discarded this way.
diff --git a/forge-gui/res/cardsfolder/upcoming/odric_blood_cursed.txt b/forge-gui/res/cardsfolder/upcoming/odric_blood_cursed.txt
new file mode 100644
index 00000000000..82c09f403ff
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/odric_blood_cursed.txt
@@ -0,0 +1,10 @@
+Name:Odric, Blood-Cursed
+ManaCost:1 R W
+Types:Legendary Creature Vampire Soldier
+PT:3/3
+T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create X Blood tokens, where X is the number of abilities from among flying, first strike, double strike, deathtouch, haste, hexproof, indestructible, lifelink, menace, reach, trample, and vigilance found among creatures you control. (Count each ability only once.)
+SVar:TrigToken:DB$ Token | TokenAmount$ X | TokenScript$ c_a_blood_draw
+SVar:X:Count$AbilityYouCtrl Flying,First strike,Double strike,Deathtouch,Haste,Hexproof,Indestructible,Lifelink,Menace,Reach,Trample,Vigilance
+DeckHas:Ability$Token & Ability$Sacrifice & Type$Blood
+SVar:BuffedBy:Creature.withFlying,Creature.withFirst strike,Creature.withDouble strike,Creature.withDeathtouch,Creature.withHaste,Creature.withHexproof,Creature.withIndestructible,Creature.withLifelink,Creature.withMenace,Creature.withReach,Creature.withTrample,Creature.withVigilance
+Oracle:When Odric, Blood-Cursed enters the battlefield, create X Blood tokens, where X is the number of abilities from among flying, first strike, double strike, deathtouch, haste, hexproof, indestructible, lifelink, menace, reach, trample, and vigilance found among creatures you control. (Count each ability only once.)
diff --git a/forge-gui/res/cardsfolder/upcoming/olivias_attendants.txt b/forge-gui/res/cardsfolder/upcoming/olivias_attendants.txt
new file mode 100644
index 00000000000..93986c069fc
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/olivias_attendants.txt
@@ -0,0 +1,11 @@
+Name:Olivia's Attendants
+ManaCost:4 R R
+Types:Creature Vampire
+PT:6/6
+K:Menace
+T:Mode$ DamageDone | ValidSource$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever CARDNAME deals damage, create that many Blood tokens. (They're artifacts with "{1}, {T}, Discard a card, Sacrifice this artifact: Draw a card.")
+SVar:TrigToken:DB$ Token | TokenAmount$ X | TokenScript$ c_a_blood_draw
+SVar:X:TriggerCount$DamageAmount
+A:AB$ DealDamage | Cost$ 2 R | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to any target.
+DeckHas:Ability$Token & Ability$Sacrifice & Type$Blood
+Oracle:Menace\nWhenever Olivia's Attendants deals damage, create that many Blood tokens. (They're artifacts with "{1}, {T}, Discard a card, Sacrifice this artifact: Draw a card.")\n{2}{R}: Olivia's Attendants deals 1 damage to any target.
diff --git a/forge-gui/res/cardsfolder/upcoming/olivias_wrath.txt b/forge-gui/res/cardsfolder/upcoming/olivias_wrath.txt
new file mode 100644
index 00000000000..23f187d813a
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/olivias_wrath.txt
@@ -0,0 +1,7 @@
+Name:Olivia's Wrath
+ManaCost:4 B
+Types:Sorcery
+A:SP$ PumpAll | Cost$ 4 B | ValidCards$ Creature.nonVampire | NumAtt$ -X | NumDef$ -X | IsCurse$ True | SpellDescription$ Each non-Vampire creature gets -X/-X until end of turn, where X is the number of Vampires you control.
+SVar:X:Count$Valid Vampire.YouCtrl
+DeckHints:Type$Vampire
+Oracle:Each non-Vampire creature gets -X/-X until end of turn, where X is the number of Vampires you control.
diff --git a/forge-gui/res/cardsfolder/upcoming/overcharged_amalgam.txt b/forge-gui/res/cardsfolder/upcoming/overcharged_amalgam.txt
index fb5d7bdca93..aedb9b1edd8 100644
--- a/forge-gui/res/cardsfolder/upcoming/overcharged_amalgam.txt
+++ b/forge-gui/res/cardsfolder/upcoming/overcharged_amalgam.txt
@@ -1,7 +1,7 @@
Name:Overcharged Amalgam
ManaCost:2 U U
Types:Creature Zombie Horror
-PT:2/2
+PT:3/3
K:Flash
K:Flying
K:Exploit
diff --git a/forge-gui/res/cardsfolder/upcoming/panicked_bystander_cackling_culprit.txt b/forge-gui/res/cardsfolder/upcoming/panicked_bystander_cackling_culprit.txt
new file mode 100644
index 00000000000..9ce02c57aca
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/panicked_bystander_cackling_culprit.txt
@@ -0,0 +1,25 @@
+Name:Panicked Bystander
+ManaCost:1 W
+Types:Creature Human Peasant
+PT:2/2
+T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self,Creature.Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigGainLife1 | TriggerDescription$ Whenever CARDNAME or another creature you control dies, you gain 1 life.
+SVar:TrigGainLife1:DB$ GainLife | Defined$ You | LifeAmount$ 1
+T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | CheckSVar$ YouLifeGained | SVarCompare$ GE3 | Execute$ TrigTransform | TriggerDescription$ At the beginning of your end step, if you gained 3 or more life this turn, transform CARDNAME.
+SVar:TrigTransform:DB$ SetState | Defined$ Self | Mode$ Transform
+SVar:YouLifeGained:Count$LifeYouGainedThisTurn
+DeckHas:Ability$LifeGain
+AlternateMode:DoubleFaced
+Oracle:Whenever Panicked Bystander or another creature you control dies, you gain 1 life.\nAt the beginning of your end step, if you gained 3 or more life this turn, transform Panicked Bystander.
+
+ALTERNATE
+
+Name:Cackling Culprit
+ManaCost:no cost
+Colors:black
+Types:Creature Human Rogue
+PT:3/5
+T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self,Creature.Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigGainLife2 | TriggerDescription$ Whenever CARDNAME or another creature you control dies, you gain 1 life.
+SVar:TrigGainLife2:DB$ GainLife | Defined$ You | LifeAmount$ 1
+A:AB$ Pump | Cost$ 1 B | Defined$ Self | KW$ Deathtouch | SpellDescription$ CARDNAME gains deathtouch until end of turn.
+DeckHas:Ability$LifeGain
+Oracle:Whenever Cackling Culprit or another creature you control dies, you gain 1 life.\n{1}{B}: Cackling Culprit gains deathtouch until end of turn.
diff --git a/forge-gui/res/cardsfolder/upcoming/parish_blade_trainee.txt b/forge-gui/res/cardsfolder/upcoming/parish_blade_trainee.txt
new file mode 100644
index 00000000000..73a58da5dce
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/parish_blade_trainee.txt
@@ -0,0 +1,10 @@
+Name:Parish-Blade Trainee
+ManaCost:1 W
+Types:Creature Human Soldier
+PT:1/2
+K:Training
+T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigPutCounter | TriggerDescription$ When CARDNAME dies, put its counters on target creature you control.
+SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | CounterType$ EachFromSource | EachFromSource$ TriggeredCardLKICopy
+DeckHas:Ability$Counters
+SVar:SacMe:2
+Oracle:Training\nWhen Parish-Blade Trainee dies, put its counters on target creature you control.
diff --git a/forge-gui/res/cardsfolder/upcoming/persistent_specimen.txt b/forge-gui/res/cardsfolder/upcoming/persistent_specimen.txt
new file mode 100644
index 00000000000..1ac2ac8890e
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/persistent_specimen.txt
@@ -0,0 +1,9 @@
+Name:Persistent Specimen
+ManaCost:B
+Types:Creature Skeleton
+PT:1/1
+A:AB$ ChangeZone | Cost$ 2 B | Origin$ Graveyard | Destination$ Battlefield | ActivationZone$ Graveyard | Tapped$ True | SpellDescription$ Return CARDNAME from your graveyard to the battlefield tapped.
+SVar:SacMe:2
+SVar:DiscardMe:2
+DeckHas:Ability$Graveyard
+Oracle:{2}{B}: Return Persistent Specimen from your graveyard to the battlefield tapped.
diff --git a/forge-gui/res/cardsfolder/upcoming/piercing_light.txt b/forge-gui/res/cardsfolder/upcoming/piercing_light.txt
new file mode 100644
index 00000000000..fd3cc51f5f5
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/piercing_light.txt
@@ -0,0 +1,6 @@
+Name:Piercing Light
+ManaCost:W
+Types:Instant
+A:SP$ DealDamage | Cost$ W | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ Select target attacking or blocking creature | NumDmg$ 2 | SubAbility$ DBScry | SpellDescription$ CARDNAME deals 2 damage to target attacking or blocking creature. Scry 1.
+SVar:DBScry:DB$ Scry | ScryNum$ 1
+Oracle:Piercing Light deals 2 damage to target attacking or blocking creature. Scry 1.
diff --git a/forge-gui/res/cardsfolder/upcoming/pointed_discussion.txt b/forge-gui/res/cardsfolder/upcoming/pointed_discussion.txt
new file mode 100644
index 00000000000..c9a10354bea
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/pointed_discussion.txt
@@ -0,0 +1,8 @@
+Name:Pointed Discussion
+ManaCost:2 B
+Types:Sorcery
+A:SP$ Draw | Cost$ 2 B | NumCards$ 2 | SubAbility$ DBLoseLife | StackDescription$ SpellDescription | SpellDescription$ You draw two cards, lose 2 life
+SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ 2 | SubAbility$ DBToken | StackDescription$ None
+SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_blood_draw | TokenOwner$ You | SpellDescription$ then create a Blood token. (It's an artifact with "{1}, {T}, Discard a card, Sacrifice this artifact: Draw a card.")
+DeckHas:Ability$Token & Ability$Sacrifice & Type$Blood
+Oracle:You draw two cards, lose 2 life, then create a Blood token. (It's an artifact with "{1}, {T}, Discard a card, Sacrifice this artifact: Draw a card.")
diff --git a/forge-gui/res/cardsfolder/upcoming/predators_hour.txt b/forge-gui/res/cardsfolder/upcoming/predators_hour.txt
new file mode 100644
index 00000000000..3f7afe86599
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/predators_hour.txt
@@ -0,0 +1,10 @@
+Name:Predators' Hour
+ManaCost:1 B
+Types:Sorcery
+A:SP$ AnimateAll | ValidCards$ Creature.YouCtrl | Keywords$ Menace | Triggers$ DamageTrig | StackDescription$ SpellDescription | SpellDescription$ Until end of turn, creatures you control gain menace and "Whenever this creature deals combat damage to a player, exile the top card of that player's library face down. You may look at and play that card for as long as it remains exiled, and you may spend mana as though it were mana of any color to cast that spell."
+SVar:DamageTrig:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigDig | TriggerZones$ Battlefield | TriggerDescription$ Whenever this creature deals combat damage to a player, exile the top card of that player's library face down. You may look at and play that card for as long as it remains exiled, and you may spend mana as though it were mana of any color to cast that spell.
+SVar:TrigDig:DB$ Dig | DigNum$ 1 | Defined$ TriggeredTarget | DestinationZone$ Exile | ExileFaceDown$ True | RememberChanged$ True | ChangeNum$ All | SubAbility$ DBEffect
+SVar:DBEffect:DB$ Effect | RememberObjects$ Remembered | StaticAbilities$ STLookPlay | Duration$ Permanent | ForgetOnMoved$ Exile | SubAbility$ DBCleanup
+SVar:STLookPlay:Mode$ Continuous | MayLookAt$ You | MayPlay$ True | MayPlayIgnoreType$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ You may look at and play that card for as long as it remains exiled, and you may spend mana as though it were mana of any color to cast that spell.
+SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
+Oracle:Until end of turn, creatures you control gain menace and "Whenever this creature deals combat damage to a player, exile the top card of that player's library face down. You may look at and play that card for as long as it remains exiled, and you may spend mana as though it were mana of any color to cast that spell."
diff --git a/forge-gui/res/cardsfolder/upcoming/priest_of_the_blessed_graf.txt b/forge-gui/res/cardsfolder/upcoming/priest_of_the_blessed_graf.txt
new file mode 100644
index 00000000000..cd5caae2f7f
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/priest_of_the_blessed_graf.txt
@@ -0,0 +1,9 @@
+Name:Priest of the Blessed Graf
+ManaCost:2 W
+Types:Creature Human Cleric
+PT:1/2
+T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ DBToken | TriggerDescription$ At the beginning of your end step, create X 1/1 white Spirit creature tokens with flying, where X is the number of opponents who control more lands than you.
+SVar:DBToken:DB$ Token | TokenAmount$ X | TokenScript$ w_1_1_spirit_flying | TokenOwner$ You
+SVar:X:PlayerCountOpponents$HasPropertywithMoreLandsThanYou
+DeckHas:Ability$Token & Type$Spirit
+Oracle:At the beginning of your end step, create X 1/1 white Spirit creature tokens with flying, where X is the number of opponents who control more lands than you.
diff --git a/forge-gui/res/cardsfolder/upcoming/pyre_spawn.txt b/forge-gui/res/cardsfolder/upcoming/pyre_spawn.txt
new file mode 100644
index 00000000000..2d2618dc487
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/pyre_spawn.txt
@@ -0,0 +1,7 @@
+Name:Pyre Spawn
+ManaCost:4 R R
+Types:Creature Elemental
+PT:6/4
+T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, it deals 3 damage to any target.
+SVar:TrigDealDamage:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 3
+Oracle:When Pyre Spawn dies, it deals 3 damage to any target.
diff --git a/forge-gui/res/cardsfolder/upcoming/ragged_recluse_odious_witch.txt b/forge-gui/res/cardsfolder/upcoming/ragged_recluse_odious_witch.txt
new file mode 100644
index 00000000000..4375d60a500
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/ragged_recluse_odious_witch.txt
@@ -0,0 +1,24 @@
+Name:Ragged Recluse
+ManaCost:1 B
+Types:Creature Human Peasant
+PT:2/1
+T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | CheckSVar$ CardsDiscarded | SVarCompare$ GE1 | Execute$ TrigTransform | TriggerDescription$ At the beginning of your end step, if you discarded a card this turn, transform CARDNAME.
+SVar:TrigTransform:DB$ SetState | Defined$ Self | Mode$ Transform
+SVar:CardsDiscarded:PlayerCountPropertyYou$CardsDiscardedThisTurn
+DeckHints:Ability$Discard
+AlternateMode:DoubleFaced
+Oracle:At the beginning of your end step, if you discarded a card this turn, transform Ragged Recluse.
+
+ALTERNATE
+
+Name:Odious Witch
+ManaCost:no cost
+Colors:black
+Types:Creature Human Warlock
+PT:3/3
+T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigLoseLife | TriggerDescription$ Whenever CARDNAME attacks, defending player loses 1 life and you gain 1 life.
+SVar:TrigLoseLife:DB$ LoseLife | Defined$ TriggeredDefendingPlayer | LifeAmount$ 1 | SubAbility$ DBGainLife
+SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1
+SVar:HasAttackEffect:TRUE
+DeckHas:Ability$LifeGain
+Oracle:Whenever Odious Witch attacks, defending player loses 1 life and you gain 1 life.
diff --git a/forge-gui/res/cardsfolder/upcoming/reclusive_taxidermist.txt b/forge-gui/res/cardsfolder/upcoming/reclusive_taxidermist.txt
index 4d55a7c4807..243f02a179a 100644
--- a/forge-gui/res/cardsfolder/upcoming/reclusive_taxidermist.txt
+++ b/forge-gui/res/cardsfolder/upcoming/reclusive_taxidermist.txt
@@ -2,7 +2,7 @@ Name:Reclusive Taxidermist
ManaCost:1 G
Types:Creature Human Druid
PT:1/2
-S:Mode$ Continuous | Affected$ Card.Self | AddPower$ 3 | AddToughness$ 2 | IsPresent$ Creature | PresentCompare$ GE4 | PresentZone$ Graveyard | Description$ CARDNAME gets +3/+2 as long as there are four or more creature cards in your graveyard.
+S:Mode$ Continuous | Affected$ Card.Self | AddPower$ 3 | AddToughness$ 2 | IsPresent$ Creature.YouOwn | PresentCompare$ GE4 | PresentZone$ Graveyard | Description$ CARDNAME gets +3/+2 as long as there are four or more creature cards in your graveyard.
A:AB$ Mana | Cost$ T | Produced$ Any | SpellDescription$ Add one mana of any color.
DeckHints:Ability$Graveyard & Ability$Discard
Oracle:Reclusive Taxidermist gets +3/+2 as long as there are four or more creature cards in your graveyard.\n{T}: Add one mana of any color.
diff --git a/forge-gui/res/cardsfolder/upcoming/repository_skaab.txt b/forge-gui/res/cardsfolder/upcoming/repository_skaab.txt
new file mode 100644
index 00000000000..1ab82839b17
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/repository_skaab.txt
@@ -0,0 +1,14 @@
+Name:Repository Skaab
+ManaCost:3 U
+Types:Creature Zombie
+PT:3/3
+K:Exploit
+T:Mode$ Exploited | ValidCard$ Creature | ValidSource$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME exploits a creature, return target target instant or sorcery card from your graveyard to your hand.
+SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Select target instant or sorcery card in your graveyard | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl
+DeckHas:Ability$Sacrifice & Ability$Graveyard
+DeckHints:Type$Instant|Sorcery
+SVar:X:Count$ValidGraveyard Instant.YouOwn,Sorcery.YouOwn/LimitMax.1
+SVar:Y:Count$Valid Creature.token,Creature.cmcLE2/LimitMax.1
+SVar:Z:SVar$X/Plus.Y
+SVar:NeedsToPlayVar:Z EQ2
+Oracle:Exploit (When this creature enters the battlefield, you may sacrifice a creature.)\nWhen Repository Skaab exploits a creature, return target target instant or sorcery card from your graveyard to your hand.
diff --git a/forge-gui/res/cardsfolder/upcoming/restless_bloodseeker_bloodsoaked_reveler.txt b/forge-gui/res/cardsfolder/upcoming/restless_bloodseeker_bloodsoaked_reveler.txt
new file mode 100644
index 00000000000..9704d0d76f1
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/restless_bloodseeker_bloodsoaked_reveler.txt
@@ -0,0 +1,27 @@
+Name:Restless Bloodseeker
+ManaCost:1 B
+Types:Creature Vampire
+PT:1/3
+T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | CheckSVar$ X | SVarCompare$ GE1 | Execute$ DBToken | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your end step, if you gained life this turn, create a Blood token.
+SVar:X:Count$LifeYouGainedThisTurn
+SVar:DBToken:DB$ Token | TokenScript$ c_a_blood_draw
+A:AB$ SetState | Cost$ Sac<2/Blood.token/Blood token> | Defined$ Self | SorcerySpeed$ True | Mode$ Transform | SpellDescription$ Transform CARDNAME. Activate only as a sorcery.
+DeckHas:Ability$Token & Ability$Sacrifice & Type$Blood
+DeckNeeds:Ability$LifeGain
+AlternateMode:DoubleFaced
+Oracle:At the beginning of your end step, if you gained life this turn, create a Blood token. (It's an artifact with "{1}, {T}, Discard a card, Sacrifice this artifact: Draw a card.")\nSacrifice two Blood tokens: Transform Restless Bloodseeker. Activate only as a sorcery.
+
+ALTERNATE
+
+Name:Bloodsoaked Reveler
+ManaCost:no cost
+Colors:black
+Types:Creature Vampire
+PT:3/3
+T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | CheckSVar$ X | Execute$ DBToken | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your end step, if you gained life this turn, create a Blood token.
+SVar:X:Count$LifeYouGainedThisTurn
+SVar:DBToken:DB$ Token | TokenScript$ c_a_blood_draw
+A:AB$ LoseLife | Cost$ 4 B | Defined$ Player.Opponent | LifeAmount$ 2 | SubAbility$ DBGainLife | SpellDescription$ Each opponent loses 2 life and you gain 2 life.
+SVar:DBGainLife:DB$ GainLife | LifeAmount$ 2
+DeckHas:Ability$LifeGain & Ability$Token & Ability$Sacrifice & Type$Blood
+Oracle:At the beginning of your end step, if you gained life this turn, create a Blood token. (It's an artifact with "{1}, {T}, Discard a card, Sacrifice this artifact: Draw a card.")\nSacrifice two Blood tokens: Transform Restless Bloodseeker. Activate only as a sorcery.\n{4}{B}: Each opponent loses 2 life and you gain 2 life.
diff --git a/forge-gui/res/cardsfolder/upcoming/rhoda_geist_avenger.txt b/forge-gui/res/cardsfolder/upcoming/rhoda_geist_avenger.txt
new file mode 100644
index 00000000000..8e3b33456ea
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/rhoda_geist_avenger.txt
@@ -0,0 +1,11 @@
+Name:Rhoda, Geist Avenger
+ManaCost:3 W
+Types:Legendary Creature Human Soldier
+PT:3/3
+K:Partner:Timin, Youthful Geist
+K:Vigilance
+T:Mode$ Taps | ValidCard$ Creature.OppCtrl | Attacker$ False | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever a creature an opponent controls becomes tapped, if it isn't being declared as an attacker, put a +1/+1 counter on CARDNAME.
+SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1
+DeckHints:Name$Timin, Youthful Geist
+DeckHas:Ability$Counters
+Oracle:Partner with Timin, Youthful Geist (When this creature enters the battlefield, target player may put Timin, Youthful Geist into their hand from their library, then shuffle.)\nVigilance\nWhenever a creature an opponent controls becomes tapped, if it isn't being declared as an attacker, put a +1/+1 counter on Rhoda, Geist Avenger.
diff --git a/forge-gui/res/cardsfolder/upcoming/rural_recruit.txt b/forge-gui/res/cardsfolder/upcoming/rural_recruit.txt
new file mode 100644
index 00000000000..f8949e3dd3c
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/rural_recruit.txt
@@ -0,0 +1,9 @@
+Name:Rural Recruit
+ManaCost:3 G
+Types:Creature Human Peasant
+PT:1/1
+K:Training
+T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a 3/1 green Boar creature token.
+SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ g_3_1_boar | TokenOwner$ You
+DeckHas:Ability$Token & Ability$Counters
+Oracle:Training\nWhen Rural Recruit enters the battlefield, create a 3/1 green Boar creature token.
diff --git a/forge-gui/res/cardsfolder/upcoming/sanguine_statuette.txt b/forge-gui/res/cardsfolder/upcoming/sanguine_statuette.txt
new file mode 100644
index 00000000000..582573c2217
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/sanguine_statuette.txt
@@ -0,0 +1,9 @@
+Name:Sanguine Statuette
+ManaCost:1 R
+Types:Artifact
+T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a Blood token. (It's an artifact with "{1}, {T}, Discard a card, Sacrifice this artifact: Draw a card.")
+SVar:TrigToken:DB$ Token | TokenScript$ c_a_blood_draw
+T:Mode$ Sacrificed | ValidCard$ Blood.token+YouCtrl | Execute$ TrigAnimate | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ Whenever you sacrifice a Blood token, you may have CARDNAME become a 3/3 Vampire artifact creature with haste until end of turn.
+SVar:TrigAnimate:DB$ Animate | Defined$ Self | Power$ 3 | Toughness$ 3 | Types$ Vampire,Artifact,Creature | Keywords$ Haste
+DeckHas:Ability$Token & Ability$Sacrifice & Type$Blood|Vampire
+Oracle:When Sanguine Statuette enters the battlefield, create a Blood token. (It's an artifact with "{1}, {T}, Discard a card, Sacrifice this artifact: Draw a card.")\nWhenever you sacrifice a Blood token, you may have Sanguine Statuette become a 3/3 Vampire artifact creature with haste until end of turn.
diff --git a/forge-gui/res/cardsfolder/upcoming/scion_of_opulence.txt b/forge-gui/res/cardsfolder/upcoming/scion_of_opulence.txt
new file mode 100644
index 00000000000..40c9e54affb
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/scion_of_opulence.txt
@@ -0,0 +1,13 @@
+Name:Scion of Opulence
+ManaCost:2 R
+Types:Creature Vampire Noble
+PT:3/1
+T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self,Vampire.Other+nonToken+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever CARDNAME or another nontoken Vampire you control dies, create a Treasure token.
+SVar:TrigToken:DB$ Token | TokenScript$ c_a_treasure_sac
+A:AB$ Dig | Cost$ R Sac<2/Artifact> | DigNum$ 1 | ChangeNum$ All | DestinationZone$ Exile | Defined$ You | RememberChanged$ True | SubAbility$ DBEffect | SpellDescription$ Exile the top card of your library. You may play that card this turn.
+SVar:DBEffect:DB$ Effect | StaticAbilities$ EffSModeContinuous | ExileOnMoved$ Exile | RememberObjects$ Remembered | SubAbility$ DBCleanup
+SVar:EffSModeContinuous:Mode$ Continuous | EffectZone$ Command | Affected$ Card.IsRemembered | MayPlay$ True | AffectedZone$ Exile | Description$ You may play that card this turn.
+SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
+SVar:AIPreference:SacCost$Artifact.token
+DeckHas:Ability$Token & Ability$Sacrifice
+Oracle:Whenever Scion of Opulence or another nontoken Vampire you control dies, create a Treasure token. (It's an artifact with "{T}, Sacrifice this artifact: Add one mana of any color.")\n{R}, Sacrifice two artifacts: Exile the top card of your library. You may play that card this turn.
diff --git a/forge-gui/res/cardsfolder/upcoming/selhoff_entomber.txt b/forge-gui/res/cardsfolder/upcoming/selhoff_entomber.txt
new file mode 100644
index 00000000000..58d7c21afcd
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/selhoff_entomber.txt
@@ -0,0 +1,7 @@
+Name:Selhoff Entomber
+ManaCost:1 U
+Types:Creature Zombie
+PT:1/3
+A:AB$ Draw | Cost$ T Discard<1/Creature/creature> | NumCards$ 1 | SpellDescription$ Draw a card.
+DeckHas:Ability$Discard
+Oracle:{T}, Discard a creature card: Draw a card.
diff --git a/forge-gui/res/cardsfolder/upcoming/serpentine_ambush.txt b/forge-gui/res/cardsfolder/upcoming/serpentine_ambush.txt
new file mode 100644
index 00000000000..317fff70c1e
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/serpentine_ambush.txt
@@ -0,0 +1,6 @@
+Name:Serpentine Ambush
+ManaCost:1 U
+Types:Instant
+A:SP$ Animate | ValidTgts$ Creature | TgtPrompt$ Select target creature | Colors$ Blue | OverwriteColors$ True | Types$ Serpent | RemoveCreatureTypes$ True | Power$ 5 | Toughness$ 5 | StackDescription$ Until end of turn, {c:Targeted} becomes a blue Serpent with base power and toughness 5/5. | SpellDescription$ Until end of turn, target creature becomes a blue Serpent with base power and toughness 5/5.
+DeckHas:Type$Serpent
+Oracle:Until end of turn, target creature becomes a blue Serpent with base power and toughness 5/5.
diff --git a/forge-gui/res/cardsfolder/upcoming/shadowgrange_archfiend.txt b/forge-gui/res/cardsfolder/upcoming/shadowgrange_archfiend.txt
new file mode 100644
index 00000000000..0ca8639c2f7
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/shadowgrange_archfiend.txt
@@ -0,0 +1,13 @@
+Name:Shadowgrange Archfiend
+ManaCost:6 B
+Types:Creature Demon
+PT:8/4
+T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigRepeat | TriggerDescription$ When CARDNAME enters the battlefield, each opponent sacrifices a creature with the greatest power among creatures they control. You gain life equal to the greatest power among creatures sacrificed this way.
+SVar:TrigRepeat:DB$ RepeatEach | RepeatPlayers$ Player.Opponent | RepeatSubAbility$ DBChooseCard | SubAbility$ DBSac
+SVar:DBChooseCard:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.greatestPowerControlledByRemembered | ChoiceTitle$ Choose a creature you control with the greatest power | Mandatory$ True | ImprintChosen$ True | AILogic$ WorstCard
+SVar:DBSac:DB$ SacrificeAll | ValidCards$ Card.IsImprinted | RememberSacrificed$ True | SubAbility$ DBLifeGain
+SVar:DBLifeGain:DB$ GainLife | Defined$ You | LifeAmount$ X | SubAbility$ DBCleanup
+SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True | ClearChosenCard$ True
+SVar:X:RememberedLKI$GreatestPower
+K:Madness:2 B PayLife<8>
+Oracle:When Shadowgrange Archfiend enters the battlefield, each opponent sacrifices a creature with the greatest power among creatures they control. You gain life equal to the greatest power among creatures sacrificed this way.\nMadness—{2}{B}, Pay 8 life. (If you discard this card, discard it into exile. When you do, cast it for its madness cost or put it into your graveyard.)
diff --git a/forge-gui/res/cardsfolder/upcoming/sheltering_boughs.txt b/forge-gui/res/cardsfolder/upcoming/sheltering_boughs.txt
new file mode 100644
index 00000000000..c1779c132c7
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/sheltering_boughs.txt
@@ -0,0 +1,9 @@
+Name:Sheltering Boughs
+ManaCost:2 G
+Types:Enchantment Aura
+K:Enchant creature
+A:SP$ Attach | Cost$ 2 G | ValidTgts$ Creature | AILogic$ Pump
+S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 1 | AddToughness$ 3 | Description$ Enchanted creature gets +1/+3.
+T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card.
+SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1
+Oracle:Enchant creature\nWhen Sheltering Boughs enters the battlefield, draw a card.\nEnchanted creature gets +1/+3.
diff --git a/forge-gui/res/cardsfolder/upcoming/sinister_waltz.txt b/forge-gui/res/cardsfolder/upcoming/sinister_waltz.txt
new file mode 100644
index 00000000000..082410a3521
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/sinister_waltz.txt
@@ -0,0 +1,7 @@
+Name:Sinister Waltz
+ManaCost:3 B R
+Types:Sorcery
+A:SP$ Pump | TargetMin$ 3 | TargetMax$ 3 | ValidTgts$ Creature.YouOwn | TgtPrompt$ Select three target creature cards in your graveyard | TgtZone$ Graveyard | RememberObjects$ Targeted | SubAbility$ ReturnTwo | StackDescription$ {p:You} chooses {c:Targeted}, | SpellDescription$ Choose three target creature cards in your graveyard. Return two of them at random to the battlefield and put the other on the bottom of your library.
+SVar:ReturnTwo:DB$ ChangeZone | ChangeType$ Card.IsRemembered | ChangeNum$ 2 | Origin$ Graveyard | Destination$ Battlefield | AtRandom$ True | Hidden$ True | ForgetChanged$ True | SubAbility$ Wallflower | StackDescription$ returns two of them at random to the battlefield
+SVar:Wallflower:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered | Origin$ Graveyard | Destination$ Library | LibraryPosition$ -1 | ForgetChanged$ True | StackDescription$ and puts the other on the bottom of their library.
+Oracle:Choose three target creature cards in your graveyard. Return two of them at random to the battlefield and put the other on the bottom of your library.
diff --git a/forge-gui/res/cardsfolder/upcoming/skywarp_skaab.txt b/forge-gui/res/cardsfolder/upcoming/skywarp_skaab.txt
new file mode 100644
index 00000000000..940a2e45a54
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/skywarp_skaab.txt
@@ -0,0 +1,10 @@
+Name:Skywarp Skaab
+ManaCost:3 U U
+Types:Creature Zombie Drake
+PT:2/5
+K:Flying
+T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ DBDraw | TriggerDescription$ When CARDNAME enters the battlefield, you may exile two creature cards from your graveyard. If you do, draw a card.
+SVar:DBDraw:AB$ Draw | Cost$ ExileFromGrave<2/Creature/creature card> | Defined$ You | NumCards$ 1 | SpellDescription$ Draw a card.
+DeckHas:Ability$Graveyard
+SVar:AIPreference:ExileFromGraveCost$Creature.cmcLE1+inZoneGraveyard+withoutDisturb
+Oracle:Flying\nWhen Skywarp Skaab enters the battlefield, you may exile two creature cards from your graveyard. If you do, draw a card.
diff --git a/forge-gui/res/cardsfolder/upcoming/soulcipher_board_cipherbound_spirit.txt b/forge-gui/res/cardsfolder/upcoming/soulcipher_board_cipherbound_spirit.txt
new file mode 100644
index 00000000000..4c178e0f118
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/soulcipher_board_cipherbound_spirit.txt
@@ -0,0 +1,25 @@
+Name:Soulcipher Board
+ManaCost:1 U
+Types:Artifact
+K:etbCounter:OMEN:3
+A:AB$ Dig | Cost$ 1 U T | DigNum$ 2 | DestinationZone$ Graveyard | LibraryPosition2$ 0 | StackDescription$ {p:You} looks at the top two cards of their library, and puts one of them into their graveyard. | SpellDescription$ Look at the top two cards of your library. Put one of them into your graveyard.
+T:Mode$ ChangesZone | Origin$ Any | Destination$ Graveyard | ValidCard$ Card.Creature+nonToken+YouOwn | TriggerZones$ Battlefield | Execute$ TrigRemoveCounter | TriggerDescription$ Whenever a creature card is put into your graveyard from anywhere, remove an omen counter from CARDNAME. Then if it has no omen counters on it, transform it.
+SVar:TrigRemoveCounter:DB$ RemoveCounter | Defined$ Self | CounterType$ OMEN | CounterNum$ 1 | SubAbility$ DBTransform
+SVar:DBTransform:DB$ SetState | ConditionPresent$ Card.Self+counters_EQ0_OMEN | Defined$ Self | Mode$ Transform
+AlternateMode:DoubleFaced
+DeckHas:Ability$Counters & Ability$Graveyard
+Oracle:Soulcipher Board enters the battlefield with three omen counters on it.\n{1}{U}, {T}: Look at the top two cards of your library. Put one of them into your graveyard.\nWhenever a creature card is put into your graveyard from anywhere, remove an omen counter from Soulcipher Board. Then if it has no omen counters on it, transform it.
+
+ALTERNATE
+
+Name:Cipherbound Spirit
+ManaCost:no cost
+Colors:blue
+Types:Creature Spirit
+PT:3/2
+K:Flying
+S:Mode$ CantBlockBy | ValidAttacker$ Creature.withoutFlying | ValidBlocker$ Creature.Self | Description$ CARDNAME can block only creatures with flying.
+A:AB$ Draw | Cost$ 3 U | NumCards$ 2 | SubAbility$ DBDiscard | StackDescription$ {p:You} draws two cards, | SpellDescription$ Draw two cards, then discard a card.
+SVar:DBDiscard:DB$ Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose | StackDescription$ then discards a card.
+DeckHas:Ability$Discard
+Oracle:Flying\nCipherbound Spirit can block only creatures with flying.\n{3}{U}: Draw two cards, then discard a card.
diff --git a/forge-gui/res/cardsfolder/upcoming/spectral_arcanist.txt b/forge-gui/res/cardsfolder/upcoming/spectral_arcanist.txt
new file mode 100644
index 00000000000..4f21e008535
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/spectral_arcanist.txt
@@ -0,0 +1,10 @@
+Name:Spectral Arcanist
+ManaCost:3 U
+Types:Creature Spirit Wizard
+PT:3/2
+K:Flying
+T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, you may cast an instant or sorcery spell with mana value less than or equal to the number of Spirits you control from a graveyard without paying its mana cost. If that spell would be put into a graveyard, exile it instead.
+SVar:TrigChangeZone:DB$ Play | ValidZone$ Graveyard | Valid$ Card.YouOwn | ValidSA$ Instant.cmcLEX,Sorcery.cmcLEX | WithoutManaCost$ True | Optional$ True | ReplaceGraveyard$ Exile
+SVar:X:Count$Valid Spirit.YouCtrl
+DeckHints:Type$Spirit|Instant|Sorcery
+Oracle:Flying\nWhen Spectral Arcanist enters the battlefield, you may cast an instant or sorcery spell with mana value less than or equal to the number of Spirits you control from a graveyard without paying its mana cost. If that spell would be put into a graveyard, exile it instead.
diff --git a/forge-gui/res/cardsfolder/upcoming/spore_crawler.txt b/forge-gui/res/cardsfolder/upcoming/spore_crawler.txt
new file mode 100644
index 00000000000..3d41e097277
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/spore_crawler.txt
@@ -0,0 +1,8 @@
+Name:Spore Crawler
+ManaCost:2 G
+Types:Creature Fungus
+PT:3/2
+T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, draw a card.
+SVar:TrigDraw:DB$ Draw | NumCards$ 1 | Defined$ TriggeredCardController
+SVar:SacMe:1
+Oracle:When Spore Crawler dies, draw a card.
diff --git a/forge-gui/res/cardsfolder/upcoming/sporeback_wolf.txt b/forge-gui/res/cardsfolder/upcoming/sporeback_wolf.txt
new file mode 100644
index 00000000000..e009ce446d0
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/sporeback_wolf.txt
@@ -0,0 +1,6 @@
+Name:Sporeback Wolf
+ManaCost:1 G
+Types:Creature Wolf
+PT:2/2
+S:Mode$ Continuous | Affected$ Card.Self | AddPower$ 0 | AddToughness$ 2 | Condition$ PlayerTurn | Description$ As long as it's your turn, CARDNAME gets +0/+2.
+Oracle:As long as it's your turn, Sporeback Wolf gets +0/+2.
diff --git a/forge-gui/res/cardsfolder/upcoming/steelclad_spirit.txt b/forge-gui/res/cardsfolder/upcoming/steelclad_spirit.txt
new file mode 100755
index 00000000000..bbeb9f53bf4
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/steelclad_spirit.txt
@@ -0,0 +1,10 @@
+Name:Steelclad Spirit
+ManaCost:1 U
+Types:Creature Spirit
+PT:3/3
+K:Defender
+T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Enchantment.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever an enchantment enters the battlefield under your control, CARDNAME can attack this turn as though it didn't have defender.
+SVar:TrigPump:DB$ Pump | Defined$ Self | KW$ HIDDEN CARDNAME can attack as though it didn't have defender.
+SVar:BuffedBy:Enchantment
+DeckHints:Type$Enchantment
+Oracle:Defender\nWhenever an enchantment enters the battlefield under your control, Steelclad Spirit can attack this turn as though it didn't have defender.
diff --git a/forge-gui/res/cardsfolder/upcoming/stensia_uprising.txt b/forge-gui/res/cardsfolder/upcoming/stensia_uprising.txt
new file mode 100644
index 00000000000..424786baf8b
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/stensia_uprising.txt
@@ -0,0 +1,11 @@
+Name:Stensia Uprising
+ManaCost:2 R R
+Types:Enchantment
+T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ At the beginning of your end step, create a 1/1 red Human creature token. Then if you control exactly thirteen permanents, you may sacrifice Stensia Uprising. When you do, it deals 7 damage to any target.
+SVar:TrigToken:DB$ Token | TokenScript$ r_1_1_human | SubAbility$ DBSacrifice
+SVar:DBSacrifice:DB$ Sacrifice | ConditionPresent$ Permanent.YouCtrl | ConditionCompare$ EQ13 | SacValid$ Self | Optional$ True | RememberSacrificed$ True | SubAbility$ DBImmediateTrig
+SVar:DBImmediateTrig:DB$ ImmediateTrigger | ConditionDefined$ Remembered | ConditionPresent$ Card | Execute$ TrigDamage | SubAbility$ DBCleanup | TriggerDescription$ When you sacrifice CARDNAME, it deals 7 damage to any target.
+SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 7
+SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
+DeckHas:Ability$Token & Ability$Sacrifice
+Oracle:At the beginning of your end step, create a 1/1 red Human creature token. Then if you control exactly thirteen permanents, you may sacrifice Stensia Uprising. When you do, it deals 7 damage to any target.
diff --git a/forge-gui/res/cardsfolder/upcoming/stitched_assistant.txt b/forge-gui/res/cardsfolder/upcoming/stitched_assistant.txt
new file mode 100755
index 00000000000..61acf648a59
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/stitched_assistant.txt
@@ -0,0 +1,10 @@
+Name:Stitched Assistant
+ManaCost:2 U
+Types:Creature Zombie
+PT:3/2
+K:Exploit
+T:Mode$ Exploited | ValidCard$ Creature | ValidSource$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigScry | TriggerDescription$ When CARDNAME exploits a creature, scry 1, then draw a card. (To scry 1, look at the top card of your library, then you may put that card on the bottom of your library.)
+SVar:TrigScry:DB$ Scry | ScryNum$ 1 | SubAbility$ DBDraw
+SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1
+DeckHas:Ability$Sacrifice
+Oracle:Exploit (When this creature enters the battlefield, you may sacrifice a creature.)\nWhen Stitched Assistant exploits a creature, scry 1, then draw a card. (To scry 1, look at the top card of your library, then you may put that card on the bottom of your library.)
diff --git a/forge-gui/res/cardsfolder/upcoming/storm_of_souls.txt b/forge-gui/res/cardsfolder/upcoming/storm_of_souls.txt
new file mode 100644
index 00000000000..d02694a1409
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/storm_of_souls.txt
@@ -0,0 +1,11 @@
+Name:Storm of Souls
+ManaCost:4 W W
+Types:Sorcery
+A:SP$ ChangeZoneAll | ChangeType$ Creature.YouOwn | Origin$ Graveyard | Destination$ Battlefield | RememberChanged$ True | SubAbility$ DBAnimate | SpellDescription$ Return all creature cards from your graveyard to the battlefield.
+SVar:DBAnimate:DB$ Animate | Defined$ Remembered | Power$ 1 | Toughness$ 1 | Types$ Spirit | Duration$ Permanent | Keywords$ Flying | SubAbility$ DBCleanup | StackDescription$ SpellDescription | SpellDescription$ Each of them is a 1/1 Spirit with flying in addition to its other types.
+SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | SubAbility$ DBExile
+SVar:DBExile:DB$ ChangeZone | Origin$ Stack | Destination$ Exile | SpellDescription$ Exile CARDNAME.
+DeckHas:Ability$Graveyard & Type$Spirit
+SVar:X:Count$TypeInYourYard.Creature
+SVar:NeedsToPlayVar:X GE4
+Oracle:Return all creature cards from your graveyard to the battlefield. Each of them is a 1/1 Spirit with flying in addition to its other types. Exile Storm of Souls.
diff --git a/forge-gui/res/cardsfolder/upcoming/sudden_salvation.txt b/forge-gui/res/cardsfolder/upcoming/sudden_salvation.txt
new file mode 100644
index 00000000000..6022170f0c2
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/sudden_salvation.txt
@@ -0,0 +1,9 @@
+Name:Sudden Salvation
+ManaCost:2 W W
+Types:Instant
+A:SP$ ChangeZone | ValidTgts$ Permanent.ThisTurnEnteredFrom_Battlefield | TgtPrompt$ Select up to three target permanent cards in graveyards that were put there from the battlefield this turn | TargetMin$ 0 | TargetMax$ 3 | Origin$ Graveyard | Destination$ Battlefield | Tapped$ True | SubAbility$ DBDraw | SpellDescription$ Choose up to three target permanent cards in graveyards that were put there from the battlefield this turn. Return them to the battlefield tapped under their owners' control. You draw a card for each opponent who controls one or more of those permanents.
+SVar:DBDraw:DB$ Draw | NumCards$ X | Defined$ You | SubAbility$ DBCleanup
+SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
+SVar:X:PlayerCountOpponents$HasPropertycontrolsPermanent.IsRemembered
+DeckHas:Ability$Graveyard
+Oracle:Choose up to three target permanent cards in graveyards that were put there from the battlefield this turn. Return them to the battlefield tapped under their owners' control. You draw a card for each opponent who controls one or more of those permanents.
diff --git a/forge-gui/res/cardsfolder/upcoming/supernatural_rescue.txt b/forge-gui/res/cardsfolder/upcoming/supernatural_rescue.txt
new file mode 100644
index 00000000000..8d0ce8843f1
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/supernatural_rescue.txt
@@ -0,0 +1,10 @@
+Name:Supernatural Rescue
+ManaCost:3 W
+Types:Enchantment Aura
+K:Enchant creature
+S:Mode$ Continuous | CharacteristicDefining$ True | AddKeyword$ Flash | IsPresent$ Spirit.YouCtrl | Description$ This spell has flash as long as you control a Spirit.
+T:Mode$ SpellCast | ValidCard$ Card.Self | Execute$ TrigTap | TriggerDescription$ When you cast this spell, tap up to two target creatures you don't control.
+SVar:TrigTap:DB$ Tap | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Select up to two target creatures you don't control | ValidTgts$ Creature.YouDontCtrl
+A:SP$ Attach | ValidTgts$ Creature | AILogic$ Pump
+S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 1 | AddToughness$ 2 | Description$ Enchanted creature gets +1/+2.
+Oracle:This spell has flash as long as you control a Spirit.\nWhen you cast this spell, tap up to two target creatures you don't control.\nEnchant creature\nEnchanted creature gets +1/+2.
diff --git a/forge-gui/res/cardsfolder/upcoming/syphon_essence.txt b/forge-gui/res/cardsfolder/upcoming/syphon_essence.txt
new file mode 100755
index 00000000000..20f5278532a
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/syphon_essence.txt
@@ -0,0 +1,7 @@
+Name:Syphon Essence
+ManaCost:2 U
+Types:Instant
+A:SP$ Counter | TargetType$ Spell | TgtPrompt$ Select target creature or planeswalker spell | ValidTgts$ Creature,Planeswalker | SubAbility$ DBToken | SpellDescription$ Counter target creature or planeswalker spell.
+SVar:DBToken:DB$ Token | TokenScript$ c_a_blood_draw | SpellDescription$ Create a Blood token. (It's an artifact with "{1}, {T}, Discard a card, Sacrifice this artifact: Draw a card.")
+DeckHas:Ability$Token & Ability$Sacrifice & Type$Blood
+Oracle:Counter target creature or planeswalker spell. Create a Blood token. (It's an artifact with "{1}, {T}, Discard a card, Sacrifice this artifact: Draw a card.")
diff --git a/forge-gui/res/cardsfolder/upcoming/thirst_for_discovery.txt b/forge-gui/res/cardsfolder/upcoming/thirst_for_discovery.txt
new file mode 100644
index 00000000000..fea1b0a56b2
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/thirst_for_discovery.txt
@@ -0,0 +1,6 @@
+Name:Thirst for Discovery
+ManaCost:2 U
+Types:Instant
+A:SP$ Draw | NumCards$ 3 | SubAbility$ DBDiscard | SpellDescription$ Draw three cards.
+SVar:DBDiscard:DB$ Discard | Defined$ You | NumCards$ 2 | Mode$ TgtChoose | UnlessType$ Basic Land | StackDescription$ SpellDescription | SpellDescription$ Then discard two cards unless you discard a basic land card.
+Oracle:Draw three cards. Then discard two cards unless you discard a basic land card.
diff --git a/forge-gui/res/cardsfolder/upcoming/thundering_mightmare.txt b/forge-gui/res/cardsfolder/upcoming/thundering_mightmare.txt
new file mode 100644
index 00000000000..c176f58ccc5
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/thundering_mightmare.txt
@@ -0,0 +1,11 @@
+Name:Thundering Mightmare
+ManaCost:4 G
+Types:Creature Horse Spirit
+PT:3/3
+K:Soulbond
+S:Mode$ Continuous | Affected$ Creature.PairedWith,Creature.Self+Paired | AddTrigger$ CastTrigger | Description$ As long as CARDNAME is paired with another creature, each of those creatures has "Whenever an opponent casts a spell, put a +1/+1 counter on this creature."
+SVar:CastTrigger:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever an opponent casts a spell, put a +1/+1 counter on this creature.
+SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1
+DeckHas:Ability$Counters
+SVar:BuffedBy:Creature
+Oracle:Soulbond (You may pair this creature with another unpaired creature when either enters the battlefield. They remain paired for as long as you control both of them.)\nAs long as Thundering Mightmare is paired with another creature, each of those creatures has "Whenever an opponent casts a spell, put a +1/+1 counter on this creature."
diff --git a/forge-gui/res/cardsfolder/upcoming/timin_youthful_geist.txt b/forge-gui/res/cardsfolder/upcoming/timin_youthful_geist.txt
new file mode 100644
index 00000000000..495cf907d7b
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/timin_youthful_geist.txt
@@ -0,0 +1,11 @@
+Name:Timin, Youthful Geist
+ManaCost:4 U
+Types:Legendary Creature Spirit
+PT:3/4
+K:Partner:Rhoda, Geist Avenger
+K:Flying
+T:Mode$ Phase | Phase$ BeginCombat | TriggerZones$ Battlefield | Execute$ TrigTap | TriggerDescription$ At the beginning of each combat, tap up to one target creature.
+SVar:TrigTap:DB$ Tap | ValidTgts$ Creature | TgtPrompt$ Select target creature | TargetMin$ 0 | TargetMax$ 1
+SVar:PlayMain1:TRUE
+DeckHints:Name$Rhoda, Geist Avenger
+Oracle:Partner with Rhoda, Geist Avenger (When this creature enters the battlefield, target player may put Rhoda, Geist Avenger into their hand from their library, then shuffle.)\nFlying\nAt the beginning of each combat, tap up to one target creature.
diff --git a/forge-gui/res/cardsfolder/upcoming/timothar_baron_of_bats.txt b/forge-gui/res/cardsfolder/upcoming/timothar_baron_of_bats.txt
new file mode 100644
index 00000000000..b329c69125b
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/timothar_baron_of_bats.txt
@@ -0,0 +1,15 @@
+Name:Timothar, Baron of Bats
+ManaCost:4 B B
+Types:Legendary Creature Vampire Noble
+PT:4/4
+K:Ward:Discard<1/Card>
+T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Vampire.Other+nonToken+YouCtrl | RememberTriggeringCard$ True | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever another nontoken Vampire you control dies, you may pay {1} and exile it. If you do, create a 1/1 black Bat creature token with flying. It gains “When this creature deals combat damage to a player, sacrifice it and return the exiled card to the battlefield tapped.”
+SVar:TrigToken:AB$ Token | Cost$ 1 ExileFromGrave<1/Card.IsRemembered/the Vampire card> | TokenRemembered$ ExiledCards | TokenScript$ b_1_1_bat_flying | ImprintTokens$ True | SubAbility$ DBAnimate
+SVar:DBAnimate:DB$ Animate | Defined$ Imprinted | Duration$ Permanent | Triggers$ CDTrigger | Duration$ Permanent | SubAbility$ DBCleanup
+SVar:DBCleanup:DB$ Cleanup | ClearImprinted$ True | ClearRemembered$ True
+SVar:CDTrigger:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigSac | TriggerZones$ Battlefield | TriggerDescription$ When this creature deals combat damage to a player, sacrifice it and return the exiled card to the battlefield tapped.
+SVar:TrigSac:DB$ Sacrifice | Defined$ Self | SubAbility$ DBReturn
+SVar:DBReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield | Tapped$ True
+DeckNeeds:Type$Vampire
+DeckHas:Ability$Token & Ability$Sacrifice
+Oracle:Ward—Discard a card.\nWhenever another nontoken Vampire you control dies, you may pay {1} and exile it. If you do, create a 1/1 black Bat creature token with flying. It gains "When this creature deals combat damage to a player, sacrifice it and return the exiled card to the battlefield tapped."
diff --git a/forge-gui/res/cardsfolder/upcoming/toxic_scorpion.txt b/forge-gui/res/cardsfolder/upcoming/toxic_scorpion.txt
new file mode 100644
index 00000000000..0ccb782cc9d
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/toxic_scorpion.txt
@@ -0,0 +1,8 @@
+Name:Toxic Scorpion
+ManaCost:1 G
+Types:Creature Scorpion
+PT:1/1
+K:Deathtouch
+T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, another target creature you control gains deathtouch until end of turn.
+SVar:TrigPump:DB$ Pump | ValidTgts$ Creature.YouCtrl+Other | TgtPrompt$ Select another target creature you control | KW$ Deathtouch
+Oracle:Deathtouch\nWhen Toxic Scorpion enters the battlefield, another target creature you control gains deathtouch until end of turn.
diff --git a/forge-gui/res/cardsfolder/upcoming/traveling_minister.txt b/forge-gui/res/cardsfolder/upcoming/traveling_minister.txt
new file mode 100644
index 00000000000..425dbd8dbce
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/traveling_minister.txt
@@ -0,0 +1,8 @@
+Name:Traveling Minister
+ManaCost:W
+Types:Creature Human Cleric
+PT:1/1
+A:AB$ Pump | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | SorcerySpeed$ True | SubAbility$ DBGainLife | SpellDescription$ Target creature gets +1/+0 until end of turn. You gain 1 life. Activate only as a sorcery.
+SVar:DBGainLife:DB$ GainLife | LifeAmount$ 1
+DeckHas:Ability$LifeGain
+Oracle:{T}: Target creature gets +1/+0 until end of turn. You gain 1 life. Activate only as a sorcery.
diff --git a/forge-gui/res/cardsfolder/upcoming/umbris_fear_manifest.txt b/forge-gui/res/cardsfolder/upcoming/umbris_fear_manifest.txt
new file mode 100644
index 00000000000..d2815d8738b
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/umbris_fear_manifest.txt
@@ -0,0 +1,10 @@
+Name:Umbris, Fear Manifest
+ManaCost:3 U B
+Types:Legendary Creature Nightmare Horror
+PT:1/1
+S:Mode$ Continuous | Affected$ Card.Self | AddPower$ X | AddToughness$ X | Description$ CARDNAME gets +1/+1 for each card your opponents own in exile.
+SVar:X:Count$ValidExile Card.OppOwn
+T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self,Nightmare.Other+YouCtrl,Horror.Other+YouCtrl | Execute$ TrigExile | TriggerZones$ Battlefield | TriggerDescription$ Whenever NICKNAME or another Nightmare or Horror enters the battlefield under your control, target opponent exiles cards from the top of their library until they exile a land card.
+SVar:TrigExile:DB$ DigUntil | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | Valid$ Land | ValidDescription$ land | FoundDestination$ Exile | RevealedDestination$ Exile | IsCurse$ True
+DeckHints:Type$Nightmare|Horror
+Oracle:Umbris, Fear Manifest gets +1/+1 for each card your opponents own in exile.\nWhenever Umbris or another Nightmare or Horror enters the battlefield under your control, target opponent exiles cards from the top of their library until they exile a land card.
diff --git a/forge-gui/res/cardsfolder/upcoming/undying_malice.txt b/forge-gui/res/cardsfolder/upcoming/undying_malice.txt
new file mode 100644
index 00000000000..5b8471a6d94
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/undying_malice.txt
@@ -0,0 +1,8 @@
+Name:Undying Malice
+ManaCost:B
+Types:Instant
+A:SP$ Animate | ValidTgts$ Creature | TgtPrompt$ Select target creature | Triggers$ DiesTrigger | StackDescription$ Until end of turn, {c:Targeted} gains "When this creature dies, return it to the battlefield tapped under its owner's control with a +1/+1 counter on it." | SpellDescription$ Until end of turn, target creature gains "When this creature dies, return it to the battlefield tapped under its owner's control with a +1/+1 counter on it."
+SVar:DiesTrigger:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When this creature dies, return it to the battlefield tapped under its owner's control with a +1/+1 counter on it.
+SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Tapped$ True | Defined$ TriggeredNewCardLKICopy | WithCounters$ P1P1_1
+DeckHas:Ability$Counters
+Oracle:Until end of turn, target creature gains "When this creature dies, return it to the battlefield tapped under its owner's control with a +1/+1 counter on it."
diff --git a/forge-gui/res/cardsfolder/upcoming/unholy_officiant.txt b/forge-gui/res/cardsfolder/upcoming/unholy_officiant.txt
new file mode 100644
index 00000000000..0bc985a795a
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/unholy_officiant.txt
@@ -0,0 +1,8 @@
+Name:Unholy Officiant
+ManaCost:W
+Types:Creature Vampire Cleric
+PT:1/2
+K:Vigilance
+A:AB$ PutCounter | Cost$ 4 W | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on CARDNAME.
+DeckHas:Ability$Counters
+Oracle:Vigilance\n{4}{W}: Put a +1/+1 counter on Unholy Officiant.
diff --git a/forge-gui/res/cardsfolder/upcoming/vampire_slayer.txt b/forge-gui/res/cardsfolder/upcoming/vampire_slayer.txt
new file mode 100644
index 00000000000..5f72f3b3904
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/vampire_slayer.txt
@@ -0,0 +1,7 @@
+Name:Vampire Slayer
+ManaCost:1 W
+Types:Creature Human Soldier
+PT:2/2
+T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Vampire | TriggerZones$ Battlefield | Execute$ TrigDestroy | TriggerDescription$ Whenever CARDNAME deals damage to a Vampire, destroy that creature.
+SVar:TrigDestroy:DB$ Destroy | Defined$ TriggeredTargetLKICopy
+Oracle:Whenever Vampire Slayer deals damage to a Vampire, destroy that creature.
diff --git a/forge-gui/res/cardsfolder/upcoming/vampires_kiss.txt b/forge-gui/res/cardsfolder/upcoming/vampires_kiss.txt
new file mode 100644
index 00000000000..55b0daeb036
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/vampires_kiss.txt
@@ -0,0 +1,8 @@
+Name:Vampire's Kiss
+ManaCost:1 B
+Types:Sorcery
+A:SP$ LoseLife | Cost$ 1 B | ValidTgts$ Player | TgtPrompt$ Select target player | LifeAmount$ 2 | SubAbility$ DBGainLife | StackDescription$ {p:Targeted} loses 2 life | SpellDescription$ Target player loses 2 life and you gain 2 life.
+SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 2 | StackDescription$ and {p:You} gains 2 life. | SubAbility$ DBBlood
+SVar:DBBlood:DB$ Token | TokenAmount$ 2 | TokenScript$ c_a_blood_draw | TokenOwner$ You | SpellDescription$ Create two Blood tokens. (They're artifacts with "{1}, {T}, Discard a card, Sacrifice this artifact: Draw a card.")
+DeckHas:Ability$LifeGain & Ability$Token & Ability$Sacrifice & Type$Blood
+Oracle:Target player loses 2 life and you gain 2 life. Create two Blood tokens. (They're artifacts with "{1}, {T}, Discard a card, Sacrifice this artifact: Draw a card.")
diff --git a/forge-gui/res/cardsfolder/upcoming/voldaren_bloodcaster_bloodbat_summoner.txt b/forge-gui/res/cardsfolder/upcoming/voldaren_bloodcaster_bloodbat_summoner.txt
index 701703d1d3b..673028e4df0 100644
--- a/forge-gui/res/cardsfolder/upcoming/voldaren_bloodcaster_bloodbat_summoner.txt
+++ b/forge-gui/res/cardsfolder/upcoming/voldaren_bloodcaster_bloodbat_summoner.txt
@@ -5,7 +5,7 @@ PT:2/1
K:Flying
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self,Creature.Other+nonToken+YouCtrl | Execute$ TrigToken | TriggerDescription$ Whenever CARDNAME or another nontoken creature you control dies, create a Blood token. (It's an artifact with "{1}, {T}, Discard a card, Sacrifice this artifact: Draw a card.")
SVar:TrigToken:DB$ Token | TokenScript$ c_a_blood_draw
-T:Mode$ TokenCreated | ValidPlayer$ You | ValidToken$ Blood | IsPresent$ Blood.token+YouCtrl | PresentCompare$ GE5 | Execute$ TrigTransform | TriggerZone$ Battlefield | TriggerDescription$ Whenever you create a Blood token, if you control five or more Blood tokens, transform CARDNAME.
+T:Mode$ TokenCreated | ValidPlayer$ You | ValidToken$ Blood | IsPresent$ Blood.token+YouCtrl | PresentCompare$ GE5 | Execute$ TrigTransform | TriggerZones$ Battlefield | TriggerDescription$ Whenever you create a Blood token, if you control five or more Blood tokens, transform CARDNAME.
SVar:TrigTransform:DB$ SetState | Defined$ Self | Mode$ Transform
AlternateMode:DoubleFaced
DeckHas:Ability$Token & Ability$Sacrifice & Type$Blood
diff --git a/forge-gui/res/cardsfolder/upcoming/voldaren_epicure.txt b/forge-gui/res/cardsfolder/upcoming/voldaren_epicure.txt
new file mode 100644
index 00000000000..303797bae4f
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/voldaren_epicure.txt
@@ -0,0 +1,9 @@
+Name:Voldaren Epicure
+ManaCost:R
+Types:Creature Vampire
+PT:1/1
+T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDmg1 | TriggerDescription$ When CARDNAME enters the battlefield, it deals 1 damage to each opponent. Create a Blood token. (It's an artifact with "{1}, {T}, Discard a card, Sacrifice this artifact: Draw a card.")
+SVar:TrigDmg1:DB$ DealDamage | NumDmg$ 1 | Defined$ Player.Opponent | SubAbility$ DBBlood
+SVar:DBBlood:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_blood_draw | TokenOwner$ You
+DeckHas:Ability$Token & Ability$Sacrifice & Type$Blood
+Oracle:When Voldaren Epicure enters the battlefield, it deals 1 damage to each opponent. Create a Blood token. (It's an artifact with "{1}, {T}, Discard a card, Sacrifice this artifact: Draw a card.")
diff --git a/forge-gui/res/cardsfolder/upcoming/wanderlight_spirit.txt b/forge-gui/res/cardsfolder/upcoming/wanderlight_spirit.txt
new file mode 100755
index 00000000000..f767ea6cf19
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/wanderlight_spirit.txt
@@ -0,0 +1,7 @@
+Name:Wanderlight Spirit
+ManaCost:2 U
+Types:Creature Spirit
+PT:2/3
+K:Flying
+S:Mode$ CantBlockBy | ValidAttacker$ Creature.withoutFlying | ValidBlocker$ Creature.Self | Description$ CARDNAME can block only creatures with flying.
+Oracle:Flying\nWanderlight Spirit can block only creatures with flying.
diff --git a/forge-gui/res/cardsfolder/upcoming/wash_away.txt b/forge-gui/res/cardsfolder/upcoming/wash_away.txt
new file mode 100644
index 00000000000..63fff204db5
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/wash_away.txt
@@ -0,0 +1,6 @@
+Name:Wash Away
+ManaCost:U
+Types:Instant
+A:SP$ Counter | TargetType$ Spell | TgtPrompt$ Select target spell that wasn't cast from its owner's hand | ValidTgts$ Card.wasNotCastFromHand | SpellDescription$ Counter target spell [that wasn't cast from its owner's hand].
+A:SP$ Counter | Cost$ 1 U U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | PrecostDesc$ Cleave | CostDesc$ {1}{U}{U} | NonBasicSpell$ True | SpellDescription$ (You may cast this spell for its cleave cost. If you do, remove the words in square brackets.)
+Oracle:Cleave {1}{U}{U} (You may cast this spell for its cleave cost. If you do, remove the words in square brackets.)\nCounter target spell [that wasn't cast from its owner's hand].
diff --git a/forge-gui/res/cardsfolder/upcoming/wedding_invitation.txt b/forge-gui/res/cardsfolder/upcoming/wedding_invitation.txt
index b3995b57991..0b1c18dabb5 100644
--- a/forge-gui/res/cardsfolder/upcoming/wedding_invitation.txt
+++ b/forge-gui/res/cardsfolder/upcoming/wedding_invitation.txt
@@ -3,7 +3,7 @@ ManaCost:2
Types:Artifact
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card.
SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1
-A:AB$ Pump | Cost$ 1 Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN Unblockable | AITgts$ Vampire | SubAbility$ DBPump | StackDescription$ {c:Targeted} can't be blocked this turn. | SpellDescription$ Target creature can't be blocked this turn. If it's a Vampire, it also gains lifelink until end of turn.
+A:AB$ Pump | Cost$ T Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN Unblockable | AITgts$ Vampire | SubAbility$ DBPump | StackDescription$ {c:Targeted} can't be blocked this turn. | SpellDescription$ Target creature can't be blocked this turn. If it's a Vampire, it also gains lifelink until end of turn.
SVar:DBPump:DB$ Pump | Defined$ Targeted.Vampire | KW$ Lifelink | StackDescription$ If it's a Vampire, it also gains lifelink until end of turn.
DeckHints:Type$Vampire
DeckHas:Ability$LifeGain
diff --git a/forge-gui/res/cardsfolder/upcoming/welcoming_vampire.txt b/forge-gui/res/cardsfolder/upcoming/welcoming_vampire.txt
new file mode 100644
index 00000000000..7a8d18c07e4
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/welcoming_vampire.txt
@@ -0,0 +1,9 @@
+Name:Welcoming Vampire
+ManaCost:2 W
+Types:Creature Vampire
+PT:2/3
+K:Flying
+T:Mode$ ChangesZoneAll | ValidCards$ Creature.powerLE2+YouCtrl+Other | Destination$ Battlefield | TriggerZones$ Battlefield | ActivationLimit$ 1 | Execute$ TrigDraw | TriggerDescription$ Whenever one or more other creatures with power 2 or less enter the battlefield under your control, draw a card. This ability triggers only once each turn.
+SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1
+SVar:BuffedBy:Creature.powerLE2
+Oracle:Flying\nWhenever one or more other creatures with power 2 or less enter the battlefield under your control, draw a card. This ability triggers only once each turn.
diff --git a/forge-gui/res/cardsfolder/upcoming/winged_portent.txt b/forge-gui/res/cardsfolder/upcoming/winged_portent.txt
new file mode 100644
index 00000000000..23ccf101c91
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/winged_portent.txt
@@ -0,0 +1,8 @@
+Name:Winged Portent
+ManaCost:1 U U
+Types:Instant
+A:SP$ Draw | NumCards$ X | SpellDescription$ Draw a card for each creature [with flying] you control.
+A:SP$ Draw | Cost$ 4 G U | NumCards$ Y | PrecostDesc$ Cleave | CostDesc$ {4}{G}{U} | NonBasicSpell$ True | SpellDescription$ (You may cast this spell for its cleave cost. If you do, remove the words in square brackets.)
+SVar:X:Count$Valid Creature.withFlying+YouCtrl
+SVar:Y:Count$Valid Creature.YouCtrl
+Oracle:Cleave {4}{G}{U} (You may cast this spell for its cleave cost. If you do, remove the words in square brackets.)\nDraw a card for each creature [with flying] you control.
diff --git a/forge-gui/res/cardsfolder/upcoming/witchs_web.txt b/forge-gui/res/cardsfolder/upcoming/witchs_web.txt
new file mode 100644
index 00000000000..8e8204003ba
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/witchs_web.txt
@@ -0,0 +1,6 @@
+Name:Witch's Web
+ManaCost:1 G
+Types:Instant
+A:SP$ Pump | Cost$ 1 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +3 | NumDef$ +3 | KW$ Reach | SubAbility$ DBUntap | SpellDescription$ Target creature gets +3/+3 and gains reach until end of turn. Untap it.
+SVar:DBUntap:DB$ Untap | Defined$ Targeted
+Oracle:Target creature gets +3/+3 and gains reach until end of turn. Untap it.
diff --git a/forge-gui/res/cardsfolder/upcoming/wolf_strike.txt b/forge-gui/res/cardsfolder/upcoming/wolf_strike.txt
new file mode 100644
index 00000000000..15e93ebbf29
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/wolf_strike.txt
@@ -0,0 +1,8 @@
+Name:Wolf Strike
+ManaCost:2 G
+Types:Instant
+A:SP$ Pump | Cost$ 2 G | ValidTgts$ Creature.YouCtrl | AILogic$ PowerDmg | NumAtt$ +X | TgtPrompt$ Select target creature you control | SubAbility$ DBDamage | StackDescription$ {c:ThisTargetedCard} gets +2/+0 until end of turn if it's night. | SpellDescription$ Target creature you control gets +2/+0 until end of turn if it's night. Then it deals damage equal to its power to target creature you don't control.
+SVar:DBDamage:DB$ DealDamage | ValidTgts$ Creature.YouDontCtrl | AILogic$ PowerDmg | TgtPrompt$ Select target creature you don't control | NumDmg$ Y | DamageSource$ ParentTarget | StackDescription$ Then it deals damage equal to its power to {c:ThisTargetedCard}.
+SVar:X:Count$Night.2.0
+SVar:Y:ParentTargeted$CardPower
+Oracle:Target creature you control gets +2/+0 until end of turn if it's night. Then it deals damage equal to its power to target creature you don't control.
diff --git a/forge-gui/res/cardsfolder/upcoming/wolfkin_outcast_wedding_crasher.txt b/forge-gui/res/cardsfolder/upcoming/wolfkin_outcast_wedding_crasher.txt
new file mode 100644
index 00000000000..10d269f1da1
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/wolfkin_outcast_wedding_crasher.txt
@@ -0,0 +1,22 @@
+Name:Wolfkin Outcast
+ManaCost:5 G
+Types:Creature Human Werewolf
+PT:5/4
+S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ 2 | EffectZone$ All | IsPresent$ Wolf.YouCtrl,Werewolf.YouCtrl | Description$ This spell costs {2} less to cast if you control a Wolf or a Werewolf.
+K:Daybound
+AlternateMode:DoubleFaced
+DeckHints:Type$Wolf|Werewolf
+SVar:BuffedBy:Wolf,Werewolf
+Oracle:This spell costs {2} less to cast if you control a Wolf or Werewolf.\nDaybound (If a player casts no spells during their own turn, it becomes night next turn.)
+
+ALTERNATE
+
+Name:Wedding Crasher
+ManaCost:no cost
+Colors:green
+Types:Creature Werewolf
+PT:6/5
+T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self,Wolf.Other+YouCtrl,Werewolf.Other+YouCtrl | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME or another Wolf or Werewolf you control dies, draw a card.
+SVar:TrigDraw:DB$ Draw | NumCards$ 1
+K:Nightbound
+Oracle:Whenever Wedding Crasher or another Wolf or Werewolf you control dies, draw a card.\nNightbound (If a player casts at least two spells during their own turn, it becomes day next turn.)
diff --git a/forge-gui/res/cardsfolder/upcoming/wretched_throng.txt b/forge-gui/res/cardsfolder/upcoming/wretched_throng.txt
new file mode 100644
index 00000000000..70b3e012793
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/wretched_throng.txt
@@ -0,0 +1,8 @@
+Name:Wretched Throng
+ManaCost:1 U
+Types:Creature Zombie Horror
+PT:2/1
+T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME dies, you may search your library for a card named Wretched Throng, reveal it, put it into your hand, then shuffle.
+SVar:TrigChange:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Card.namedWretched Throng | ChangeNum$ 1
+DeckHints:Name$Wretched Throng
+Oracle:When Wretched Throng dies, you may search your library for a card named Wretched Throng, reveal it, put it into your hand, then shuffle.
diff --git a/forge-gui/res/cardsfolder/v/vadrik_astral_archmage.txt b/forge-gui/res/cardsfolder/v/vadrik_astral_archmage.txt
index d22279f1b86..ef8e41c14b3 100644
--- a/forge-gui/res/cardsfolder/v/vadrik_astral_archmage.txt
+++ b/forge-gui/res/cardsfolder/v/vadrik_astral_archmage.txt
@@ -11,4 +11,4 @@ T:Mode$ DayTimeChanges | Execute$ TrigPutCounter | TriggerZones$ Battlefield | T
SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1
DeckHints:Type$Instant|Sorcery
DeckHas:Ability$Counters
-Oracle:If it's neither day nor night, it becomes day as Vadrik, Astral Archmage enters the battlefield.\nInstant and sorcery spells you cast cost {X} less to cast, where X is Vadrik’s power.\nWhenever day becomes night or night becomes day, put a +1/+1 counter on Vadrik.
+Oracle:If it's neither day nor night, it becomes day as Vadrik, Astral Archmage enters the battlefield.\nInstant and sorcery spells you cast cost {X} less to cast, where X is Vadrik's power.\nWhenever day becomes night or night becomes day, put a +1/+1 counter on Vadrik.
diff --git a/forge-gui/res/cardsfolder/v/vampire_socialite.txt b/forge-gui/res/cardsfolder/v/vampire_socialite.txt
index f12fd11eae0..8f0434f6a90 100644
--- a/forge-gui/res/cardsfolder/v/vampire_socialite.txt
+++ b/forge-gui/res/cardsfolder/v/vampire_socialite.txt
@@ -10,4 +10,4 @@ SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | Counte
SVar:X:Count$LifeOppsLostThisTurn
DeckNeeds:Type$Vampire
DeckHas:Ability$Counters
-Oracle:Menace (This creature can’t be blocked except by two or more creatures.)\nWhen Vampire Socialite enters the battlefield, if an opponent lost life this turn, put a +1/+1 counter on each other Vampire you control.\nAs long as an opponent lost life this turn, each other Vampire you control enters the battlefield with an additional +1/+1 counter on it.
+Oracle:Menace (This creature can't be blocked except by two or more creatures.)\nWhen Vampire Socialite enters the battlefield, if an opponent lost life this turn, put a +1/+1 counter on each other Vampire you control.\nAs long as an opponent lost life this turn, each other Vampire you control enters the battlefield with an additional +1/+1 counter on it.
diff --git a/forge-gui/res/cardsfolder/v/veil_of_summer.txt b/forge-gui/res/cardsfolder/v/veil_of_summer.txt
index 3b5adbdc02c..f0a1f5e1181 100644
--- a/forge-gui/res/cardsfolder/v/veil_of_summer.txt
+++ b/forge-gui/res/cardsfolder/v/veil_of_summer.txt
@@ -4,9 +4,8 @@ Types:Instant
A:SP$ Draw | Cost$ G | Defined$ You | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | SubAbility$ DBEffect | StackDescription$ SpellDescription | SpellDescription$ Draw a card if an opponent has cast a blue or black spell this turn. Spells you control can't be countered this turn. You and permanents you control gain hexproof from blue and from black until end of turn. (You and they can't be the targets of blue or black spells or abilities your opponents control.)
SVar:DBEffect:DB$ Effect | StaticAbilities$ AntiMagic | SubAbility$ DBPump
SVar:AntiMagic:Mode$ Continuous | Affected$ Card.YouCtrl | AffectedZone$ Stack | EffectZone$ Command | AddHiddenKeyword$ CARDNAME can't be countered. | Description$ Spells you control can't be countered this turn.
-SVar:DBPump:DB$ Pump | Defined$ You | KW$ Hexproof:Card.Black:black & Hexproof:Card.Blue:blue | SubAbility$ DBPumpAll
+SVar:DBPump:DB$ Pump | Defined$ You | KW$ Hexproof:Card.Black:black & Hexproof:Card.Blue:blue | SubAbility$ DBPumpAll | StackDescription$ None
SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Permanent.YouCtrl | KW$ Hexproof:Card.Black:black & Hexproof:Card.Blue:blue
SVar:X:Count$ThisTurnCast_Card.OppCtrl+Blue,Card.OppCtrl+Black
AI:RemoveDeck:Random
-DeckHints:Color$Blue|Black
Oracle:Draw a card if an opponent has cast a blue or black spell this turn. Spells you control can't be countered this turn. You and permanents you control gain hexproof from blue and from black until end of turn. (You and they can't be the targets of blue or black spells or abilities your opponents control.)
diff --git a/forge-gui/res/cardsfolder/v/verdant_mastery.txt b/forge-gui/res/cardsfolder/v/verdant_mastery.txt
index fec889c5851..e85ae62bfc6 100644
--- a/forge-gui/res/cardsfolder/v/verdant_mastery.txt
+++ b/forge-gui/res/cardsfolder/v/verdant_mastery.txt
@@ -2,7 +2,7 @@ Name:Verdant Mastery
ManaCost:5 G
Types:Sorcery
SVar:AltCost:Cost$ 3 G | Description$ You may pay {3}{G} rather than pay this spell's mana cost. | StackDescription$ Search your library for up to four basic land cards and reveal them. Put one of them onto the battlefield tapped under an opponent's control if the {3}{G} cost was paid. Put two of them onto the battlefield tapped under your control and the rest into your hand. Then shuffle.
-A:SP$ ChangeZone | Origin$ Library | Hidden$ True | ChangeNum$ 4 | ChangeType$ Land.Basic | Destination$ Library | RememberChanged$ True | Reveal$ True | Shuffle$ False | SubAbility$ DBBranch | StackDescription$ Search your library for up to four basic land cards and reveal them. Put two of them onto the battlefield tapped under your control and the rest into your hand. Then shuffle. | SpellDescription$ Search your library for up to four basic land cards and reveal them. Put one of them onto the battlefield tapped under an opponent’s control if the {3}{G} cost was paid. Put two of them onto the battlefield tapped under your control and the rest into your hand. Then shuffle.
+A:SP$ ChangeZone | Origin$ Library | Hidden$ True | ChangeNum$ 4 | ChangeType$ Land.Basic | Destination$ Library | RememberChanged$ True | Reveal$ True | Shuffle$ False | SubAbility$ DBBranch | StackDescription$ Search your library for up to four basic land cards and reveal them. Put two of them onto the battlefield tapped under your control and the rest into your hand. Then shuffle. | SpellDescription$ Search your library for up to four basic land cards and reveal them. Put one of them onto the battlefield tapped under an opponent's control if the {3}{G} cost was paid. Put two of them onto the battlefield tapped under your control and the rest into your hand. Then shuffle.
SVar:DBBranch:DB$ Branch | BranchConditionSVar$ AltCostPaid | BranchConditionSVarCompare$ GE1 | TrueSubAbility$ OppShare | FalseSubAbility$ DBChangeZone2
SVar:OppShare:DB$ ChoosePlayer | Defined$ You | Choices$ Player.Opponent | ChoiceTitle$ Choose an opponent | SubAbility$ DBChangeZone
SVar:DBChangeZone:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | Tapped$ True | ChangeType$ Card.IsRemembered | ChangeNum$ 1 | Mandatory$ True | SelectPrompt$ Select a land to put on the battlefield tapped under an opponent's control | GainControl$ True | NewController$ ChosenPlayer | ForgetChanged$ True | NoShuffle$ True | SubAbility$ DBChangeZone2
diff --git a/forge-gui/res/cardsfolder/v/voldaren_pariah_abolisher_of_bloodlines.txt b/forge-gui/res/cardsfolder/v/voldaren_pariah_abolisher_of_bloodlines.txt
index c3b4647def8..8db0b04eb89 100644
--- a/forge-gui/res/cardsfolder/v/voldaren_pariah_abolisher_of_bloodlines.txt
+++ b/forge-gui/res/cardsfolder/v/voldaren_pariah_abolisher_of_bloodlines.txt
@@ -1,46 +1,22 @@
Name:Voldaren Pariah
-
ManaCost:3 B B
-
Types:Creature Vampire Horror
-
PT:3/3
-
K:Flying
-
-A:AB$SetState | Cost$ Sac<3/Creature.Other/another creature> | Defined$ Self | Mode$ Transform | SpellDescription$ Transform CARDNAME.
-
+A:AB$ SetState | Cost$ Sac<3/Creature.Other/another creature> | Defined$ Self | Mode$ Transform | SpellDescription$ Transform CARDNAME.
K:Madness:B B B
-
DeckHints:Ability$Discard
-
-SVar:Picture:http://www.wizards.com/global/images/magic/general/voldaren_pariah.jpg
-
AlternateMode:DoubleFaced
-
Oracle:Flying\nSacrifice three other creatures: Transform Voldaren Pariah.\nMadness {B}{B}{B} (If you discard this card, discard it into exile. When you do, cast it for its madness cost or put it into your graveyard.)
-
-
ALTERNATE
-
-
Name:Abolisher of Bloodlines
-
ManaCost:no cost
-
Types:Creature Eldrazi Vampire
-
PT:6/5
-
K:Flying
-
T:Mode$ Transformed | ValidCard$ Card.Self | Execute$ TrigSacrifice | TriggerDescription$ When this creature transforms into CARDNAME, target opponent sacrifices three creatures.
-
SVar:TrigSacrifice:DB$ Sacrifice | ValidTgts$ Opponent | SacValid$ Creature | Amount$ 3 | SacMessage$ Creature
-
-SVar:Picture:http://www.wizards.com/global/images/magic/general/abolisher_of_bloodlines.jpg
-
Oracle:Flying\nWhen this creature transforms into Abolisher of Bloodlines, target opponent sacrifices three creatures.
diff --git a/forge-gui/res/cardsfolder/v/vraska_golgari_queen.txt b/forge-gui/res/cardsfolder/v/vraska_golgari_queen.txt
index 21ce306191e..561e372a628 100644
--- a/forge-gui/res/cardsfolder/v/vraska_golgari_queen.txt
+++ b/forge-gui/res/cardsfolder/v/vraska_golgari_queen.txt
@@ -2,10 +2,8 @@ Name:Vraska, Golgari Queen
ManaCost:2 B G
Types:Legendary Planeswalker Vraska
Loyalty:4
-A:AB$ Sacrifice | Cost$ AddCounter<2/LOYALTY> | Planeswalker$ True | SacValid$ Permanent.Other | SacMessage$ another permanent | Optional$ True | RememberSacrificed$ True | SubAbility$ DBGainLife | SpellDescription$ You may sacrifice another permanent. If you do, you gain 1 life and draw a card.
-SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 | SubAbility$ DBDraw | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1
-SVar:DBDraw:DB$ Draw | NumCards$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup
-SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
+A:AB$ GainLife | Cost$ AddCounter<2/LOYALTY> | Planeswalker$ True | LifeAmount$ 1 | UnlessCost$ Sac<1/Permanent.Other> | UnlessSwitched$ True | UnlessPayer$ You | SubAbility$ DBDraw | SpellDescription$ You may sacrifice another permanent. If you do, you gain 1 life and draw a card.
+SVar:DBDraw:DB$ Draw | NumCards$ 1 | ConditionDefined$ Sacrificed | ConditionPresent$ Card | ConditionCompare$ GE1
A:AB$ Destroy | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | ValidTgts$ Permanent.nonLand+cmcLE3 | TgtPrompt$ Select target nonland permanent with mana value 3 or less | SpellDescription$ Destroy target nonland permanent with mana value 3 or less.
A:AB$ Effect | Cost$ SubCounter<9/LOYALTY> | Planeswalker$ True | Ultimate$ True | Stackable$ False | Name$ Emblem - Vraska, Golgari Queen | Image$ emblem_vraska_golgari_queen | Triggers$ TrigDamage | Duration$ Permanent | AILogic$ Always | SpellDescription$ You get an emblem with "Whenever a creature you control deals combat damage to a player, that player loses the game."
SVar:TrigDamage:Mode$ DamageDone | ValidSource$ Creature.YouCtrl | ValidTarget$ Player | CombatDamage$ True | Execute$ LoseGame | TriggerZones$ Command | TriggerDescription$ Whenever a creature you control deals combat damage to a player, that player loses the game.
diff --git a/forge-gui/res/cardsfolder/w/warden_of_the_woods.txt b/forge-gui/res/cardsfolder/w/warden_of_the_woods.txt
index 04afcdc53cc..48e0cf0c66b 100644
--- a/forge-gui/res/cardsfolder/w/warden_of_the_woods.txt
+++ b/forge-gui/res/cardsfolder/w/warden_of_the_woods.txt
@@ -3,6 +3,6 @@ ManaCost:4 G G
Types:Creature Treefolk
PT:5/7
K:Vigilance
-T:Mode$ BecomesTarget | ValidSource$ Card.OppCtrl | ValidTarget$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigDraw | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME becomes the target of a spell or ability an opponent controls, you may draw two cards.
-SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 2
+T:Mode$ BecomesTarget | ValidSource$ Card.OppCtrl | ValidTarget$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME becomes the target of a spell or ability an opponent controls, you may draw two cards.
+SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 2 | OptionalDecider$ You
Oracle:Vigilance (Attacking doesn't cause this creature to tap.)\nWhenever Warden of the Woods becomes the target of a spell or ability an opponent controls, you may draw two cards.
diff --git a/forge-gui/res/cardsfolder/w/whippoorwill.txt b/forge-gui/res/cardsfolder/w/whippoorwill.txt
index 5104086aace..b9933496a58 100644
--- a/forge-gui/res/cardsfolder/w/whippoorwill.txt
+++ b/forge-gui/res/cardsfolder/w/whippoorwill.txt
@@ -2,7 +2,7 @@ Name:Whippoorwill
ManaCost:G
Types:Creature Bird
PT:1/1
-A:AB$ Pump | Cost$ G G T | ValidTgts$ Creature | TgtPrompt$ Select target creature | AILogic$ Curse | KW$ HIDDEN CARDNAME can't be regenerated. & HIDDEN Damage that would be dealt to CARDNAME can't be redirected. | SubAbility$ DBEffect | StackDescription$ {c:Targeted} can’t be regenerated this turn. Damage that would be dealt to that card this turn can't be prevented or dealt instead to another permanent or player. SpellDescription$ Target creature can't be regenerated this turn. Damage that would be dealt to that creature this turn can't be prevented or dealt instead to another permanent or player. When the creature dies this turn, exile the creature.
+A:AB$ Pump | Cost$ G G T | ValidTgts$ Creature | TgtPrompt$ Select target creature | AILogic$ Curse | KW$ HIDDEN CARDNAME can't be regenerated. & HIDDEN Damage that would be dealt to CARDNAME can't be redirected. | SubAbility$ DBEffect | StackDescription$ {c:Targeted} can't be regenerated this turn. Damage that would be dealt to that card this turn can't be prevented or dealt instead to another permanent or player. SpellDescription$ Target creature can't be regenerated this turn. Damage that would be dealt to that creature this turn can't be prevented or dealt instead to another permanent or player. When the creature dies this turn, exile the creature.
SVar:DBEffect:DB$ Effect | Name$ Whippoorwill Effect | EffectOwner$ TargetedOwner | RememberObjects$ Targeted | StaticAbilities$ NoPrevent | SubAbility$ DBDelayedTrigger
SVar:NoPrevent:Mode$ CantPreventDamage | Affected$ Creature.IsRemembered | EffectZone$ Command | Description$ Damage that would be dealt to that creature this turn can't be prevented.
SVar:DBDelayedTrigger:DB$ DelayedTrigger | Mode$ ChangesZone | RememberObjects$ Targeted | ValidCard$ Card.IsTriggerRemembered | Origin$ Battlefield | Destination$ Graveyard | ThisTurn$ True | Execute$ TrigExile | TriggerDescription$ When the creature dies this turn, exile the creature.
diff --git a/forge-gui/res/cardsfolder/w/whispering_specter.txt b/forge-gui/res/cardsfolder/w/whispering_specter.txt
index 704f1094436..32a3fa5a3fd 100644
--- a/forge-gui/res/cardsfolder/w/whispering_specter.txt
+++ b/forge-gui/res/cardsfolder/w/whispering_specter.txt
@@ -4,9 +4,7 @@ Types:Creature Phyrexian Specter
PT:1/1
K:Flying
K:Infect
-T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | OptionalDecider$ You | Execute$ TrigSacrifice | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may sacrifice it. If you do, that player discards a card for each poison counter they have.
-SVar:TrigSacrifice:DB$ SacrificeAll | Defined$ Self | RememberSacrificed$ True | SubAbility$ DBDiscard
-SVar:DBDiscard:DB$ Discard | Defined$ TriggeredTarget | NumCards$ X | Mode$ TgtChoose | ConditionDefined$ Remembered | ConditionPresent$ Card | SubAbility$ DBCleanup
-SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
+T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | OptionalDecider$ You | Execute$ TrigDiscard | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may sacrifice it. If you do, that player discards a card for each poison counter they have.
+SVar:TrigDiscard:AB$ Discard | Defined$ TriggeredTarget | NumCards$ X | Mode$ TgtChoose | Cost$ Sac<1/CARDNAME>
SVar:X:TriggeredTarget$PoisonCounters
Oracle:Flying\nInfect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.)\nWhenever Whispering Specter deals combat damage to a player, you may sacrifice it. If you do, that player discards a card for each poison counter they have.
diff --git a/forge-gui/res/cardsfolder/w/whispersteel_dagger.txt b/forge-gui/res/cardsfolder/w/whispersteel_dagger.txt
index bca2d309441..9873ba70764 100644
--- a/forge-gui/res/cardsfolder/w/whispersteel_dagger.txt
+++ b/forge-gui/res/cardsfolder/w/whispersteel_dagger.txt
@@ -4,6 +4,6 @@ Types:Artifact Equipment
S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 2 | Description$ Equipped creature gets +2/+0.
T:Mode$ DamageDone | CombatDamage$ True | ValidSource$ Creature.EquippedBy | ValidTarget$ Player | OptionalDecider$ You | Execute$ TrigEffect | TriggerZones$ Battlefield | TriggerDescription$ Whenever equipped creature deals combat damage to a player, you may cast a creature spell from that player's graveyard this turn, and you may spend mana as though it were mana of any color to cast that spell.
SVar:TrigEffect:DB$ Effect | StaticAbilities$ MayCastGrave | RememberObjects$ TriggeredTarget
-SVar:MayCastGrave:Mode$ Continuous | Affected$ Creature.RememberedPlayerCtrl | MayPlay$ True | MayPlayLimit$ 1 | MayPlayIgnoreType$ True | EffectZone$ Command | AffectedZone$ Graveyard | Description$ You may cast a creature spell from that player’s graveyard this turn, and you may spend mana as though it were mana of any color to cast that spell.
+SVar:MayCastGrave:Mode$ Continuous | Affected$ Creature.RememberedPlayerCtrl | MayPlay$ True | MayPlayLimit$ 1 | MayPlayIgnoreType$ True | EffectZone$ Command | AffectedZone$ Graveyard | Description$ You may cast a creature spell from that player's graveyard this turn, and you may spend mana as though it were mana of any color to cast that spell.
K:Equip:3
Oracle:Equipped creature gets +2/+0.\nWhenever equipped creature deals combat damage to a player, you may cast a creature spell from that player's graveyard this turn, and you may spend mana as though it were mana of any color to cast that spell.\nEquip {3}
diff --git a/forge-gui/res/cardsfolder/y/yamabushis_flame.txt b/forge-gui/res/cardsfolder/y/yamabushis_flame.txt
index 16111ea09c2..1bab3c85aa4 100644
--- a/forge-gui/res/cardsfolder/y/yamabushis_flame.txt
+++ b/forge-gui/res/cardsfolder/y/yamabushis_flame.txt
@@ -1,7 +1,6 @@
Name:Yamabushi's Flame
ManaCost:2 R
Types:Instant
-A:SP$ DealDamage | Cost$ 2 R | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 3 | RememberDamaged$ True | ReplaceDyingDefined$ Remembered | SubAbility$ DBCleanup | SpellDescription$ CARDNAME deals 3 damage to any target. If a creature dealt damage this way would die this turn, exile it instead.
+A:SP$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 3 | RememberDamaged$ True | ReplaceDyingDefined$ Remembered.Creature | SubAbility$ DBCleanup | SpellDescription$ CARDNAME deals 3 damage to any target. If a creature dealt damage this way would die this turn, exile it instead.
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
-SVar:Picture:http://www.wizards.com/global/images/magic/general/yamabushis_flame.jpg
Oracle:Yamabushi's Flame deals 3 damage to any target. If a creature dealt damage this way would die this turn, exile it instead.
diff --git a/forge-gui/res/draft/rankings.txt b/forge-gui/res/draft/rankings.txt
index a0c218b46b5..bb88ee181d8 100644
--- a/forge-gui/res/draft/rankings.txt
+++ b/forge-gui/res/draft/rankings.txt
@@ -1,4 +1,540 @@
//Rank|Name|Rarity|Set
+#1|Avabruck Caretaker|M|VOW
+#2|Overcharged Amalgam|R|VOW
+#3|Dreadfeast Demon|R|VOW
+#4|Cemetery Desecrator|M|VOW
+#5|Manaform Hellkite|M|VOW
+#6|Henrika Domnathi|M|VOW
+#7|Sorin the Mirthless|M|VOW
+#8|Ulvenwald Oddity|R|VOW
+#9|Edgar, Charmed Groom|R|VOW
+#10|Necroduality|M|VOW
+#11|Kaya, Geist Hunter|M|VOW
+#12|Ill-Tempered Loner|R|VOW
+#13|Toxrill, the Corrosive|M|VOW
+#14|Olivia, Crimson Bride|M|VOW
+#15|Bloodvial Purveyor|R|VOW
+#16|Volatile Arsonist|M|VOW
+#17|Halana and Alena, Partners|R|VOW
+#18|Glorious Sunrise|R|VOW
+#19|Howlpack Piper|R|VOW
+#20|Anje, Maid of Dishonor|R|VOW
+#21|Olivia's Attendants|R|VOW
+#22|Savior of Ollenbock|M|VOW
+#23|Chandra, Dressed to Kill|M|VOW
+#24|Cemetery Prowler|M|VOW
+#25|Headless Rider|R|VOW
+#26|Wedding Announcement|R|VOW
+#27|Katilda, Dawnhart Martyr|R|VOW
+#28|Cemetery Protector|M|VOW
+#29|Sigarda's Summons|R|VOW
+#30|Welcoming Vampire|R|VOW
+#31|Cemetery Illuminator|M|VOW
+#32|Torens, Fist of the Angels|R|VOW
+#33|Dreamshackle Geist|R|VOW
+#34|Concealing Curtains|R|VOW
+#35|Hullbreaker Horror|R|VOW
+#36|Hero's Downfall|U|VOW
+#37|Curse of Hospitality|R|VOW
+#38|Thirst for Discovery|U|VOW
+#39|Hiveheart Shaman|R|VOW
+#40|Voldaren Bloodcaster|R|VOW
+#41|Fell Stinger|U|VOW
+#42|Stensia Uprising|R|VOW
+#43|Hamlet Vanguard|R|VOW
+#44|Grolnok, the Omnivore|R|VOW
+#45|Old Rutstein|R|VOW
+#46|Dorothea, Vengeful Victim|R|VOW
+#47|Jacob Hauken, Inspector|M|VOW
+#48|Mirrorhall Mimic|R|VOW
+#49|Resistance Squad|U|VOW
+#50|Geralf, Visionary Stitcher|R|VOW
+#51|Rending Flame|U|VOW
+#52|Graf Reaver|R|VOW
+#53|Creepy Puppeteer|R|VOW
+#54|Markov Purifier|U|VOW
+#55|Child of the Pack|U|VOW
+#56|By Invitation Only|R|VOW
+#57|Bleed Dry|C|VOW
+#58|Vampires' Vengeance|U|VOW
+#59|Ascendant Packleader|R|VOW
+#60|Odric, Blood-Cursed|R|VOW
+#61|Parasitic Grasp|U|VOW
+#62|Eruth, Tormented Prophet|R|VOW
+#63|Wandering Mind|U|VOW
+#64|Brine Comber|U|VOW
+#65|Lantern Flare|R|VOW
+#66|Valorous Stance|U|VOW
+#67|Abrade|C|VOW
+#68|Kessig Wolfrider|R|VOW
+#69|Sigardian Paladin|U|VOW
+#70|Fleeting Spirit|U|VOW
+#71|Reclusive Taxidermist|U|VOW
+#72|Bloodtithe Harvester|U|VOW
+#73|Markov Waltzer|U|VOW
+#74|Skull Skaab|U|VOW
+#75|Alluring Suitor|U|VOW
+#76|Sigarda's Imprisonment|C|VOW
+#77|Thalia, Guardian of Thraben|R|VOW
+#78|Diver Skaab|U|VOW
+#79|Archghoul of Thraben|U|VOW
+#80|Falkenrath Forebear|R|VOW
+#81|Dominating Vampire|R|VOW
+#82|Dig Up|R|VOW
+#83|Dollhouse of Horrors|R|VOW
+#84|Stormchaser Drake|U|VOW
+#85|Blood Hypnotist|U|VOW
+#86|Bramble Wurm|U|VOW
+#87|Ancient Lumberknot|U|VOW
+#88|Wolfkin Outcast|U|VOW
+#89|Faithbound Judge|M|VOW
+#90|Angelic Quartermaster|U|VOW
+#91|Whispering Wizard|U|VOW
+#92|Undead Butler|U|VOW
+#93|Cemetery Gatekeeper|M|VOW
+#94|Flame-Blessed Bolt|C|VOW
+#95|Magma Pummeler|U|VOW
+#96|Wolf Strike|C|VOW
+#97|Vilespawn Spider|U|VOW
+#98|Sawblade Slinger|U|VOW
+#99|Twinblade Geist|U|VOW
+#100|Dormant Grove|U|VOW
+#101|Ballista Watcher|U|VOW
+#102|Voltaic Visionary|U|VOW
+#103|Weaver of Blossoms|C|VOW
+#104|Panicked Bystander|U|VOW
+#105|Voice of the Blessed|R|VOW
+#106|Lunar Rejection|U|VOW
+#107|Path of Peril|R|VOW
+#108|Apprentice Sharpshooter|C|VOW
+#109|Packsong Pup|U|VOW
+#110|Investigator's Journal|R|VOW
+#111|Circle of Confinement|U|VOW
+#112|Scattered Thoughts|C|VOW
+#113|Runebound Wolf|U|VOW
+#114|Spiked Ripsaw|U|VOW
+#115|Distracting Geist|U|VOW
+#116|Gutter Skulker|U|VOW
+#117|Catapult Fodder|U|VOW
+#118|Hopeful Initiate|R|VOW
+#119|Patchwork Crawler|R|VOW
+#120|Edgar's Awakening|U|VOW
+#121|Gift of Fangs|C|VOW
+#122|Mindleech Ghoul|C|VOW
+#123|Gryffwing Cavalry|U|VOW
+#124|Screaming Swarm|U|VOW
+#125|Bloodcrazed Socialite|C|VOW
+#126|Courier Bat|C|VOW
+#127|Hungry Ridgewolf|C|VOW
+#128|Flourishing Hunter|C|VOW
+#129|Drogskol Infantry|C|VOW
+#130|Restless Bloodseeker|U|VOW
+#131|Lambholt Raconteur|U|VOW
+#132|Hookhand Mariner|C|VOW
+#133|Fierce Retribution|C|VOW
+#134|Gryff Rider|C|VOW
+#135|Parish-Blade Trainee|C|VOW
+#136|Dreadlight Monstrosity|C|VOW
+#137|Inspired Idea|R|VOW
+#138|Repository Skaab|C|VOW
+#139|Dying to Serve|R|VOW
+#140|Wedding Security|U|VOW
+#141|Lacerate Flesh|C|VOW
+#142|Markov Retribution|U|VOW
+#143|Cloaked Cadet|U|VOW
+#144|Howling Moon|R|VOW
+#145|Rural Recruit|C|VOW
+#146|Deathcap Glade|R|VOW
+#147|Dreamroot Cascade|R|VOW
+#148|Shattered Sanctum|R|VOW
+#149|Stormcarved Coast|R|VOW
+#150|Sundown Pass|R|VOW
+#151|Voldaren Estate|R|VOW
+#152|Heron of Hope|C|VOW
+#153|Cobbled Lancer|U|VOW
+#154|Into the Night|U|VOW
+#155|Kessig Flamebreather|C|VOW
+#156|Dawnhart Disciple|C|VOW
+#157|Moldgraf Millipede|C|VOW
+#158|Mulch|C|VOW
+#159|Kindly Ancestor|C|VOW
+#160|Mischievous Catgeist|U|VOW
+#161|Infestation Expert|U|VOW
+#162|Oakshade Stalker|U|VOW
+#163|Foreboding Statue|U|VOW
+#164|Ragged Recluse|C|VOW
+#165|Binding Geist|C|VOW
+#166|Ollenbock Escort|U|VOW
+#167|Piercing Light|C|VOW
+#168|Geistlight Snare|U|VOW
+#169|Stitched Assistant|C|VOW
+#170|Syncopate|C|VOW
+#171|Doomed Dissenter|C|VOW
+#172|Grisly Ritual|C|VOW
+#173|Spore Crawler|C|VOW
+#174|Winged Portent|R|VOW
+#175|Wretched Throng|C|VOW
+#176|Honeymoon Hearse|U|VOW
+#177|Sanguine Statuette|U|VOW
+#178|Biolume Egg|U|VOW
+#179|Bloodsworn Squire|U|VOW
+#180|Fearful Villager|C|VOW
+#181|Runo Stromkirk|R|VOW
+#182|Desperate Farmer|C|VOW
+#183|Bride's Gown|U|VOW
+#184|Dawnhart Geist|U|VOW
+#185|Estwald Shieldbasher|C|VOW
+#186|Heron-Blessed Geist|C|VOW
+#187|Traveling Minister|C|VOW
+#188|Vampire Slayer|C|VOW
+#189|Alchemist's Retrieval|C|VOW
+#190|Cruel Witness|C|VOW
+#191|Fear of Death|C|VOW
+#192|Steelclad Spirit|C|VOW
+#193|Wanderlight Spirit|C|VOW
+#194|Diregraf Scavenger|C|VOW
+#195|Gluttonous Guest|C|VOW
+#196|Blood Petal Celebrant|C|VOW
+#197|Daybreak Combatants|C|VOW
+#198|Lightning Wolf|C|VOW
+#199|Cultivator Colossus|M|VOW
+#200|Massive Might|C|VOW
+#201|Sporeback Wolf|C|VOW
+#202|Wash Away|U|VOW
+#203|Skulking Killer|U|VOW
+#204|Belligerent Guest|C|VOW
+#205|Crawling Infestation|U|VOW
+#206|Evolving Wilds|C|VOW
+#207|Lantern Bearer|C|VOW
+#208|Innocent Traveler|U|VOW
+#209|Weary Prisoner|C|VOW
+#210|Soulcipher Board|U|VOW
+#211|Adamant Will|C|VOW
+#212|Arm the Cathars|U|VOW
+#213|Nebelgast Beguiler|C|VOW
+#214|Nurturing Presence|C|VOW
+#215|Chill of the Grave|C|VOW
+#216|Cradle of Safety|C|VOW
+#217|Selhoff Entomber|C|VOW
+#218|Skywarp Skaab|C|VOW
+#219|Syphon Essence|C|VOW
+#220|Persistent Specimen|C|VOW
+#221|Rot-Tide Gargantua|C|VOW
+#222|Falkenrath Celebrants|C|VOW
+#223|Frenzied Devils|U|VOW
+#224|Pyre Spawn|C|VOW
+#225|Sure Strike|C|VOW
+#226|Laid to Rest|U|VOW
+#227|Nature's Embrace|C|VOW
+#228|Retrieve|U|VOW
+#229|Toxic Scorpion|C|VOW
+#230|Honored Heirloom|C|VOW
+#231|Militia Rallier|C|VOW
+#232|Reckless Impulse|C|VOW
+#233|Cartographer's Survey|U|VOW
+#234|Supernatural Rescue|C|VOW
+#235|Unholy Officiant|C|VOW
+#236|Consuming Tide|R|VOW
+#237|Blood Fountain|C|VOW
+#238|Groom's Finery|U|VOW
+#239|Pointed Discussion|C|VOW
+#240|Voldaren Epicure|C|VOW
+#241|Snarling Wolf|C|VOW
+#242|Witch's Web|C|VOW
+#243|Ceremonial Knife|C|VOW
+#244|Lantern of the Lost|U|VOW
+#245|Wedding Invitation|C|VOW
+#246|Witness the Future|U|VOW
+#247|Alchemist's Gambit|R|VOW
+#248|Boarded Window|U|VOW
+#249|Radiant Grace|U|VOW
+#250|Hallowed Haunting|M|VOW
+#251|Aim for the Head|C|VOW
+#252|Demonic Bargain|R|VOW
+#253|Undying Malice|C|VOW
+#254|Ancestral Anger|C|VOW
+#255|Bloody Betrayal|C|VOW
+#256|Change of Fortune|R|VOW
+#257|End the Festivities|C|VOW
+#258|Bramble Armor|C|VOW
+#259|Sheltering Boughs|C|VOW
+#260|Blood Servitor|C|VOW
+#261|Unhallowed Phalanx|C|VOW
+#262|Serpentine Ambush|C|VOW
+#263|Dread Fugue|U|VOW
+#264|Crushing Canopy|C|VOW
+#265|Sanctify|C|VOW
+#266|Splendid Reclamation|R|VOW
+#267|Vampire's Kiss|C|VOW
+//Rank|Name|Rarity|Set
+#1|Liesa, Forgotten Archangel|R|MID
+#2|Sigarda, Champion of Light|M|MID
+#3|Wrenn and Seven|M|MID
+#4|Arlinn, the Pack's Hope|M|MID
+#5|Tainted Adversary|M|MID
+#6|Tovolar's Huntmaster|R|MID
+#7|Consuming Blob|M|MID
+#8|Intrepid Adversary|M|MID
+#9|Florian, Voldaren Scion|R|MID
+#10|Spectral Adversary|M|MID
+#11|Tovolar, Dire Overlord|R|MID
+#12|Enduring Angel|M|MID
+#13|Primal Adversary|M|MID
+#14|Lord of the Forsaken|M|MID
+#15|Teferi, Who Slows the Sunset|M|MID
+#16|Moonveil Regent|M|MID
+#17|Gisa, Glorious Resurrector|R|MID
+#18|Jerren, Corrupted Bishop|M|MID
+#19|Dennick, Pious Apprentice|R|MID
+#20|Slogurk, the Overslime|R|MID
+#21|Suspicious Stowaway|R|MID
+#22|Brutal Cathar|R|MID
+#23|Katilda, Dawnhart Prime|R|MID
+#24|Augur of Autumn|R|MID
+#25|Bloodline Culling|R|MID
+#26|Sungold Sentinel|R|MID
+#27|Jadar, Ghoulcaller of Nephalia|R|MID
+#28|Ludevic, Necrogenius|R|MID
+#29|Reckless Stormseeker|R|MID
+#30|Bloodthirsty Adversary|M|MID
+#31|Sunstreak Phoenix|M|MID
+#32|Mask of Griselbrand|R|MID
+#33|Lier, Disciple of the Drowned|M|MID
+#34|Briarbridge Tracker|R|MID
+#35|Poppet Stitcher|M|MID
+#36|The Meathook Massacre|M|MID
+#37|Vadrik, Astral Archmage|R|MID
+#38|Grafted Identity|R|MID
+#39|Triskaidekaphile|R|MID
+#40|Smoldering Egg|R|MID
+#41|Borrowed Time|U|MID
+#42|Saryth, the Viper's Fang|R|MID
+#43|Infernal Grasp|U|MID
+#44|Adeline, Resplendent Cathar|R|MID
+#45|Light Up the Night|R|MID
+#46|Hostile Hostel|M|MID
+#47|Graveyard Trespasser|R|MID
+#48|Cathartic Pyre|U|MID
+#49|Fateful Absence|R|MID
+#50|Willow Geist|R|MID
+#51|Clear Shot|U|MID
+#52|Burn Down the House|R|MID
+#53|Rem Karolus, Stalwart Slayer|R|MID
+#54|Wake to Slaughter|R|MID
+#55|Old Stickfingers|R|MID
+#56|Hound Tamer|U|MID
+#57|Rootcoil Creeper|U|MID
+#58|Moonrager's Slash|C|MID
+#59|Sunrise Cavalier|U|MID
+#60|Vanquish the Horde|R|MID
+#61|Gavony Dawnguard|U|MID
+#62|Sludge Monster|R|MID
+#63|Foul Play|U|MID
+#64|Overwhelmed Archivist|U|MID
+#65|Kessig Naturalist|U|MID
+#66|Devoted Grafkeeper|U|MID
+#67|Heirloom Mirror|U|MID
+#68|Morbid Opportunist|U|MID
+#69|Seize the Storm|U|MID
+#70|Dawnhart Mentor|U|MID
+#71|Vampire Socialite|U|MID
+#72|Unnatural Growth|R|MID
+#73|Diregraf Rebirth|U|MID
+#74|Defenestrate|C|MID
+#75|Join the Dance|U|MID
+#76|Play with Fire|U|MID
+#77|Patrician Geist|R|MID
+#78|Cathar's Call|U|MID
+#79|Memory Deluge|R|MID
+#80|Eaten Alive|C|MID
+#81|Rite of Oblivion|U|MID
+#82|Unnatural Moonrise|U|MID
+#83|Duel for Dominance|C|MID
+#84|Hungry for More|U|MID
+#85|Falkenrath Pit Fighter|R|MID
+#86|Fleshtaker|U|MID
+#87|Ghoulcaller's Harvest|R|MID
+#88|Dawnhart Wardens|U|MID
+#89|Geistflame Reservoir|R|MID
+#90|Bereaved Survivor|U|MID
+#91|Burly Breaker|U|MID
+#92|Covert Cutpurse|U|MID
+#93|Curse of Leeches|R|MID
+#94|Phantom Carriage|U|MID
+#95|Winterthorn Blessing|U|MID
+#96|Sacred Fire|U|MID
+#97|Bladestitched Skaab|U|MID
+#98|Ghoulish Procession|U|MID
+#99|Voldaren Ambusher|U|MID
+#100|Galvanic Iteration|R|MID
+#101|Ambitious Farmhand|U|MID
+#102|Spellrune Painter|U|MID
+#103|Chaplain of Alms|U|MID
+#104|Flame Channeler|U|MID
+#105|Burn the Accursed|C|MID
+#106|Shadowbeast Sighting|C|MID
+#107|Dreadhound|U|MID
+#108|Angelfire Ignition|R|MID
+#109|Hallowed Respite|R|MID
+#110|Obsessive Astronomer|U|MID
+#111|Organ Hoarder|C|MID
+#112|Slaughter Specialist|R|MID
+#113|Dryad's Revival|U|MID
+#114|Arcane Infusion|U|MID
+#115|Immolation|C|MID
+#116|Defend the Celestus|U|MID
+#117|Candletrap|C|MID
+#118|Ominous Roost|U|MID
+#119|Thermo-Alchemist|U|MID
+#120|Contortionist Troupe|U|MID
+#121|Outland Liberator|U|MID
+#122|Deathbonnet Sprout|U|MID
+#123|Malevolent Hermit|R|MID
+#124|Mysterious Tome|U|MID
+#125|Can't Stay Away|R|MID
+#126|Rise of the Ants|U|MID
+#127|Nebelgast Intruder|U|MID
+#128|Storm Skreelix|U|MID
+#129|Stromkirk Bloodthief|U|MID
+#130|Skaab Wrangler|U|MID
+#131|Odric's Outrider|U|MID
+#132|Brood Weaver|U|MID
+#133|Loyal Gryff|U|MID
+#134|The Celestus|R|MID
+#135|Faithful Mending|U|MID
+#136|Locked in the Cemetery|C|MID
+#137|Champion of the Perished|R|MID
+#138|Festival Crasher|C|MID
+#139|Baneblade Scoundrel|U|MID
+#140|Fangblade Brigand|U|MID
+#141|Grizzly Ghoul|U|MID
+#142|Sigarda's Splendor|R|MID
+#143|Duelcraft Trainer|U|MID
+#144|Search Party Captain|C|MID
+#145|Unblinking Observer|C|MID
+#146|Olivia's Midnight Ambush|C|MID
+#147|Ardent Elementalist|C|MID
+#148|Firmament Sage|U|MID
+#149|Bloodtithe Collector|U|MID
+#150|Siphon Insight|R|MID
+#151|Curse of Surveillance|R|MID
+#152|Falkenrath Perforator|C|MID
+#153|Lunar Frenzy|U|MID
+#154|Croaking Counterpart|R|MID
+#155|Corpse Cobble|U|MID
+#156|Galedrifter|C|MID
+#157|Vengeful Strangler|U|MID
+#158|Covetous Castaway|U|MID
+#159|Cathar Commando|C|MID
+#160|Clarion Cathars|C|MID
+#161|Gavony Silversmith|C|MID
+#162|Homestead Courage|C|MID
+#163|Geistwave|C|MID
+#164|Vampire Interloper|C|MID
+#165|Timberland Guide|C|MID
+#166|Evolving Wilds|C|MID
+#167|Fading Hope|U|MID
+#168|Storm the Festival|R|MID
+#169|Sunset Revelry|U|MID
+#170|Purifying Dragon|U|MID
+#171|Candlegrove Witch|C|MID
+#172|Dawnhart Rejuvenator|C|MID
+#173|Rite of Harmony|R|MID
+#174|Delver of Secrets|U|MID
+#175|Mourning Patrol|C|MID
+#176|Shady Traveler|C|MID
+#177|Harvesttide Infiltrator|C|MID
+#178|Tireless Hauler|C|MID
+#179|Mystic Skull|U|MID
+#180|Bird Admirer|C|MID
+#181|Beloved Beggar|U|MID
+#182|Village Watch|U|MID
+#183|Ritual of Hope|U|MID
+#184|Gavony Trapper|C|MID
+#185|Falcon Abomination|C|MID
+#186|Revenge of the Drowned|C|MID
+#187|Bat Whisperer|C|MID
+#188|Morkrut Behemoth|C|MID
+#189|Lambholt Harrier|C|MID
+#190|Harvesttide Sentry|C|MID
+#191|Silver Bolt|C|MID
+#192|Vivisection|U|MID
+#193|Startle|C|MID
+#194|Hobbling Zombie|C|MID
+#195|Dissipate|U|MID
+#196|Celestus Sanctifier|C|MID
+#197|Sungold Barrage|C|MID
+#198|Haunted Ridge|R|MID
+#199|Shipwreck Marsh|R|MID
+#200|Rockfall Vale|R|MID
+#201|Overgrown Farmland|R|MID
+#202|Deserted Beach|R|MID
+#203|Arrogant Outlaw|C|MID
+#204|Brimstone Vandal|C|MID
+#205|Famished Foragers|C|MID
+#206|Siege Zombie|C|MID
+#207|Unruly Mob|C|MID
+#208|Pestilent Wolf|C|MID
+#209|Snarling Wolf|C|MID
+#210|Lunarch Veteran|C|MID
+#211|Tavern Ruffian|C|MID
+#212|Baithook Angler|C|MID
+#213|Soul-Guide Gryff|C|MID
+#214|Component Collector|C|MID
+#215|Drownyard Amalgam|C|MID
+#216|Flip the Switch|C|MID
+#217|Shipwreck Sifters|C|MID
+#218|Blood Pact|C|MID
+#219|Crawl from the Cellar|C|MID
+#220|Novice Occultist|C|MID
+#221|Electric Revelation|C|MID
+#222|Mounted Dreadknight|C|MID
+#223|Raze the Effigy|C|MID
+#224|Bounding Wolf|C|MID
+#225|Bramble Armor|C|MID
+#226|Eccentric Farmer|C|MID
+#227|Path to the Festival|C|MID
+#228|Tapping at the Window|C|MID
+#229|Crossroads Candleguide|C|MID
+#230|Jack-o'-Lantern|C|MID
+#231|Diregraf Horde|C|MID
+#232|Stuffed Bear|C|MID
+#233|Turn the Earth|U|MID
+#234|Ritual Guardian|C|MID
+#235|Candlelit Cavalry|C|MID
+#236|Secrets of the Key|C|MID
+#237|Stormrider Spirit|C|MID
+#238|Howl of the Hunt|C|MID
+#239|Ecstatic Awakener|C|MID
+#240|Blessed Defiance|C|MID
+#241|No Way Out|C|MID
+#242|Abandon the Post|C|MID
+#243|Stolen Vitality|C|MID
+#244|Voldaren Stinger|C|MID
+#245|Return to Nature|C|MID
+#246|Bladebrand|C|MID
+#247|Moonsilver Key|U|MID
+#248|Larder Zombie|C|MID
+#249|Hedgewitch's Mask|C|MID
+#250|Might of the Old Ways|C|MID
+#251|Consider|C|MID
+#252|Dire-Strain Rampage|R|MID
+#253|Necrosynthesis|U|MID
+#254|Flare of Faith|C|MID
+#255|Devious Cover-Up|C|MID
+#256|Rotten Reunion|C|MID
+#257|Neonate's Rush|C|MID
+#258|Pack's Betrayal|C|MID
+#259|Sigardian Savior|M|MID
+#260|Thraben Exorcism|C|MID
+#261|Otherworldly Gaze|C|MID
+#262|Duress|C|MID
+#263|Plummet|C|MID
+#264|Curse of Shaken Faith|R|MID
+#265|Field of Ruin|U|MID
+#266|Curse of Silence|R|MID
+#267|Pithing Needle|R|MID
+//Rank|Name|Rarity|Set
#1|Iymrith, Desert Doom|M|AFR
#2|Lolth, Spider Queen|M|AFR
#3|Mordenkainen|M|AFR
@@ -585,18 +1121,18 @@
#19|Mila, Crafty Companion|M|STX
#20|Gnarled Professor|R|STX
#21|Plargg, Dean of Chaos|R|STX
-#22|Primal Command|M|STX
-#23|Day of Judgment|M|STX
+#22|Primal Command|M|STA
+#23|Day of Judgment|M|STA
#24|Closing Statement|U|STX
#25|Baleful Mastery|R|STX
#26|Valentin, Dean of the Vein|R|STX
#27|Flamescroll Celebrant|R|STX
-#28|Swords to Plowshares|R|STX
+#28|Swords to Plowshares|R|STA
#29|Blade Historian|R|STX
#30|Prismari Command|R|STX
#31|Kasmina, Enigma Sage|M|STX
-#32|Lightning Bolt|C|STX
-#33|Demonic Tutor|M|STX
+#32|Lightning Bolt|C|STA
+#33|Demonic Tutor|M|STA
#34|Mortality Spear|U|STX
#35|Blex, Vexing Pest|M|STX
#36|Retriever Phoenix|R|STX
@@ -605,7 +1141,7 @@
#39|Lorehold Command|R|STX
#40|Quandrix Command|R|STX
#41|Dragonsguard Elite|R|STX
-#42|Doom Blade|R|STX
+#42|Doom Blade|R|STA
#43|Selfless Glyphweaver|R|STX
#44|Igneous Inspiration|U|STX
#45|Conspiracy Theorist|R|STX
@@ -616,28 +1152,28 @@
#50|Dream Strix|R|STX
#51|Magma Opus|M|STX
#52|Illuminate History|R|STX
-#53|Putrefy|R|STX
-#54|Lightning Helix|R|STX
-#55|Time Warp|M|STX
+#53|Putrefy|R|STA
+#54|Lightning Helix|R|STA
+#55|Time Warp|M|STA
#56|Devastating Mastery|R|STX
#57|Tempted by the Oriq|R|STX
#58|Flunk|U|STX
#59|Manifestation Sage|R|STX
#60|Leonin Lightscribe|R|STX
#61|Elite Spellbinder|R|STX
-#62|Mizzix's Mastery|M|STX
-#63|Crux of Fate|M|STX
+#62|Mizzix's Mastery|M|STA
+#63|Crux of Fate|M|STA
#64|Rip Apart|U|STX
#65|Poet's Quill|R|STX
#66|Pestilent Cauldron|R|STX
#67|Dramatic Finale|R|STX
-#68|Regrowth|R|STX
-#69|Electrolyze|R|STX
+#68|Regrowth|R|STA
+#69|Electrolyze|R|STA
#70|Callous Bloodmage|R|STX
#71|Codie, Vociferous Codex|R|STX
#72|Teachings of the Archaics|R|STX
-#73|Harmonize|R|STX
-#74|Blue Sun's Zenith|M|STX
+#73|Harmonize|R|STA
+#74|Blue Sun's Zenith|M|STA
#75|Mage Hunters' Onslaught||STX
#76|Daemogoth Woe-Eater|U|STX
#77|Devouring Tendrils|U|STX
@@ -649,7 +1185,7 @@
#83|Master Symmetrist|U|STX
#84|Heated Debate|C|STX
#85|Professor of Symbology|U|STX
-#86|Despark|R|STX
+#86|Despark|R|STA
#87|Dina, Soul Steeper|U|STX
#88|Daemogoth Titan|R|STX
#89|Body of Research|M|STX
@@ -659,10 +1195,10 @@
#93|Frost Trickster|C|STX
#94|Radiant Scrollwielder|R|STX
#95|Archmage Emeritus|R|STX
-#96|Shock|U|STX
-#97|Inquisition of Kozilek|R|STX
-#98|Counterspell|R|STX
-#99|Approach of the Second Sun|M|STX
+#96|Shock|U|STA
+#97|Inquisition of Kozilek|R|STA
+#98|Counterspell|R|STA
+#99|Approach of the Second Sun|M|STA
#100|Oriq Loremage|R|STX
#101|Bayou Groff|C|STX
#102|Bookwurm|U|STX
@@ -671,9 +1207,9 @@
#105|Biomathematician|C|STX
#106|Quandrix Apprentice|U|STX
#107|Basic Conjuration|R|STX
-#108|Eliminate|U|STX
-#109|Urza's Rage|R|STX
-#110|Compulsive Research|R|STX
+#108|Eliminate|U|STA
+#109|Urza's Rage|R|STA
+#110|Compulsive Research|R|STA
#111|Divide by Zero|U|STX
#112|Culling Ritual|R|STX
#113|Professor of Zoomancy|C|STX
@@ -687,8 +1223,8 @@
#121|Efreet Flamepainter|R|STX
#122|Prismari Apprentice|U|STX
#123|Spirit Summoning|C|STX
-#124|Agonizing Remorse|U|STX
-#125|Gift of Estates|R|STX
+#124|Agonizing Remorse|U|STA
+#125|Gift of Estates|R|STA
#126|Ingenious Mastery|R|STX
#127|Mage Duel|C|STX
#128|Jadzi, Oracle of Arcavios|M|STX
@@ -716,10 +1252,10 @@
#150|Silverquill Apprentice|U|STX
#151|Lorehold Apprentice|U|STX
#152|Storm-Kiln Artist|U|STX
-#153|Cultivate|U|STX
-#154|Growth Spiral|R|STX
-#155|Natural Order|M|STX
-#156|Increasing Vengeance|M|STX
+#153|Cultivate|U|STA
+#154|Growth Spiral|R|STA
+#155|Natural Order|M|STA
+#156|Increasing Vengeance|M|STA
#157|Wormhole Serpent|U|STX
#158|Lash of Malice|C|STX
#159|Tend the Pests|U|STX
@@ -739,13 +1275,13 @@
#173|Karok Wrangler|U|STX
#174|Reduce to Memory|U|STX
#175|Dueling Coach|U|STX
-#176|Divine Gambit|U|STX
-#177|Grapeshot|R|STX
-#178|Sign in Blood|R|STX
-#179|Dark Ritual|R|STX
-#180|Memory Lapse|R|STX
-#181|Ephemerate|R|STX
-#182|Mind's Desire|M|STX
+#176|Divine Gambit|U|STA
+#177|Grapeshot|R|STA
+#178|Sign in Blood|R|STA
+#179|Dark Ritual|R|STA
+#180|Memory Lapse|R|STA
+#181|Ephemerate|R|STA
+#182|Mind's Desire|M|STA
#183|Semester's End|R|STX
#184|Reckless Amplimancer|C|STX
#185|Reject|C|STX
@@ -773,13 +1309,13 @@
#207|Elemental Summoning|C|STX
#208|Inkling Summoning|C|STX
#209|Pest Summoning|C|STX
-#210|Snakeskin Veil|U|STX
-#211|Thrill of Possibility|U|STX
-#212|Whirlwind Denial|U|STX
-#213|Faithless Looting|R|STX
-#214|Tezzeret's Gambit|R|STX
-#215|Mana Tithe|R|STX
-#216|Tainted Pact|M|STX
+#210|Snakeskin Veil|U|STA
+#211|Thrill of Possibility|U|STA
+#212|Whirlwind Denial|U|STA
+#213|Faithless Looting|R|STA
+#214|Tezzeret's Gambit|R|STA
+#215|Mana Tithe|R|STA
+#216|Tainted Pact|M|STA
#217|Rushed Rebirth|R|STX
#218|Snow Day|U|STX
#219|Stonerise Spirit|C|STX
@@ -830,14 +1366,14 @@
#264|Introduction to Prophecy|C|STX
#265|Environmental Sciences|C|STX
#266|Academic Probation|R|STX
-#267|Infuriate|U|STX
-#268|Village Rites|U|STX
-#269|Abundant Harvest|R|STX
-#270|Stone Rain|R|STX
-#271|Brainstorm|R|STX
-#272|Gods Willing|R|STX
-#273|Channel|M|STX
-#274|Teferi's Protection|M|STX
+#267|Infuriate|U|STA
+#268|Village Rites|U|STA
+#269|Abundant Harvest|R|STA
+#270|Stone Rain|R|STA
+#271|Brainstorm|R|STA
+#272|Gods Willing|R|STA
+#273|Channel|M|STA
+#274|Teferi's Protection|M|STA
#275|Specter of the Fens|C|STX
#276|Vortex Runner|C|STX
#277|Spell Satchel|U|STX
@@ -860,9 +1396,9 @@
#294|Study Break|C|STX
#295|Go Blank|U|STX
#296|Beaming Defiance|C|STX
-#297|Adventurous Impulse|U|STX
-#298|Claim the Firstborn|U|STX
-#299|Chaos Warp|M|STX
+#297|Adventurous Impulse|U|STA
+#298|Claim the Firstborn|U|STA
+#299|Chaos Warp|M|STA
#300|Guiding Voice|C|STX
#301|Biblioplex Assistant|C|STX
#302|Spined Karok|C|STX
@@ -880,11 +1416,11 @@
#314|Curate|C|STX
#315|Campus Guide|C|STX
#316|Ageless Guardian|C|STX
-#317|Duress|U|STX
-#318|Strategic Planning|U|STX
-#319|Opt|U|STX
-#320|Defiant Strike|U|STX
-#321|Tendrils of Agony|R|STX
+#317|Duress|U|STA
+#318|Strategic Planning|U|STA
+#319|Opt|U|STA
+#320|Defiant Strike|U|STA
+#321|Tendrils of Agony|R|STA
#322|Fracture|U|STX
#323|Excavated Wall|C|STX
#324|Cogwork Archivist|C|STX
@@ -892,12 +1428,12 @@
#326|Square Up|C|STX
#327|Solve the Equation|U|STX
#328|Star Pupil|C|STX
-#329|Negate|U|STX
-#330|Revitalize|U|STX
-#331|Weather the Storm|R|STX
+#329|Negate|U|STA
+#330|Revitalize|U|STA
+#331|Weather the Storm|R|STA
#332|Tangletrap|C|STX
#333|Confront the Past|R|STX
-#334|Krosan Grip|R|STX
+#334|Krosan Grip|R|STA
#335|Mercurial Transformation|U|STX
#336|Dragon's Approach|C|STX
#337|Test of Talents|U|STX
@@ -33654,271 +34190,3 @@
#258|Gate to Phyrexia|U|ME4
#259|Tablet of Epityr|C|ME4
#260|Leeches|R|ME4
-//Rank|Name|Rarity|Set
-#1|Liesa, Forgotten Archangel|R|MID
-#2|Sigarda, Champion of Light|M|MID
-#3|Wrenn and Seven|M|MID
-#4|Arlinn, the Pack's Hope|M|MID
-#5|Tainted Adversary|M|MID
-#6|Tovolar's Huntmaster|R|MID
-#7|Consuming Blob|M|MID
-#8|Intrepid Adversary|M|MID
-#9|Florian, Voldaren Scion|R|MID
-#10|Spectral Adversary|M|MID
-#11|Tovolar, Dire Overlord|R|MID
-#12|Enduring Angel|M|MID
-#13|Primal Adversary|M|MID
-#14|Lord of the Forsaken|M|MID
-#15|Teferi, Who Slows the Sunset|M|MID
-#16|Moonveil Regent|M|MID
-#17|Gisa, Glorious Resurrector|R|MID
-#18|Jerren, Corrupted Bishop|M|MID
-#19|Dennick, Pious Apprentice|R|MID
-#20|Slogurk, the Overslime|R|MID
-#21|Suspicious Stowaway|R|MID
-#22|Brutal Cathar|R|MID
-#23|Katilda, Dawnhart Prime|R|MID
-#24|Augur of Autumn|R|MID
-#25|Bloodline Culling|R|MID
-#26|Sungold Sentinel|R|MID
-#27|Jadar, Ghoulcaller of Nephalia|R|MID
-#28|Ludevic, Necrogenius|R|MID
-#29|Reckless Stormseeker|R|MID
-#30|Bloodthirsty Adversary|M|MID
-#31|Sunstreak Phoenix|M|MID
-#32|Mask of Griselbrand|R|MID
-#33|Lier, Disciple of the Drowned|M|MID
-#34|Briarbridge Tracker|R|MID
-#35|Poppet Stitcher|M|MID
-#36|The Meathook Massacre|M|MID
-#37|Vadrik, Astral Archmage|R|MID
-#38|Grafted Identity|R|MID
-#39|Triskaidekaphile|R|MID
-#40|Smoldering Egg|R|MID
-#41|Borrowed Time|U|MID
-#42|Saryth, the Viper's Fang|R|MID
-#43|Infernal Grasp|U|MID
-#44|Adeline, Resplendent Cathar|R|MID
-#45|Light Up the Night|R|MID
-#46|Hostile Hostel|M|MID
-#47|Graveyard Trespasser|R|MID
-#48|Cathartic Pyre|U|MID
-#49|Fateful Absence|R|MID
-#50|Willow Geist|R|MID
-#51|Clear Shot|U|MID
-#52|Burn Down the House|R|MID
-#53|Rem Karolus, Stalwart Slayer|R|MID
-#54|Wake to Slaughter|R|MID
-#55|Old Stickfingers|R|MID
-#56|Hound Tamer|U|MID
-#57|Rootcoil Creeper|U|MID
-#58|Moonrager's Slash|C|MID
-#59|Sunrise Cavalier|U|MID
-#60|Vanquish the Horde|R|MID
-#61|Gavony Dawnguard|U|MID
-#62|Sludge Monster|R|MID
-#63|Foul Play|U|MID
-#64|Overwhelmed Archivist|U|MID
-#65|Kessig Naturalist|U|MID
-#66|Devoted Grafkeeper|U|MID
-#67|Heirloom Mirror|U|MID
-#68|Morbid Opportunist|U|MID
-#69|Seize the Storm|U|MID
-#70|Dawnhart Mentor|U|MID
-#71|Vampire Socialite|U|MID
-#72|Unnatural Growth|R|MID
-#73|Diregraf Rebirth|U|MID
-#74|Defenestrate|C|MID
-#75|Join the Dance|U|MID
-#76|Play with Fire|U|MID
-#77|Patrician Geist|R|MID
-#78|Cathar's Call|U|MID
-#79|Memory Deluge|R|MID
-#80|Eaten Alive|C|MID
-#81|Rite of Oblivion|U|MID
-#82|Unnatural Moonrise|U|MID
-#83|Duel for Dominance|C|MID
-#84|Hungry for More|U|MID
-#85|Falkenrath Pit Fighter|R|MID
-#86|Fleshtaker|U|MID
-#87|Ghoulcaller's Harvest|R|MID
-#88|Dawnhart Wardens|U|MID
-#89|Geistflame Reservoir|R|MID
-#90|Bereaved Survivor|U|MID
-#91|Burly Breaker|U|MID
-#92|Covert Cutpurse|U|MID
-#93|Curse of Leeches|R|MID
-#94|Phantom Carriage|U|MID
-#95|Winterthorn Blessing|U|MID
-#96|Sacred Fire|U|MID
-#97|Bladestitched Skaab|U|MID
-#98|Ghoulish Procession|U|MID
-#99|Voldaren Ambusher|U|MID
-#100|Galvanic Iteration|R|MID
-#101|Ambitious Farmhand|U|MID
-#102|Spellrune Painter|U|MID
-#103|Chaplain of Alms|U|MID
-#104|Flame Channeler|U|MID
-#105|Burn the Accursed|C|MID
-#106|Shadowbeast Sighting|C|MID
-#107|Dreadhound|U|MID
-#108|Angelfire Ignition|R|MID
-#109|Hallowed Respite|R|MID
-#110|Obsessive Astronomer|U|MID
-#111|Organ Hoarder|C|MID
-#112|Slaughter Specialist|R|MID
-#113|Dryad's Revival|U|MID
-#114|Arcane Infusion|U|MID
-#115|Immolation|C|MID
-#116|Defend the Celestus|U|MID
-#117|Candletrap|C|MID
-#118|Ominous Roost|U|MID
-#119|Thermo-Alchemist|U|MID
-#120|Contortionist Troupe|U|MID
-#121|Outland Liberator|U|MID
-#122|Deathbonnet Sprout|U|MID
-#123|Malevolent Hermit|R|MID
-#124|Mysterious Tome|U|MID
-#125|Can't Stay Away|R|MID
-#126|Rise of the Ants|U|MID
-#127|Nebelgast Intruder|U|MID
-#128|Storm Skreelix|U|MID
-#129|Stromkirk Bloodthief|U|MID
-#130|Skaab Wrangler|U|MID
-#131|Odric's Outrider|U|MID
-#132|Brood Weaver|U|MID
-#133|Loyal Gryff|U|MID
-#134|The Celestus|R|MID
-#135|Faithful Mending|U|MID
-#136|Locked in the Cemetery|C|MID
-#137|Champion of the Perished|R|MID
-#138|Festival Crasher|C|MID
-#139|Baneblade Scoundrel|U|MID
-#140|Fangblade Brigand|U|MID
-#141|Grizzly Ghoul|U|MID
-#142|Sigarda's Splendor|R|MID
-#143|Duelcraft Trainer|U|MID
-#144|Search Party Captain|C|MID
-#145|Unblinking Observer|C|MID
-#146|Olivia's Midnight Ambush|C|MID
-#147|Ardent Elementalist|C|MID
-#148|Firmament Sage|U|MID
-#149|Bloodtithe Collector|U|MID
-#150|Siphon Insight|R|MID
-#151|Curse of Surveillance|R|MID
-#152|Falkenrath Perforator|C|MID
-#153|Lunar Frenzy|U|MID
-#154|Croaking Counterpart|R|MID
-#155|Corpse Cobble|U|MID
-#156|Galedrifter|C|MID
-#157|Vengeful Strangler|U|MID
-#158|Covetous Castaway|U|MID
-#159|Cathar Commando|C|MID
-#160|Clarion Cathars|C|MID
-#161|Gavony Silversmith|C|MID
-#162|Homestead Courage|C|MID
-#163|Geistwave|C|MID
-#164|Vampire Interloper|C|MID
-#165|Timberland Guide|C|MID
-#166|Evolving Wilds|C|MID
-#167|Fading Hope|U|MID
-#168|Storm the Festival|R|MID
-#169|Sunset Revelry|U|MID
-#170|Purifying Dragon|U|MID
-#171|Candlegrove Witch|C|MID
-#172|Dawnhart Rejuvenator|C|MID
-#173|Rite of Harmony|R|MID
-#174|Delver of Secrets|U|MID
-#175|Mourning Patrol|C|MID
-#176|Shady Traveler|C|MID
-#177|Harvesttide Infiltrator|C|MID
-#178|Tireless Hauler|C|MID
-#179|Mystic Skull|U|MID
-#180|Bird Admirer|C|MID
-#181|Beloved Beggar|U|MID
-#182|Village Watch|U|MID
-#183|Ritual of Hope|U|MID
-#184|Gavony Trapper|C|MID
-#185|Falcon Abomination|C|MID
-#186|Revenge of the Drowned|C|MID
-#187|Bat Whisperer|C|MID
-#188|Morkrut Behemoth|C|MID
-#189|Lambholt Harrier|C|MID
-#190|Harvesttide Sentry|C|MID
-#191|Silver Bolt|C|MID
-#192|Vivisection|U|MID
-#193|Startle|C|MID
-#194|Hobbling Zombie|C|MID
-#195|Dissipate|U|MID
-#196|Celestus Sanctifier|C|MID
-#197|Sungold Barrage|C|MID
-#198|Haunted Ridge|R|MID
-#199|Shipwreck Marsh|R|MID
-#200|Rockfall Vale|R|MID
-#201|Overgrown Farmland|R|MID
-#202|Deserted Beach|R|MID
-#203|Arrogant Outlaw|C|MID
-#204|Brimstone Vandal|C|MID
-#205|Famished Foragers|C|MID
-#206|Siege Zombie|C|MID
-#207|Unruly Mob|C|MID
-#208|Pestilent Wolf|C|MID
-#209|Snarling Wolf|C|MID
-#210|Lunarch Veteran|C|MID
-#211|Tavern Ruffian|C|MID
-#212|Baithook Angler|C|MID
-#213|Soul-Guide Gryff|C|MID
-#214|Component Collector|C|MID
-#215|Drownyard Amalgam|C|MID
-#216|Flip the Switch|C|MID
-#217|Shipwreck Sifters|C|MID
-#218|Blood Pact|C|MID
-#219|Crawl from the Cellar|C|MID
-#220|Novice Occultist|C|MID
-#221|Electric Revelation|C|MID
-#222|Mounted Dreadknight|C|MID
-#223|Raze the Effigy|C|MID
-#224|Bounding Wolf|C|MID
-#225|Bramble Armor|C|MID
-#226|Eccentric Farmer|C|MID
-#227|Path to the Festival|C|MID
-#228|Tapping at the Window|C|MID
-#229|Crossroads Candleguide|C|MID
-#230|Jack-o'-Lantern|C|MID
-#231|Diregraf Horde|C|MID
-#232|Stuffed Bear|C|MID
-#233|Turn the Earth|U|MID
-#234|Ritual Guardian|C|MID
-#235|Candlelit Cavalry|C|MID
-#236|Secrets of the Key|C|MID
-#237|Stormrider Spirit|C|MID
-#238|Howl of the Hunt|C|MID
-#239|Ecstatic Awakener|C|MID
-#240|Blessed Defiance|C|MID
-#241|No Way Out|C|MID
-#242|Abandon the Post|C|MID
-#243|Stolen Vitality|C|MID
-#244|Voldaren Stinger|C|MID
-#245|Return to Nature|C|MID
-#246|Bladebrand|C|MID
-#247|Moonsilver Key|U|MID
-#248|Larder Zombie|C|MID
-#249|Hedgewitch's Mask|C|MID
-#250|Might of the Old Ways|C|MID
-#251|Consider|C|MID
-#252|Dire-Strain Rampage|R|MID
-#253|Necrosynthesis|U|MID
-#254|Flare of Faith|C|MID
-#255|Devious Cover-Up|C|MID
-#256|Rotten Reunion|C|MID
-#257|Neonate's Rush|C|MID
-#258|Pack's Betrayal|C|MID
-#259|Sigardian Savior|M|MID
-#260|Thraben Exorcism|C|MID
-#261|Otherworldly Gaze|C|MID
-#262|Duress|C|MID
-#263|Plummet|C|MID
-#264|Curse of Shaken Faith|R|MID
-#265|Field of Ruin|U|MID
-#266|Curse of Silence|R|MID
-#267|Pithing Needle|R|MID
diff --git a/forge-gui/res/editions/Innistrad Crimson Vow Commander.txt b/forge-gui/res/editions/Innistrad Crimson Vow Commander.txt
index 83c1bc6bc51..c2e921d2f2c 100644
--- a/forge-gui/res/editions/Innistrad Crimson Vow Commander.txt
+++ b/forge-gui/res/editions/Innistrad Crimson Vow Commander.txt
@@ -8,6 +8,34 @@ ScryfallCode=VOC
[cards]
1 M Millicent, Restless Revenant @Denman Rooke
2 M Strefan, Maurer Progenitor @Chris Rallis
+3 M Donal, Herald of Wings @Wayne Reynolds
+4 M Timothar, Baron of Bats @Jason A. Engle
+5 R Drogskol Reinforcements @Antonio José Manzanedo
+6 R Haunted Library @Justyna Gil
+7 R Priest of the Blessed Graf @Irina Nordsol
+8 R Rhoda, Geist Avenger @Randy Vargas
+9 R Storm of Souls @Liiga Smilshkalne
+10 R Sudden Salvation @Cristi Balanescu
+11 R Breath of the Sleepless @Robin Olausson
+12 R Ethereal Investigator @Sean Murray
+13 R Haunting Imitation @Liiga Smilshkalne
+14 R Occult Epiphany @Jason Rainville
+15 R Spectral Arcanist @Johan Grenier
+16 R Timin, Youthful Geist @Randy Vargas
+17 R Crossway Troublemakers @Aaron J. Riley
+18 R Glass-Cast Heart @Alayna Danner
+19 R Kamber, the Plunderer @Andrey Kuzinskiy
+20 R Olivia's Wrath @Nestor Ossandon Leal
+21 R Predators' Hour @Tomas Duchek
+22 R Shadowgrange Archfiend @Oleksandr Kozachenko
+23 R Arterial Alchemy @Caio Monteiro
+24 R Imposing Grandeur @Mila Pesic
+25 R Laurine, the Diversion @Andrey Kuzinskiy
+26 R Markov Enforcer @Wisnu Tan
+27 R Midnight Arsonist @Campbell White
+28 R Scion of Opulence @Chris Rallis
+29 R Disorder in the Court @Zoltan Boros
+30 R Sinister Waltz @Jason Rainville
31 R Breathkeeper Seraph @Alexander Mokhov
32 M Wedding Ring @Olena Richards
33 R Imperious Mindbreaker @Olivier Bernard
@@ -18,6 +46,34 @@ ScryfallCode=VOC
38 M Umbris, Fear Manifest @Daarken
39 M Millicent, Restless Revenant @Denman Rooke
40 M Strefan, Maurer Progenitor @Chris Rallis
+41 M Donal, Herald of Wings @Wayne Reynolds
+42 M Timothar, Baron of Bats @Jason A. Engle
+43 R Drogskol Reinforcements @Antonio José Manzanedo
+44 R Haunted Library @Justyna Gil
+45 R Priest of the Blessed Graf @Irina Nordsol
+46 R Rhoda, Geist Avenger @Randy Vargas
+47 R Storm of Souls @Liiga Smilshkalne
+48 R Sudden Salvation @Cristi Balanescu
+49 R Breath of the Sleepless @Robin Olausson
+50 R Ethereal Investigator @Sean Murray
+51 R Haunting Imitation @Liiga Smilshkalne
+52 R Occult Epiphany @Jason Rainville
+53 R Spectral Arcanist @Johan Grenier
+54 R Timin, Youthful Geist @Randy Vargas
+55 R Crossway Troublemakers @Aaron J. Riley
+56 R Glass-Cast Heart @Alayna Danner
+57 R Kamber, the Plunderer @Andrey Kuzinskiy
+58 R Olivia's Wrath @Nestor Ossandon Leal
+59 R Predators' Hour @Tomas Duchek
+60 R Shadowgrange Archfiend @Oleksandr Kozachenko
+61 R Arterial Alchemy @Caio Monteiro
+62 R Imposing Grandeur @Mila Pesic
+63 R Laurine, the Diversion @Andrey Kuzinskiy
+64 R Markov Enforcer @Wisnu Tan
+65 R Midnight Arsonist @Campbell White
+66 R Scion of Opulence @Chris Rallis
+67 R Disorder in the Court @Zoltan Boros
+68 R Sinister Waltz @Jason Rainville
69 R Breathkeeper Seraph @Alexander Mokhov
70 M Wedding Ring @Olena Richards
71 R Imperious Mindbreaker @Olivier Bernard
@@ -26,3 +82,115 @@ ScryfallCode=VOC
74 R Hollowhenge Overlord @Milivoj Ćeran
75 R Thundering Mightmare @Lorenzo Mastroianni
76 M Umbris, Fear Manifest @Daarken
+77 R Angel of Flight Alabaster @Howard Lyon
+78 R Benevolent Offering @Ryan Yee
+79 R Boreas Charger @Christine Choi
+80 R Bygone Bishop @Jason A. Engle
+81 U Crush Contraband @Jason A. Engle
+82 R Custodi Soulbinders @Karla Ortiz
+83 C Custodi Squire @Alex Horley-Orlandelli
+84 U Darksteel Mutation @Daniel Ljunggren
+85 R Fell the Mighty @Raymond Swanland
+86 U Field of Souls @Richard Kane Ferguson
+87 U Ghostly Prison @Daarken
+88 R Hallowed Spiritkeeper @Steve Prescott
+89 R Hanged Executioner @Johann Bodin
+90 R Karmic Guide @Allen Williams
+91 R Kirtar's Wrath @Kev Walker
+92 R Knight of the White Orchid @Mark Zug
+93 R Mentor of the Meek @Jana Schirmer & Johannes Voss
+94 R Mirror Entity @Zoltan Boros & Gabor Szikszai
+95 R Oyobi, Who Split the Heavens @Christopher Moeller
+96 U Promise of Bunrei @Stephen Tappin
+97 R Remorseful Cleric @Grzegorz Rutkowski
+98 U Spectral Shepherd @Johann Bodin
+99 U Swords to Plowshares @Jesper Ejsing
+100 R Twilight Drover @Dave Allsop
+101 R Windborn Muse @Adam Rex
+102 C Arcane Denial @Xi Zhang
+103 C Distant Melody @Omar Rayyan
+104 R Flood of Tears @Adam Paquette
+105 R Ghostly Pilferer @Craig J Spearing
+106 R Imprisoned in the Moon @Ryan Alexander Lee
+107 R Kami of the Crescent Moon @Darrell Riche
+108 R Midnight Clock @Alexander Forssberg
+109 U Nebelgast Herald @Zezhou Chen
+110 R Rattlechains @Lius Lasahido
+111 U Reconnaissance Mission @Johannes Voss
+112 R Shacklegeist @Igor Kieryluk
+113 U Sire of the Storm @Arnie Swekel
+114 U Spectral Sailor @Cristi Balanescu
+115 R Supreme Phantom @Robbie Trevino
+116 R Verity Circle @Volkan Baǵa
+117 U Ancient Craving @Rob Alexander
+118 R Anowon, the Ruin Sage @Dan Scott
+119 U Blood Artist @Johannes Voss
+120 U Bloodline Necromancer @Joe Slucher
+121 M Bloodlord of Vaasgoth @Greg Staples
+122 R Bloodtracker @Magali Villeneuve
+123 R Butcher of Malakir @Jason Chan
+124 R Champion of Dusk @Josh Hass
+125 R Cordial Vampire @Winona Nelson
+126 R Damnable Pact @Zack Stella
+127 R Dark Impostor @Johannes Voss
+128 U Falkenrath Noble @Slawomir Maniak
+129 C Feed the Swarm @Andrey Kuzinskiy
+130 U Indulgent Aristocrat @Anna Steinbauer
+131 R Malakir Bloodwitch @Shelly Wan
+132 M Necropolis Regent @Winona Nelson
+133 C Night's Whisper @John Severin Brassell
+134 M Nirkana Revenant @Livia Prima
+135 R Patron of the Vein @Tommy Arnold
+136 R Sanctum Seeker @Volkan Baǵa
+137 R Stromkirk Condemned @Magali Villeneuve
+138 R Underworld Connections @Yeong-Hao Han
+139 U Urge to Feed @Johann Bodin
+140 U Vampire Nighthawk @Jason Chan
+141 R Anje's Ravager @Antonio José Manzanedo
+142 R Avacyn's Judgment @Victor Adame Minguez
+143 R Blasphemous Act @Daarken
+144 R Bloodsworn Steward @Daarken
+145 R Crimson Honor Guard @Kieran Yanner
+146 R Falkenrath Gorger @Anna Steinbauer
+147 R Mob Rule @Jakub Kasper
+148 R Molten Echoes @Zoltan Boros
+149 U Rakish Heir @Winona Nelson
+150 U Stensia Masquerade @Willian Murai
+151 R Stromkirk Occultist @Magali Villeneuve
+152 U Vandalblast @Seb McKinnon
+153 M Dovin, Grand Arbiter @Kieran Yanner
+154 U Drogskol Captain @Cristi Balanescu
+155 M Geist of Saint Traft @Igor Kieryluk
+156 U Rakdos Charm @Zoltan Boros
+157 U Stromkirk Captain @Jana Schirmer & Johannes Voss
+158 R Vampiric Dragon @Gary Ruddell
+159 C Arcane Signet @Dan Scott
+160 C Azorius Locket @Craig J Spearing
+161 U Azorius Signet @Raoul Vitale
+162 C Charcoal Diamond @Lindsey Look
+163 C Commander's Sphere @Ryan Alexander Lee
+164 C Fire Diamond @Lindsey Look
+165 C Marble Diamond @Lindsey Look
+166 U Rakdos Signet @Martina Pilcerova
+167 C Sky Diamond @Lindsey Look
+168 U Sol Ring @Mike Bierek
+169 U Swiftfoot Boots @Svetlin Velinov
+170 U Unstable Obelisk @William Wu
+171 U Azorius Chancery @John Avon
+172 C Command Tower @Ryan Yee
+173 R Exotic Orchard @Steven Belledin
+174 R Foreboding Ruins @Adam Paquette
+175 R Moorland Haunt @James Paick
+176 U Myriad Landscape @Richard Wright
+177 C Path of Ancestry @Alayna Danner
+178 R Port Town @Kamila Szutenberg
+179 R Prairie Stream @Adam Paquette
+180 U Rakdos Carnarium @John Avon
+181 R Shadowblood Ridge @Sam White
+182 R Skycloud Expanse @Sam White
+183 R Smoldering Marsh @Adam Paquette
+184 U Tainted Peak @Tony Szczudlo
+185 R Temple of Enlightenment @Piotr Dura
+186 R Temple of Malice @Jonas De Ro
+187 U Temple of the False God @James Zapata
+188 U Unclaimed Territory @Dimitar Marinski
diff --git a/forge-gui/res/editions/Innistrad Crimson Vow.txt b/forge-gui/res/editions/Innistrad Crimson Vow.txt
index baf9273a9ba..e2bcebd439a 100644
--- a/forge-gui/res/editions/Innistrad Crimson Vow.txt
+++ b/forge-gui/res/editions/Innistrad Crimson Vow.txt
@@ -6,6 +6,8 @@ Code2=VOW
MciCode=vow
Type=Expansion
ScryfallCode=VOW
+Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand
+Prerelease=6 Boosters, 1 RareMythic+
[cards]
1 C Adamant Will @Irina Nordsol
@@ -415,6 +417,11 @@ ScryfallCode=VOW
405 U Geistlight Snare @Anato Finnstark
406 U Fell Stinger @Lars Grant-West
407 R Dominating Vampire @PINDURSKI
+408 L Plains @Daria Khlebnikova
+409 L Island @Rio Krisma
+410 L Swamp @Kerby Rosanes
+411 L Mountain @Daria Khlebnikova
+412 L Forest @Pig Hands
[tokens]
b_1_1_slug
diff --git a/forge-gui/res/editions/MagicFest 2021.txt b/forge-gui/res/editions/MagicFest 2021.txt
new file mode 100644
index 00000000000..024da84e129
--- /dev/null
+++ b/forge-gui/res/editions/MagicFest 2021.txt
@@ -0,0 +1,9 @@
+[metadata]
+Code=PF21
+Date=2021-01-01
+Name=MagicFest 2021
+Type=Promo
+ScryfallCode=PF21
+
+[cards]
+1 R Path of Ancestry @Andreas Rocha
diff --git a/forge-gui/res/editions/Year of the Ox 2021.txt b/forge-gui/res/editions/Year of the Ox 2021.txt
index 4398a11c1df..6e14d93d571 100644
--- a/forge-gui/res/editions/Year of the Ox 2021.txt
+++ b/forge-gui/res/editions/Year of the Ox 2021.txt
@@ -10,6 +10,7 @@ ScryfallCode=PL21
1★ R Sethron, Hurloon General @Fiona Hsieh
2 M Ox of Agonas @Lie Setiawan
3★ M Angrath, the Flame-Chained @Song Qijin
+4 R Tahngarth, First Mate @Song Qijin
[tokens]
r_2_3_minotaur
diff --git a/forge-gui/res/formats/Casual/Brawl.txt b/forge-gui/res/formats/Casual/Brawl.txt
index 2ed6ec4b173..25d6a0eba28 100644
--- a/forge-gui/res/formats/Casual/Brawl.txt
+++ b/forge-gui/res/formats/Casual/Brawl.txt
@@ -3,5 +3,5 @@ Name:Brawl
Order:101
Type:Casual
Subtype:Commander
-Sets:ZNR, KHM, STX, AFR, MID
+Sets:ZNR, KHM, STX, AFR, MID, VOW
Banned:Omnath, Locus of Creation; Pithing Needle
diff --git a/forge-gui/res/formats/Sanctioned/Historic.txt b/forge-gui/res/formats/Sanctioned/Historic.txt
index 3ba296921f3..407bdd5e586 100644
--- a/forge-gui/res/formats/Sanctioned/Historic.txt
+++ b/forge-gui/res/formats/Sanctioned/Historic.txt
@@ -4,5 +4,5 @@ Type:Digital
Subtype:Arena
Effective:2019-11-21
Order:142
-Sets:XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, M20, ELD, HA1, THB, HA2, IKO, HA3, M21, JMP, AKR, ZNR, KLR, KHM, HA4, STX, STA, HA5, AFR, J21, MID
+Sets:XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, M20, ELD, HA1, THB, HA2, IKO, HA3, M21, JMP, AKR, ZNR, KLR, KHM, HA4, STX, STA, HA5, AFR, J21, MID, VOW
Banned:Agent of Treachery; Brainstorm; Channel; Counterspell; Dark Ritual; Demonic Tutor; Field of the Dead; Fires of Invention; Lightning Bolt; Natural Order; Nexus of Fate; Oko, Thief of Crowns; Omnath, Locus of Creation; Once Upon a Time; Swords to Plowshares; Teferi, Time Raveler; Thassa's Oracle; Tibalt's Trickery; Time Warp; Uro, Titan of Nature's Wrath; Veil of Summer; Wilderness Reclamation; Winota, Joiner of Forces
diff --git a/forge-gui/res/formats/Sanctioned/Legacy.txt b/forge-gui/res/formats/Sanctioned/Legacy.txt
index cb5c1c52a8a..252faccf7ae 100644
--- a/forge-gui/res/formats/Sanctioned/Legacy.txt
+++ b/forge-gui/res/formats/Sanctioned/Legacy.txt
@@ -3,5 +3,5 @@ Name:Legacy
Order:105
Subtype:Legacy
Type:Sanctioned
-Sets:7ED, 9ED, ORI, M14, M15, 6ED, 8ED, M11, 3ED, M10, M12, 10E, M13, G18, M21, M20, M19, 5ED, 2ED, 4ED, LEB, LEA, 5DN, SOM, KTK, THS, DIS, JOU, MOR, TMP, SOI, FEM, USG, ALL, ROE, EXO, TSP, LRW, TOR, ALA, RIX, DGM, DKA, MBS, AER, RNA, GTC, CSP, HML, NPH, OGW, ZNR, EMN, UDS, SHM, BNG, SOK, EVE, INV, THB, DOM, NMS, VIS, WAR, GRN, PCY, SCG, MRD, XLN, ONS, IKO, MMQ, CHK, ULG, AKH, MIR, ISD, AVR, KLD, APC, RTR, WWK, PLC, HOU, LEG, AFR, ARN, ICE, STX, LGN, ARB, KHM, CFX, TSB, ZEN, ELD, JUD, GPT, BFZ, BOK, DTK, FRF, FUT, WTH, ODY, RAV, ATQ, DRK, PLS, STH, DST, TD2, HA1, ME4, HA3, HA2, HA5, HA4, MED, ANB, ME3, KLR, PZ2, ANA, PRM, PZ1, AJMP, ME2, TD1, TD0, TPR, VMA, AKR, MBP, PZEN, PGTW, PL21, PFUT, PWAR, PAL01, PJUD, PAL00, PTKDF, PWOR, PWP12, PSTH, POGW, PFRF, PG07, PSUS, PUST, J18, PWP10, PAL02, PAL03, PWP11, J19, PGRN, PM10, PDP14, PRTR, PMPS06, PBNG, PJ21, G09, PNPH, PM15, PAL06, G08, PDST, J20, PMBS, PMPS07, PEXO, PDOM, PONS, PRW2, PMPS11, PMPS, PM19, PWWK, PCEL, PAL04, PAL05, PMPS10, PDTK, PALP, F10, F04, PMOR, PAL99, PEMN, PCNS, PPLC, PRAV, PPP1, PI14, PXLN, PF20, PTSP, F05, F11, PSCG, PBOOK, F07, F13, PODY, PM12, P08, PSS1, P2HG, P09, PTOR, PDP13, F12, F06, PALA, PXTC, F02, F16, PHOU, PSOM, PI13, PCON, PDGM, PIDW, PMRD, PRNA, P9ED, PHEL, F17, F03, PURL, F15, F01, PWOS, PPC1, PBOK, PTMP, PS19, PS18, PF19, PGPT, PCHK, FNM, F14, PISD, PAKH, PDP15, PRIX, PS15, PPCY, OLGC, OVNT, PLGN, PS14, P03, PDTP, PM14, FS, PPLS, MPR, PKTK, PS16, PRWK, PS17, PBFZ, PSS2, PINV, G03, P8ED, PARL, P04, P10, PSDC, JGP, G99, WW, P11, P05, PDIS, PROE, PDP10, F08, P10E, PELP, PMH1, P07, P5DN, PGRU, SHC, PM11, P06, PUSG, PCMP, PULG, F09, PUDS, PARB, DRC94, PMPS09, PORI, J12, G06, PMMQ, G07, J13, PMPS08, PM20, PSOI, PJSE, G05, G11, PNAT, PSOK, PEVE, PRED, G10, G04, PSHM, PPRO, PAPC, PJJT, ARENA, PKLD, G00, J14, PLGM, P15A, PCSP, PWPN, PJAS, PWP21, PWP09, PDKA, PNEM, PPTK, J15, G01, PG08, PLRW, PMEI, PM13, PHJ, PGTC, J17, PRES, PWCQ, PJOU, PDP12, PAER, PAVR, PTHS, G02, J16, PSUM, PGPX, UGF, PSS3, MM2, MM3, MB1, FMB1, A25, 2XM, MMA, PLIST, CHR, EMA, IMA, TSR, UMA, PUMA, E02, DPA, ATH, MD1, GK1, GK2, CST, BRB, BTD, DKM, FVE, V17, V13, STA, MPS_RNA, V16, SLD, V12, CC1, MPS_GRN, DRB, FVR, SS3, SS1, MPS_AKH, FVL, V15, MPS_KLD, ZNE, PDS, SS2, PD3, SLU, V14, PD2, EXP, MPS_WAR, DDQ, DDE, GS1, DDS, DDU, DD1, DDL, DDF, DDP, DD2, DDR, DDH, DDT, DDK, DDG, DDC, DDM, DDJ, DDO, GVL, JVC, DDI, DVD, DDN, EVG, DDD, C18, C19, C21, C20, C13, CMA, C14, C15, KHC, ZNC, AFC, C17, C16, COM, CM1, CM2, PO2, S99, W16, W17, S00, PTK, CP3, POR, CP1, CP2, CMR, MH2, H1R, CNS, BBD, MH1, CN2, JMP, PCA, GNT, ARC, GN2, PC2, E01, HOP, PLG20, PLG21, CC2, MID, MIC
+Sets:7ED, 9ED, ORI, M14, M15, 6ED, 8ED, M11, 3ED, M10, M12, 10E, M13, G18, M21, M20, M19, 5ED, 2ED, 4ED, LEB, LEA, 5DN, SOM, KTK, THS, DIS, JOU, MOR, TMP, SOI, FEM, USG, ALL, ROE, EXO, TSP, LRW, TOR, ALA, RIX, DGM, DKA, MBS, AER, RNA, GTC, CSP, HML, NPH, OGW, ZNR, EMN, UDS, SHM, BNG, SOK, EVE, INV, THB, DOM, NMS, VIS, WAR, GRN, PCY, SCG, MRD, XLN, ONS, IKO, MMQ, CHK, ULG, AKH, MIR, ISD, AVR, KLD, APC, RTR, WWK, PLC, HOU, LEG, AFR, ARN, ICE, STX, LGN, ARB, KHM, CFX, TSB, ZEN, ELD, JUD, GPT, BFZ, BOK, DTK, FRF, FUT, WTH, ODY, RAV, ATQ, DRK, PLS, STH, DST, TD2, HA1, ME4, HA3, HA2, HA5, HA4, MED, ANB, ME3, KLR, PZ2, ANA, PRM, PZ1, AJMP, ME2, TD1, TD0, TPR, VMA, AKR, MBP, PZEN, PGTW, PL21, PFUT, PWAR, PAL01, PJUD, PAL00, PTKDF, PWOR, PWP12, PSTH, POGW, PFRF, PG07, PSUS, PUST, J18, PWP10, PAL02, PAL03, PWP11, J19, PGRN, PM10, PDP14, PRTR, PMPS06, PBNG, PJ21, G09, PNPH, PM15, PAL06, G08, PDST, J20, PMBS, PMPS07, PEXO, PDOM, PONS, PRW2, PMPS11, PMPS, PM19, PWWK, PCEL, PAL04, PAL05, PMPS10, PDTK, PALP, F10, F04, PMOR, PAL99, PEMN, PCNS, PPLC, PRAV, PPP1, PI14, PXLN, PF20, PTSP, F05, F11, PSCG, PBOOK, F07, F13, PODY, PM12, P08, PSS1, P2HG, P09, PTOR, PDP13, F12, F06, PALA, PXTC, F02, F16, PHOU, PSOM, PI13, PCON, PDGM, PIDW, PMRD, PRNA, P9ED, PHEL, F17, F03, PURL, F15, F01, PWOS, PPC1, PBOK, PTMP, PS19, PS18, PF19, PGPT, PCHK, FNM, F14, PISD, PAKH, PDP15, PRIX, PS15, PPCY, OLGC, OVNT, PLGN, PS14, P03, PDTP, PM14, FS, PPLS, MPR, PKTK, PS16, PRWK, PS17, PBFZ, PSS2, PINV, G03, P8ED, PARL, P04, P10, PSDC, JGP, G99, WW, P11, P05, PDIS, PROE, PDP10, F08, P10E, PELP, PMH1, P07, P5DN, PGRU, SHC, PM11, P06, PUSG, PCMP, PULG, F09, PUDS, PARB, DRC94, PMPS09, PORI, J12, G06, PMMQ, G07, J13, PMPS08, PM20, PSOI, PJSE, G05, G11, PNAT, PSOK, PEVE, PRED, G10, G04, PSHM, PPRO, PAPC, PJJT, ARENA, PKLD, G00, J14, PLGM, P15A, PCSP, PWPN, PJAS, PWP21, PWP09, PDKA, PNEM, PPTK, J15, G01, PG08, PLRW, PMEI, PM13, PHJ, PGTC, J17, PRES, PWCQ, PJOU, PDP12, PAER, PAVR, PTHS, G02, J16, PSUM, PGPX, UGF, PSS3, MM2, MM3, MB1, FMB1, A25, 2XM, MMA, PLIST, CHR, EMA, IMA, TSR, UMA, PUMA, E02, DPA, ATH, MD1, GK1, GK2, CST, BRB, BTD, DKM, FVE, V17, V13, STA, MPS_RNA, V16, SLD, V12, CC1, MPS_GRN, DRB, FVR, SS3, SS1, MPS_AKH, FVL, V15, MPS_KLD, ZNE, PDS, SS2, PD3, SLU, V14, PD2, EXP, MPS_WAR, DDQ, DDE, GS1, DDS, DDU, DD1, DDL, DDF, DDP, DD2, DDR, DDH, DDT, DDK, DDG, DDC, DDM, DDJ, DDO, GVL, JVC, DDI, DVD, DDN, EVG, DDD, C18, C19, C21, C20, C13, CMA, C14, C15, KHC, ZNC, AFC, C17, C16, COM, CM1, CM2, PO2, S99, W16, W17, S00, PTK, CP3, POR, CP1, CP2, CMR, MH2, H1R, CNS, BBD, MH1, CN2, JMP, PCA, GNT, ARC, GN2, PC2, E01, HOP, PLG20, PLG21, CC2, MID, MIC, VOW, VOC
Banned:Adriana's Valor; Advantageous Proclamation; Arcum's Astrolabe; Assemble the Rank and Vile; Backup Plan; Brago's Favor; Deathrite Shaman; Double Stroke; Dreadhorde Arcanist; Echoing Boon; Emissary's Ploy; Gitaxian Probe; Hired Heist; Hold the Perimeter; Hymn of the Wilds; Immediate Action; Incendiary Dissent; Iterative Analysis; Lurrus of the Dream-Den; Muzzio's Preparations; Natural Unity; Oko, Thief of Crowns; Power Play; Secret Summoning; Secrets of Paradise; Sentinel Dispatch; Sovereign's Realm; Summoner's Bond; Underworld Breach; Unexpected Potential; Weight Advantage; Worldknit; Amulet of Quoz; Bronze Tablet; Contract from Below; Darkpact; Demonic Attorney; Jeweled Bird; Rebirth; Tempest Efreet; Timmerian Fiends; Ancestral Recall; Balance; Bazaar of Baghdad; Black Lotus; Channel; Chaos Orb; Demonic Consultation; Demonic Tutor; Dig Through Time; Earthcraft; Falling Star; Fastbond; Flash; Frantic Search; Goblin Recruiter; Gush; Hermit Druid; Imperial Seal; Library of Alexandria; Mana Crypt; Mana Drain; Mana Vault; Memory Jar; Mental Misstep; Mind Twist; Mind's Desire; Mishra's Workshop; Mox Emerald; Mox Jet; Mox Pearl; Mox Ruby; Mox Sapphire; Mystical Tutor; Necropotence; Oath of Druids; Sensei's Divining Top; Shahrazad; Skullclamp; Sol Ring; Strip Mine; Survival of the Fittest; Time Vault; Time Walk; Timetwister; Tinker; Tolarian Academy; Treasure Cruise; Vampiric Tutor; Wheel of Fortune; Windfall; Wrenn and Six; Yawgmoth's Bargain; Yawgmoth's Will; Zirda, the Dawnwaker; Cleanse; Crusade; Imprison; Invoke Prejudice; Jihad; Pradesh Gypsies; Stone-Throwing Devils
diff --git a/forge-gui/res/formats/Sanctioned/Modern.txt b/forge-gui/res/formats/Sanctioned/Modern.txt
index 5e1152188dc..1ac5f753e90 100644
--- a/forge-gui/res/formats/Sanctioned/Modern.txt
+++ b/forge-gui/res/formats/Sanctioned/Modern.txt
@@ -3,5 +3,5 @@ Name:Modern
Order:103
Subtype:Modern
Type:Sanctioned
-Sets:8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, RAV, GPT, DIS, CSP, TSP, TSB, TSR, PLC, FUT, 10E, LRW, EVE, SHM, MOR, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, MMA, MM2, MM3, ORI, BFZ, OGW, SOI, EMN, KLD, AER, AKH, W16, W17, HOU, XLN, RIX, DOM, M19, G18, GRN, RNA, WAR, MH1, M20, ELD, THB, IKO, M21, ZNR, KHM, STX, MH2, AFR, MID
+Sets:8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, RAV, GPT, DIS, CSP, TSP, TSB, TSR, PLC, FUT, 10E, LRW, EVE, SHM, MOR, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, MMA, MM2, MM3, ORI, BFZ, OGW, SOI, EMN, KLD, AER, AKH, W16, W17, HOU, XLN, RIX, DOM, M19, G18, GRN, RNA, WAR, MH1, M20, ELD, THB, IKO, M21, ZNR, KHM, STX, MH2, AFR, MID, VOW
Banned:Ancient Den; Arcum's Astrolabe; Birthing Pod; Blazing Shoal; Bridge from Below; Chrome Mox; Cloudpost; Dark Depths; Deathrite Shaman; Dig Through Time; Dread Return; Eye of Ugin; Faithless Looting; Field of the Dead; Gitaxian Probe; Glimpse of Nature; Golgari Grave-Troll; Great Furnace; Green Sun's Zenith; Hogaak, Arisen Necropolis; Hypergenesis; Krark-Clan Ironworks; Mental Misstep; Mox Opal; Mycosynth Lattice; Mystic Sanctuary; Oko, Thief of Crowns; Once Upon A Time; Ponder; Preordain; Punishing Fire; Rite of Flame; Seat of the Synod; Second Sunrise; Seething Song; Sensei's Divining Top; Simian Spirit Guide; Skullclamp; Splinter Twin; Summer Bloom; Tibalt's Trickery; Treasure Cruise; Tree of Tales; Umezawa's Jitte; Uro, Titan of Nature's Wrath; Vault of Whispers
diff --git a/forge-gui/res/formats/Sanctioned/Pioneer.txt b/forge-gui/res/formats/Sanctioned/Pioneer.txt
index c2ec0bb2d42..07634a47de8 100644
--- a/forge-gui/res/formats/Sanctioned/Pioneer.txt
+++ b/forge-gui/res/formats/Sanctioned/Pioneer.txt
@@ -3,5 +3,5 @@ Name:Pioneer
Order:102
Subtype:Pioneer
Type:Sanctioned
-Sets:RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, SOI, EMN, KLD, AER, AKH, HOU, XLN, RIX, DOM, M19, G18, GRN, RNA, WAR, M20, ELD, THB, IKO, M21, ZNR, KHM, STX, AFR, MID
+Sets:RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, SOI, EMN, KLD, AER, AKH, HOU, XLN, RIX, DOM, M19, G18, GRN, RNA, WAR, M20, ELD, THB, IKO, M21, ZNR, KHM, STX, AFR, MID, VOW
Banned:Balustrade Spy; Bloodstained Mire; Felidar Guardian; Field of the Dead; Flooded Strand; Inverter of Truth; Kethis, the Hidden Hand; Leyline of Abundance; Nexus of Fate; Oko, Thief of Crowns; Once Upon a Time; Polluted Delta; Smuggler's Copter; Teferi, Time Raveler; Undercity Informer; Underworld Breach; Uro, Titan of Nature's Wrath; Veil of Summer; Walking Ballista; Wilderness Reclamation; Windswept Heath; Wooded Foothills
diff --git a/forge-gui/res/formats/Sanctioned/Standard.txt b/forge-gui/res/formats/Sanctioned/Standard.txt
index 61dd36a8ffc..dc8bf11699e 100644
--- a/forge-gui/res/formats/Sanctioned/Standard.txt
+++ b/forge-gui/res/formats/Sanctioned/Standard.txt
@@ -3,5 +3,5 @@ Name:Standard
Order:101
Subtype:Standard
Type:Sanctioned
-Sets:ZNR, KHM, STX, AFR, MID
+Sets:ZNR, KHM, STX, AFR, MID, VOW
Banned:Omnath, Locus of Creation
diff --git a/forge-gui/res/formats/Sanctioned/Vintage.txt b/forge-gui/res/formats/Sanctioned/Vintage.txt
index 772d8b65822..c56219cd1c6 100644
--- a/forge-gui/res/formats/Sanctioned/Vintage.txt
+++ b/forge-gui/res/formats/Sanctioned/Vintage.txt
@@ -3,6 +3,6 @@ Name:Vintage
Order:104
Subtype:Vintage
Type:Sanctioned
-Sets:7ED, 9ED, ORI, M14, M15, 6ED, 8ED, M11, 3ED, M10, M12, 10E, M13, G18, M21, M20, M19, 5ED, 2ED, 4ED, LEB, LEA, 5DN, SOM, KTK, THS, DIS, JOU, MOR, TMP, SOI, FEM, USG, ALL, ROE, EXO, TSP, LRW, TOR, ALA, RIX, DGM, DKA, MBS, AER, RNA, GTC, CSP, HML, NPH, OGW, ZNR, EMN, UDS, SHM, BNG, SOK, EVE, INV, THB, DOM, NMS, VIS, WAR, GRN, PCY, SCG, MRD, XLN, ONS, IKO, MMQ, CHK, ULG, AKH, MIR, ISD, AVR, KLD, APC, RTR, WWK, PLC, HOU, LEG, AFR, ARN, ICE, STX, LGN, ARB, KHM, CFX, TSB, ZEN, ELD, JUD, GPT, BFZ, BOK, DTK, FRF, FUT, WTH, ODY, RAV, ATQ, DRK, PLS, STH, DST, TD2, HA1, ME4, HA3, HA2, HA5, HA4, MED, ANB, ME3, KLR, PZ2, ANA, PRM, PZ1, AJMP, ME2, TD1, TD0, TPR, VMA, AKR, MBP, PZEN, PGTW, PL21, PFUT, PWAR, PAL01, PJUD, PAL00, PTKDF, PWOR, PWP12, PSTH, POGW, PFRF, PG07, PSUS, PUST, J18, PWP10, PAL02, PAL03, PWP11, J19, PGRN, PM10, PDP14, PRTR, PMPS06, PBNG, PJ21, G09, PNPH, PM15, PAL06, G08, PDST, J20, PMBS, PMPS07, PEXO, PDOM, PONS, PRW2, PMPS11, PMPS, PM19, PWWK, PCEL, PAL04, PAL05, PMPS10, PDTK, PALP, F10, F04, PMOR, PAL99, PEMN, PCNS, PPLC, PRAV, PPP1, PI14, PXLN, PF20, PTSP, F05, F11, PSCG, PBOOK, F07, F13, PODY, PM12, P08, PSS1, P2HG, P09, PTOR, PDP13, F12, F06, PALA, PXTC, F02, F16, PHOU, PSOM, PI13, PCON, PDGM, PIDW, PMRD, PRNA, P9ED, PHEL, F17, F03, PURL, F15, F01, PWOS, PPC1, PBOK, PTMP, PS19, PS18, PF19, PGPT, PCHK, FNM, F14, PISD, PAKH, PDP15, PRIX, PS15, PPCY, OLGC, OVNT, PLGN, PS14, P03, PDTP, PM14, FS, PPLS, MPR, PKTK, PS16, PRWK, PS17, PBFZ, PSS2, PINV, G03, P8ED, PARL, P04, P10, PSDC, JGP, G99, WW, P11, P05, PDIS, PROE, PDP10, F08, P10E, PELP, PMH1, P07, P5DN, PGRU, SHC, PM11, P06, PUSG, PCMP, PULG, F09, PUDS, PARB, DRC94, PMPS09, PORI, J12, G06, PMMQ, G07, J13, PMPS08, PM20, PSOI, PJSE, G05, G11, PNAT, PSOK, PEVE, PRED, G10, G04, PSHM, PPRO, PAPC, PJJT, ARENA, PKLD, G00, J14, PLGM, P15A, PCSP, PWPN, PJAS, PWP21, PWP09, PDKA, PNEM, PPTK, J15, G01, PG08, PLRW, PMEI, PM13, PHJ, PGTC, J17, PRES, PWCQ, PJOU, PDP12, PAER, PAVR, PTHS, G02, J16, PSUM, PGPX, UGF, PSS3, MM2, MM3, MB1, FMB1, A25, 2XM, MMA, PLIST, CHR, EMA, IMA, TSR, UMA, PUMA, E02, DPA, ATH, MD1, GK1, GK2, CST, BRB, BTD, DKM, FVE, V17, V13, STA, MPS_RNA, V16, SLD, V12, CC1, MPS_GRN, DRB, FVR, SS3, SS1, MPS_AKH, FVL, V15, MPS_KLD, ZNE, PDS, SS2, PD3, SLU, V14, PD2, EXP, MPS_WAR, DDQ, DDE, GS1, DDS, DDU, DD1, DDL, DDF, DDP, DD2, DDR, DDH, DDT, DDK, DDG, DDC, DDM, DDJ, DDO, GVL, JVC, DDI, DVD, DDN, EVG, DDD, C18, C19, C21, C20, C13, CMA, C14, C15, KHC, ZNC, AFC, C17, C16, COM, CM1, CM2, PO2, S99, W16, W17, S00, PTK, CP3, POR, CP1, CP2, CMR, MH2, H1R, CNS, BBD, MH1, CN2, JMP, PCA, GNT, ARC, GN2, PC2, E01, HOP, PLG20, PLG21, CC2, MID, MIC
+Sets:7ED, 9ED, ORI, M14, M15, 6ED, 8ED, M11, 3ED, M10, M12, 10E, M13, G18, M21, M20, M19, 5ED, 2ED, 4ED, LEB, LEA, 5DN, SOM, KTK, THS, DIS, JOU, MOR, TMP, SOI, FEM, USG, ALL, ROE, EXO, TSP, LRW, TOR, ALA, RIX, DGM, DKA, MBS, AER, RNA, GTC, CSP, HML, NPH, OGW, ZNR, EMN, UDS, SHM, BNG, SOK, EVE, INV, THB, DOM, NMS, VIS, WAR, GRN, PCY, SCG, MRD, XLN, ONS, IKO, MMQ, CHK, ULG, AKH, MIR, ISD, AVR, KLD, APC, RTR, WWK, PLC, HOU, LEG, AFR, ARN, ICE, STX, LGN, ARB, KHM, CFX, TSB, ZEN, ELD, JUD, GPT, BFZ, BOK, DTK, FRF, FUT, WTH, ODY, RAV, ATQ, DRK, PLS, STH, DST, TD2, HA1, ME4, HA3, HA2, HA5, HA4, MED, ANB, ME3, KLR, PZ2, ANA, PRM, PZ1, AJMP, ME2, TD1, TD0, TPR, VMA, AKR, MBP, PZEN, PGTW, PL21, PFUT, PWAR, PAL01, PJUD, PAL00, PTKDF, PWOR, PWP12, PSTH, POGW, PFRF, PG07, PSUS, PUST, J18, PWP10, PAL02, PAL03, PWP11, J19, PGRN, PM10, PDP14, PRTR, PMPS06, PBNG, PJ21, G09, PNPH, PM15, PAL06, G08, PDST, J20, PMBS, PMPS07, PEXO, PDOM, PONS, PRW2, PMPS11, PMPS, PM19, PWWK, PCEL, PAL04, PAL05, PMPS10, PDTK, PALP, F10, F04, PMOR, PAL99, PEMN, PCNS, PPLC, PRAV, PPP1, PI14, PXLN, PF20, PTSP, F05, F11, PSCG, PBOOK, F07, F13, PODY, PM12, P08, PSS1, P2HG, P09, PTOR, PDP13, F12, F06, PALA, PXTC, F02, F16, PHOU, PSOM, PI13, PCON, PDGM, PIDW, PMRD, PRNA, P9ED, PHEL, F17, F03, PURL, F15, F01, PWOS, PPC1, PBOK, PTMP, PS19, PS18, PF19, PGPT, PCHK, FNM, F14, PISD, PAKH, PDP15, PRIX, PS15, PPCY, OLGC, OVNT, PLGN, PS14, P03, PDTP, PM14, FS, PPLS, MPR, PKTK, PS16, PRWK, PS17, PBFZ, PSS2, PINV, G03, P8ED, PARL, P04, P10, PSDC, JGP, G99, WW, P11, P05, PDIS, PROE, PDP10, F08, P10E, PELP, PMH1, P07, P5DN, PGRU, SHC, PM11, P06, PUSG, PCMP, PULG, F09, PUDS, PARB, DRC94, PMPS09, PORI, J12, G06, PMMQ, G07, J13, PMPS08, PM20, PSOI, PJSE, G05, G11, PNAT, PSOK, PEVE, PRED, G10, G04, PSHM, PPRO, PAPC, PJJT, ARENA, PKLD, G00, J14, PLGM, P15A, PCSP, PWPN, PJAS, PWP21, PWP09, PDKA, PNEM, PPTK, J15, G01, PG08, PLRW, PMEI, PM13, PHJ, PGTC, J17, PRES, PWCQ, PJOU, PDP12, PAER, PAVR, PTHS, G02, J16, PSUM, PGPX, UGF, PSS3, MM2, MM3, MB1, FMB1, A25, 2XM, MMA, PLIST, CHR, EMA, IMA, TSR, UMA, PUMA, E02, DPA, ATH, MD1, GK1, GK2, CST, BRB, BTD, DKM, FVE, V17, V13, STA, MPS_RNA, V16, SLD, V12, CC1, MPS_GRN, DRB, FVR, SS3, SS1, MPS_AKH, FVL, V15, MPS_KLD, ZNE, PDS, SS2, PD3, SLU, V14, PD2, EXP, MPS_WAR, DDQ, DDE, GS1, DDS, DDU, DD1, DDL, DDF, DDP, DD2, DDR, DDH, DDT, DDK, DDG, DDC, DDM, DDJ, DDO, GVL, JVC, DDI, DVD, DDN, EVG, DDD, C18, C19, C21, C20, C13, CMA, C14, C15, KHC, ZNC, AFC, C17, C16, COM, CM1, CM2, PO2, S99, W16, W17, S00, PTK, CP3, POR, CP1, CP2, CMR, MH2, H1R, CNS, BBD, MH1, CN2, JMP, PCA, GNT, ARC, GN2, PC2, E01, HOP, PLG20, PLG21, CC2, MID, MIC, VOW, VOC
Banned:Adriana's Valor; Advantageous Proclamation; Assemble the Rank and Vile; Backup Plan; Brago's Favor; Double Stroke; Echoing Boon; Emissary's Ploy; Hired Heist; Hold the Perimeter; Hymn of the Wilds; Immediate Action; Incendiary Dissent; Iterative Analysis; Muzzio's Preparations; Natural Unity; Power Play; Secret Summoning; Secrets of Paradise; Sentinel Dispatch; Sovereign's Realm; Summoner's Bond; Unexpected Potential; Weight Advantage; Worldknit; Amulet of Quoz; Bronze Tablet; Contract from Below; Darkpact; Demonic Attorney; Jeweled Bird; Rebirth; Tempest Efreet; Timmerian Fiends; Chaos Orb; Falling Star; Shahrazad; Cleanse; Crusade; Imprison; Invoke Prejudice; Jihad; Pradesh Gypsies; Stone-Throwing Devils
Restricted:Ancestral Recall; Balance; Black Lotus; Brainstorm; Chalice of the Void; Channel; Demonic Consultation; Demonic Tutor; Dig Through Time; Flash; Gitaxian Probe; Golgari Grave-Troll; Gush; Imperial Seal; Karn, the Great Creator; Library of Alexandria; Lion's Eye Diamond; Lodestone Golem; Lotus Petal; Mana Crypt; Mana Vault; Memory Jar; Mental Misstep; Merchant Scroll; Mind's Desire; Monastery Mentor; Mox Emerald; Mox Jet; Mox Pearl; Mox Ruby; Mox Sapphire; Mystic Forge; Mystical Tutor; Narset, Parter of Veils; Necropotence; Ponder; Sol Ring; Strip Mine; Thorn of Amethyst; Time Vault; Time Walk; Timetwister; Tinker; Tolarian Academy; Treasure Cruise; Trinisphere; Vampiric Tutor; Wheel of Fortune; Windfall; Yawgmoth's Will
diff --git a/forge-gui/res/languages/cardnames-ja-JP.txt b/forge-gui/res/languages/cardnames-ja-JP.txt
index 8425dd28d66..c1ae11d05ce 100644
--- a/forge-gui/res/languages/cardnames-ja-JP.txt
+++ b/forge-gui/res/languages/cardnames-ja-JP.txt
@@ -14182,7 +14182,7 @@ Pongify|猿術|インスタント|クリーチャー1体を対象とし、そ
Pontiff of Blight|荒廃の司教|クリーチャー — ゾンビ・クレリック|強請 (あなたが呪文を1つ唱えるたび、あなたは{W/B}を支払ってもよい。そうした場合、各対戦相手はそれぞれ1点のライフを失い、あなたはその点数分のライフを得る。)\nあなたがコントロールする他のクリーチャーは強請を持つ。 (あるクリーチャーが複数の強請を持っている場合、それぞれが誘発する。)
Ponyback Brigade|子馬乗り部隊|クリーチャー — ゴブリン・戦士|子馬乗り部隊が戦場に出るか表向きになったとき、赤の1/1のゴブリン・クリーチャー・トークンを3体生成する。\n変異{2}{R}{W}{B} (あなたはこのカードを、{3}で2/2クリーチャーとして裏向きに唱えてもよい。これの変異コストで、これをいつでも表向きにしてもよい。)
Pooling Venom|溜まる毒|エンチャント — オーラ|エンチャント(土地)\nエンチャントされている土地がタップ状態になるたび、それのコントローラーは2点のライフを失う。\n{3}{B}:エンチャントされている土地を破壊する。
-Pools of Becoming|Pools of Becoming|次元 — (Bolas’s)・・|あなたの終了ステップの開始時に、あなたの手札のカードをあなたのライブラリーの一番下に望む順番で置き、その後、同じ枚数のカードを引く。\nあなたが{CHAOS}を出すたび、あなたの次元デッキの一番上から3枚のカードを公開する。公開された各カードの{CHAOS}能力を誘発する。その後、公開されたカードをあなたの次元デッキの一番下に望む順番で置く。
+Pools of Becoming|Pools of Becoming|次元 — (Bolas's)・・|あなたの終了ステップの開始時に、あなたの手札のカードをあなたのライブラリーの一番下に望む順番で置き、その後、同じ枚数のカードを引く。\nあなたが{CHAOS}を出すたび、あなたの次元デッキの一番上から3枚のカードを公開する。公開された各カードの{CHAOS}能力を誘発する。その後、公開されたカードをあなたの次元デッキの一番下に望む順番で置く。
Pop Quiz|抜き打ち試験|インスタント|カード1枚を引く。\n履修を行う。 (あなたは、ゲームの外部からあなたがオーナーである講義カード1枚を公開しあなたの手札に加えるか、カード1枚を捨てカード1枚を引くか、どちらかを行ってもよい。)
Porcelain Legionnaire|磁器の軍団兵|アーティファクト・クリーチャー — ファイレクシアン・兵士|({W/P}は{W}でも2点のライフでも支払うことができる。)\n先制攻撃
Porcuparrot|ヤマオウム|クリーチャー — 鳥・ビースト|変容{2}{R} (あなたがこの呪文をこれの変容コストで唱えるなら、あなたがオーナーであり人間でないクリーチャー1体を対象とし、これをそれの上か下に置く。これらは、一番上のクリーチャーにその下にある能力すべてを加えたものに変容する。)\n{T}:クリーチャー1体かプレインズウォーカー1体かプレイヤー1人を対象とする。このクリーチャーはそれにX点のダメージを与える。Xは、このクリーチャーが変容した総回数に等しい。
diff --git a/forge-gui/res/languages/de-DE.properties b/forge-gui/res/languages/de-DE.properties
index 11811320da8..19b9c686443 100644
--- a/forge-gui/res/languages/de-DE.properties
+++ b/forge-gui/res/languages/de-DE.properties
@@ -112,7 +112,7 @@ cbpCloseAction=Beenden
cbpDefaultFontSize=Standard Schriftgröße
cbpCardArtFormat=Kartenbildformat
cbpSoundSets=Sound-Set
-cbpMusicSets=Music-Set
+cbpMusicSets=Musik-Set
cbpAiProfiles=KI Persönlichkeit
cbpStackAdditions=Nachricht bei Stapeländerung
cbpDisplayCurrentCardColors=Zeige detaillierte Kartenfarben
@@ -143,8 +143,8 @@ nlCompactMainMenu=Aktiviere, um im Seitenmenü platzsparend immer nur eine Menü
nlUseSentry=Aktiviere, um automatische Fehlerberichte an die Entwickler zu senden.
GamePlay=Spiel
nlpMulliganRule=Wähle die Version der Mulligan Regel
-nlpSoundSets=Wähle eines der Sound-Sets aus dem "Sound"-Ordner in deinem Forge-Cache-Verzeichnis.
-nlpMusicSets=Choose the music set from the ones present in the "music" folder in your Forge cache directory
+nlpSoundSets=Wähle eines der Sound-Sets aus dem "sound"-Ordner in deinem Forge-Cache-Verzeichnis.
+nlpMusicSets=Wähle eines der Musik-Sets aus dem "music"-Ordner in deinem Forge-Cache-Verzeichnis.
nlpAiProfiles=Wähle die Spielweise deines KI-Gegners.
nlpStackAdditions=Wähle, wann du über Änderungen am Stapel benachrichtigt werden möchtest: Niemals, immer oder nur für durch andere Spieler ausgelöste Effekte und Fähigkeiten
nlAnte=Entscheidet, ob um einen Einsatz (Ante) gespielt wird.
@@ -1991,6 +1991,7 @@ lblPlayerRolledResult={0} würfelte {1}?
lblDoYouWantPayEcho=Möchtest du die Echokosten zahlen
lblPayEcho=Zahle Echokosten
lblDoYouWantSacrifice=Opfern durchführen?
+lblDoYouWantSacrificeThis=Möchtest du {0} opfern?
#SetStateEffect.java
lblFaceDownCardCantTurnFaceUp=Verdeckte Karte kann nicht umgedreht werden
#ShuffleEffect.java
diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties
index 5a7e008a628..4fb81972a17 100644
--- a/forge-gui/res/languages/en-US.properties
+++ b/forge-gui/res/languages/en-US.properties
@@ -1992,6 +1992,7 @@ lblPlayerRolledResult={0} rolled {1}
lblDoYouWantPayEcho=Do you want to pay Echo
lblPayEcho=Pay Echo
lblDoYouWantSacrifice=Do you want to sacrifice?
+lblDoYouWantSacrificeThis=Do you want to sacrifice {0}?
#SetStateEffect.java
lblFaceDownCardCantTurnFaceUp=Face-down card can''t turn face up
#ShuffleEffect.java
diff --git a/forge-gui/res/languages/es-ES.properties b/forge-gui/res/languages/es-ES.properties
index 1fa69fe722f..d3f55563e11 100644
--- a/forge-gui/res/languages/es-ES.properties
+++ b/forge-gui/res/languages/es-ES.properties
@@ -1990,6 +1990,7 @@ lblPlayerRolledResult={0} lanzó {1}
lblDoYouWantPayEcho=¿Quieres pagar Eco
lblPayEcho=Pagar Eco
lblDoYouWantSacrifice=¿Quieres sacrificar?
+lblDoYouWantSacrificeThis=¿Quieres sacrificar {0}?
#SetStateEffect.java
lblFaceDownCardCantTurnFaceUp=La carta boca abajo no se puede girar boca arriba
#ShuffleEffect.java
diff --git a/forge-gui/res/languages/it-IT.properties b/forge-gui/res/languages/it-IT.properties
index 645a7e7d121..c56d0a9a192 100644
--- a/forge-gui/res/languages/it-IT.properties
+++ b/forge-gui/res/languages/it-IT.properties
@@ -1989,6 +1989,7 @@ lblPlayerRolledResult={0} ha ottenuto {1} col dado
lblDoYouWantPayEcho=Vuoi pagare Eco
lblPayEcho=Paga Eco
lblDoYouWantSacrifice=Vuoi sacrificare?
+lblDoYouWantSacrifice=Vuoi sacrificare {0}?
#SetStateEffect.java
lblFaceDownCardCantTurnFaceUp=La carta a faccia in giù non può essere girata a faccia in su
#ShuffleEffect.java
diff --git a/forge-gui/res/languages/ja-JP.properties b/forge-gui/res/languages/ja-JP.properties
index 04ef29709e5..e6d13cfe422 100644
--- a/forge-gui/res/languages/ja-JP.properties
+++ b/forge-gui/res/languages/ja-JP.properties
@@ -1989,6 +1989,7 @@ lblPlayerRolledResult={0}が {1}をロールしました
lblDoYouWantPayEcho=エコーコストを支払いますか:
lblPayEcho=エコーコストを支払います
lblDoYouWantSacrifice=生け贄にしますか?
+lblDoYouWantSacrificeThis=Do you want to sacrifice {0}?
#SetStateEffect.java
lblFaceDownCardCantTurnFaceUp=裏向きのカードが表向きにできません
#ShuffleEffect.java
diff --git a/forge-gui/res/languages/zh-CN.properties b/forge-gui/res/languages/zh-CN.properties
index b9c88336c84..67603f42625 100644
--- a/forge-gui/res/languages/zh-CN.properties
+++ b/forge-gui/res/languages/zh-CN.properties
@@ -1993,6 +1993,7 @@ lblPlayerRolledResult={0}掷骰结果为{1}
lblDoYouWantPayEcho=你想支付返响费用
lblPayEcho=支付返响费用
lblDoYouWantSacrifice=你想牺牲吗?
+lblDoYouWantSacrificeThis=Do you want to sacrifice {0}?
#SetStateEffect.java
lblFaceDownCardCantTurnFaceUp=面朝下的牌不能面朝上
#ShuffleEffect.java
diff --git a/forge-gui/res/lists/altwin-achievements.txt b/forge-gui/res/lists/altwin-achievements.txt
index ffe37bbc9c9..d0bdb6b0a50 100644
--- a/forge-gui/res/lists/altwin-achievements.txt
+++ b/forge-gui/res/lists/altwin-achievements.txt
@@ -29,6 +29,7 @@ Near-Death Experience|The Edge|Phew... I thought I was going to die!
Phage the Untouchable|The Untouchable|None are immune to her deadly touch!
Revel in Riches|The Dead Man's Chest|Yo-ho-ho, and a bottle of rum!
Simic Ascendancy|The Ascension|As you can see, we are going through a period of unprecedented growth.
+Sinner's Judgment|The Final Judgment|Your appeal has been denied.
Strixhaven Stadium|The Mage Tower|And that's game, set, and match!
Test of Endurance|The Test|So... did I pass?
Thassa's Oracle|The Prophecy of Victory|I see... nothing. We must've won.
diff --git a/forge-gui/res/lists/net-decks-archive-block.txt b/forge-gui/res/lists/net-decks-archive-block.txt
index a46736d466f..ebdd2e966dd 100644
--- a/forge-gui/res/lists/net-decks-archive-block.txt
+++ b/forge-gui/res/lists/net-decks-archive-block.txt
@@ -978,3 +978,4 @@
2021-08-30 Sealed Mh2 Block Mocs (8 decks) | https://downloads.cardforge.org/decks/archive/block/2021-08-30-sealed-mh2-block-mocs.zip
2021-09-26 Sealed Mid Block Super Qualifier (8 decks) | https://downloads.cardforge.org/decks/archive/block/2021-09-26-sealed-mid-block-super-qualifier.zip
2021-10-17 Sealed Mid Block Super Qualifier (8 decks) | https://downloads.cardforge.org/decks/archive/block/2021-10-17-sealed-mid-block-super-qualifier.zip
+2021-11-01 Sealed Mid Block Super Qualifier (8 decks) | https://downloads.cardforge.org/decks/archive/block/2021-11-01-sealed-mid-block-super-qualifier.zip
diff --git a/forge-gui/res/lists/net-decks-archive-legacy.txt b/forge-gui/res/lists/net-decks-archive-legacy.txt
index bceafd34daa..417d7d765ab 100644
--- a/forge-gui/res/lists/net-decks-archive-legacy.txt
+++ b/forge-gui/res/lists/net-decks-archive-legacy.txt
@@ -2138,3 +2138,13 @@
2021-10-24 Legacy Premier (16 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-10-24-legacy-premier.zip
2021-10-25 Legacy Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-10-25-legacy-challenge.zip
2021-10-26 Legacy Preliminary (3 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-10-26-legacy-preliminary.zip
+2021-10-30 Legacy League (46 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-10-30-legacy-league.zip
+2021-10-30 Legacy Preliminary (5 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-10-30-legacy-preliminary.zip
+2021-11-01 Legacy Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-11-01-legacy-challenge.zip
+2021-11-02 Legacy Preliminary (5 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-11-02-legacy-preliminary.zip
+2021-11-03 Legacy Preliminary (4 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-11-03-legacy-preliminary.zip
+2021-11-04 Legacy Preliminary (4 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-11-04-legacy-preliminary.zip
+2021-11-06 Legacy League (44 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-11-06-legacy-league.zip
+2021-11-06 Legacy Preliminary (3 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-11-06-legacy-preliminary.zip
+2021-11-08 Legacy Showcase Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-11-08-legacy-showcase-challenge.zip
+2021-11-10 Legacy Preliminary (5 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-11-10-legacy-preliminary.zip
diff --git a/forge-gui/res/lists/net-decks-archive-modern.txt b/forge-gui/res/lists/net-decks-archive-modern.txt
index 79266b9f498..ae7bc4a5515 100644
--- a/forge-gui/res/lists/net-decks-archive-modern.txt
+++ b/forge-gui/res/lists/net-decks-archive-modern.txt
@@ -2812,3 +2812,22 @@
2021-10-25 Modern Premier (16 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-10-25-modern-premier.zip
2021-10-26 Modern League (65 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-10-26-modern-league.zip
2021-10-26 Modern Preliminary (7 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-10-26-modern-preliminary.zip
+2021-10-27 Modern Preliminary (4 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-10-27-modern-preliminary.zip
+2021-10-28 Modern Preliminary (5 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-10-28-modern-preliminary.zip
+2021-10-29 Modern League (56 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-10-29-modern-league.zip
+2021-10-29 Modern Preliminary (4 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-10-29-modern-preliminary.zip
+2021-10-30 Modern Preliminary (4 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-10-30-modern-preliminary.zip
+2021-10-31 Modern Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-10-31-modern-challenge.zip
+2021-11-01 Modern Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-11-01-modern-challenge.zip
+2021-11-02 Modern League (67 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-11-02-modern-league.zip
+2021-11-02 Modern Preliminary (8 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-11-02-modern-preliminary.zip
+2021-11-03 Modern Preliminary (6 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-11-03-modern-preliminary.zip
+2021-11-04 Modern Preliminary (11 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-11-04-modern-preliminary.zip
+2021-11-05 Modern League (49 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-11-05-modern-league.zip
+2021-11-05 Modern Preliminary (3 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-11-05-modern-preliminary.zip
+2021-11-06 Modern Preliminary (8 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-11-06-modern-preliminary.zip
+2021-11-07 Modern Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-11-07-modern-challenge.zip
+2021-11-08 Modern Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-11-08-modern-challenge.zip
+2021-11-09 Modern League (69 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-11-09-modern-league.zip
+2021-11-09 Modern Preliminary (8 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-11-09-modern-preliminary.zip
+2021-11-10 Modern Preliminary (3 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-11-10-modern-preliminary.zip
diff --git a/forge-gui/res/lists/net-decks-archive-pauper.txt b/forge-gui/res/lists/net-decks-archive-pauper.txt
index 3f55845b47c..da8d8a646a1 100644
--- a/forge-gui/res/lists/net-decks-archive-pauper.txt
+++ b/forge-gui/res/lists/net-decks-archive-pauper.txt
@@ -1819,4 +1819,12 @@
2021-10-20 Pauper League (25 decks) | https://downloads.cardforge.org/decks/archive/pauper/2021-10-20-pauper-league.zip
2021-10-24 Pauper Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/pauper/2021-10-24-pauper-challenge.zip
2021-10-25 Pauper Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/pauper/2021-10-25-pauper-challenge.zip
-Pauper League (20 decks) | https://downloads.cardforge.org/decks/archive/pauper/pauper-league.zip
+2021-10-27 Pauper League (29 decks) | https://downloads.cardforge.org/decks/archive/pauper/2021-10-27-pauper-league.zip
+2021-10-31 Pauper Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/pauper/2021-10-31-pauper-challenge.zip
+2021-11-01 Pauper Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/pauper/2021-11-01-pauper-challenge.zip
+2021-11-03 Pauper League (26 decks) | https://downloads.cardforge.org/decks/archive/pauper/2021-11-03-pauper-league.zip
+2021-11-03 Pauper Preliminary (4 decks) | https://downloads.cardforge.org/decks/archive/pauper/2021-11-03-pauper-preliminary.zip
+2021-11-07 Pauper Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/pauper/2021-11-07-pauper-challenge.zip
+2021-11-07 Pauper Showcase Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/pauper/2021-11-07-pauper-showcase-challenge.zip
+2021-11-08 Pauper Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/pauper/2021-11-08-pauper-challenge.zip
+2021-11-10 Pauper League (25 decks) | https://downloads.cardforge.org/decks/archive/pauper/2021-11-10-pauper-league.zip
diff --git a/forge-gui/res/lists/net-decks-archive-pioneer.txt b/forge-gui/res/lists/net-decks-archive-pioneer.txt
index 915a340af8b..eb0e0f63033 100644
--- a/forge-gui/res/lists/net-decks-archive-pioneer.txt
+++ b/forge-gui/res/lists/net-decks-archive-pioneer.txt
@@ -762,3 +762,14 @@
2021-10-24 Pioneer Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-10-24-pioneer-challenge.zip
2021-10-25 Pioneer Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-10-25-pioneer-challenge.zip
2021-10-25 Pioneer League (19 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-10-25-pioneer-league.zip
+2021-10-27 Pioneer Preliminary (6 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-10-27-pioneer-preliminary.zip
+2021-10-28 Pioneer League (13 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-10-28-pioneer-league.zip
+2021-10-30 Pioneer Preliminary (4 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-10-30-pioneer-preliminary.zip
+2021-10-31 Pioneer Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-10-31-pioneer-challenge.zip
+2021-11-01 Pioneer Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-11-01-pioneer-challenge.zip
+2021-11-01 Pioneer League (17 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-11-01-pioneer-league.zip
+2021-11-03 Pioneer Preliminary (5 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-11-03-pioneer-preliminary.zip
+2021-11-04 Pioneer League (12 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-11-04-pioneer-league.zip
+2021-11-07 Pioneer Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-11-07-pioneer-challenge.zip
+2021-11-08 Pioneer Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-11-08-pioneer-challenge.zip
+2021-11-08 Pioneer League (13 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-11-08-pioneer-league.zip
diff --git a/forge-gui/res/lists/net-decks-archive-standard.txt b/forge-gui/res/lists/net-decks-archive-standard.txt
index 02745e35a0c..6423e7eba52 100644
--- a/forge-gui/res/lists/net-decks-archive-standard.txt
+++ b/forge-gui/res/lists/net-decks-archive-standard.txt
@@ -2522,3 +2522,11 @@
2021-10-24 Standard Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/standard/2021-10-24-standard-challenge.zip
2021-10-25 Standard Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/standard/2021-10-25-standard-challenge.zip
2021-10-25 Standard League (8 decks) | https://downloads.cardforge.org/decks/archive/standard/2021-10-25-standard-league.zip
+2021-10-28 Standard League (6 decks) | https://downloads.cardforge.org/decks/archive/standard/2021-10-28-standard-league.zip
+2021-10-31 Standard Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/standard/2021-10-31-standard-challenge.zip
+2021-11-01 Standard Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/standard/2021-11-01-standard-challenge.zip
+2021-11-01 Standard League (8 decks) | https://downloads.cardforge.org/decks/archive/standard/2021-11-01-standard-league.zip
+2021-11-04 Standard League (10 decks) | https://downloads.cardforge.org/decks/archive/standard/2021-11-04-standard-league.zip
+2021-11-07 Standard Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/standard/2021-11-07-standard-challenge.zip
+2021-11-08 Standard Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/standard/2021-11-08-standard-challenge.zip
+2021-11-08 Standard League (9 decks) | https://downloads.cardforge.org/decks/archive/standard/2021-11-08-standard-league.zip
diff --git a/forge-gui/res/lists/net-decks-archive-vintage.txt b/forge-gui/res/lists/net-decks-archive-vintage.txt
index 70032f261ca..ad699c75e9d 100644
--- a/forge-gui/res/lists/net-decks-archive-vintage.txt
+++ b/forge-gui/res/lists/net-decks-archive-vintage.txt
@@ -1540,3 +1540,10 @@
2021-10-24 Vintage Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/vintage/2021-10-24-vintage-challenge.zip
2021-10-24 Vintage League (9 decks) | https://downloads.cardforge.org/decks/archive/vintage/2021-10-24-vintage-league.zip
2021-10-25 Vintage Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/vintage/2021-10-25-vintage-challenge.zip
+2021-10-30 Vintage Preliminary (3 decks) | https://downloads.cardforge.org/decks/archive/vintage/2021-10-30-vintage-preliminary.zip
+2021-10-31 Vintage Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/vintage/2021-10-31-vintage-challenge.zip
+2021-10-31 Vintage League (12 decks) | https://downloads.cardforge.org/decks/archive/vintage/2021-10-31-vintage-league.zip
+2021-11-01 Vintage Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/vintage/2021-11-01-vintage-challenge.zip
+2021-11-07 Vintage Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/vintage/2021-11-07-vintage-challenge.zip
+2021-11-07 Vintage League (14 decks) | https://downloads.cardforge.org/decks/archive/vintage/2021-11-07-vintage-league.zip
+2021-11-08 Vintage Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/vintage/2021-11-08-vintage-challenge.zip
diff --git a/forge-gui/res/lists/planeswalker-achievements.txt b/forge-gui/res/lists/planeswalker-achievements.txt
index 72c22a32278..fdf9108deb5 100644
--- a/forge-gui/res/lists/planeswalker-achievements.txt
+++ b/forge-gui/res/lists/planeswalker-achievements.txt
@@ -23,6 +23,7 @@ Chandra Ablaze|Chandra's Bargain|I feel like I've seen those before...
Chandra Nalaar|Chandra's Rage|Feel the power of my wrath!
Chandra, Awakened Inferno|Chandra's Utter Disintegration|Is it hot here or is it just me?
Chandra, Bold Pyromancer|Chandra's Flame Wave|Let's have a campfire!
+Chandra, Dressed to Kill|Chandra's Red Wedding|She's pretty in pink, cute in crimson, and mighty in maroon.
Chandra, Fire Artisan|Chandra's Fiery Rush|Combo time!
Chandra, Flame's Catalyst|Chandra's Sudden Epiphany|Forget everything you know and believe that everything is possible.
Chandra, Flame's Fury|Chandra's Lake of Flame|Come in! The fire's great!
@@ -89,6 +90,7 @@ Jaya Ballard|Jaya's Flashback|Fire is easily rekindled.
Karn Liberated|Karn's Reset|Let's do this again!
Kasmina, Enigma Sage|Kasmina's Private Tutoring|This will be on the spelling test next week.
Kaya the Inexorable|Kaya's Dimensional Breach|A little help here?
+Kaya, Geist Hunter|Kaya's Graf Liberation|Who would you like to call?
Kaya, Ghost Assassin|Kaya's Syphon|You don't MIND, do you?
Kaya, Orzhov Usurper|Kaya's Revenge of Emptiness|Nothing I do can hurt you. Literally.
Kiora, Master of the Depths|Kiora's Fight Club|First rule is not to talk about the sucker punches
@@ -152,6 +154,7 @@ Sarkhan, the Dragonspeaker|Sarkhan's Voices|Huh? What are you saying?
Sarkhan Unbroken|Sarkhan's Dragonstorm|Skies full of dragons! Oh, what a glorious day!
Serra the Benevolent|Serra's Worship Service|As long as you have belief in me, you shall not die.
Sorin Markov|Sorin's Hypnosis|You're getting sleepy... very sleepy...
+Sorin the Mirthless|Sorin's Unlucky Strike|Not very funny when it happens to you, is it?
Sorin, Grim Nemesis|Sorin's Vampire Army|Taste the might of my blood relatives!
Sorin, Imperious Bloodlord|Sorin's Progeny|Welcome to your new life. You serve me now.
Sorin, Lord of Innistrad|Sorin's Recruitment|My favorite game is Shogi!
diff --git a/forge-gui/res/quest/precons/Ashiok, Sculptor of Fears.dck b/forge-gui/res/quest/precons/Ashiok, Sculptor of Fears.dck
index d1c983bf8d4..1307550d94f 100644
--- a/forge-gui/res/quest/precons/Ashiok, Sculptor of Fears.dck
+++ b/forge-gui/res/quest/precons/Ashiok, Sculptor of Fears.dck
@@ -6,7 +6,7 @@ Credits=1200
MinDifficulty=0
MaxDifficulty=5
[metadata]
-Description=Ashiok has power to torment foes by conjuring their darkest memories, fears, and regrets. With Ashiok’s deck, you’ll fill your graveyard along with your opponent’s for massive value as you slowly drive them insane.
+Description=Ashiok has power to torment foes by conjuring their darkest memories, fears, and regrets. With Ashiok's deck, you'll fill your graveyard along with your opponent's for massive value as you slowly drive them insane.
Set=THB
Image=ashiok_sculptor_of_fears.jpg
[Main]
diff --git a/forge-gui/res/quest/precons/Chandra, Flames Catalyst.dck b/forge-gui/res/quest/precons/Chandra, Flames Catalyst.dck
index c4ddfe0c99f..78fdf8cacc4 100644
--- a/forge-gui/res/quest/precons/Chandra, Flames Catalyst.dck
+++ b/forge-gui/res/quest/precons/Chandra, Flames Catalyst.dck
@@ -5,7 +5,7 @@ MinDifficulty=0
MaxDifficulty=5
[metadata]
Name=Chandra, Flame's Catalyst
-Description=As you can expect from Chandra, there’s a lot of burning going on in this deck. Burn your opponents, burn their creatures, and make you aggressive creatures grow while you’re at it.
+Description=As you can expect from Chandra, there's a lot of burning going on in this deck. Burn your opponents, burn their creatures, and make you aggressive creatures grow while you're at it.
Deck Type=constructed
Set=M21
Image=chandra_flames_catalyst.jpg
diff --git a/forge-gui/res/quest/precons/Elspeth, Undaunted Hero.dck b/forge-gui/res/quest/precons/Elspeth, Undaunted Hero.dck
index 68ee479c7cf..df7a2183b62 100644
--- a/forge-gui/res/quest/precons/Elspeth, Undaunted Hero.dck
+++ b/forge-gui/res/quest/precons/Elspeth, Undaunted Hero.dck
@@ -6,7 +6,7 @@ Credits=1200
MinDifficulty=0
MaxDifficulty=5
[metadata]
-Description=Elspeth is a renowned warrior, who has defeated everything from gods to death itself. With Elspeth’s deck, you’ll build up a battalion of devoted soldiers and lead them fearlessly to a glorious victory.
+Description=Elspeth is a renowned warrior, who has defeated everything from gods to death itself. With Elspeth's deck, you'll build up a battalion of devoted soldiers and lead them fearlessly to a glorious victory.
Set=THB
Image=elspeth_undaunted_hero.jpg
[Main]
diff --git a/forge-gui/res/tokenscripts/g_3_1_boar.txt b/forge-gui/res/tokenscripts/g_3_1_boar.txt
new file mode 100644
index 00000000000..b7a83de9d3c
--- /dev/null
+++ b/forge-gui/res/tokenscripts/g_3_1_boar.txt
@@ -0,0 +1,6 @@
+Name:Boar
+Colors:green
+ManaCost:no cost
+PT:3/1
+Types:Creature Boar
+Oracle:
diff --git a/forge-gui/res/tokenscripts/g_3_3_dinosaur_trample.txt b/forge-gui/res/tokenscripts/g_3_3_dinosaur_trample.txt
index 7bd05d339de..0c1f2614b54 100644
--- a/forge-gui/res/tokenscripts/g_3_3_dinosaur_trample.txt
+++ b/forge-gui/res/tokenscripts/g_3_3_dinosaur_trample.txt
@@ -4,4 +4,4 @@ Types:Creature Dinosaur
Colors:green
PT:3/3
K:Trample
-Oracle:Trample (This creature can deal excess combat damage to the player or planeswalker it’s attacking.)
+Oracle:Trample (This creature can deal excess combat damage to the player or planeswalker it's attacking.)
diff --git a/forge-gui/res/tokenscripts/wb_1_1_vampire_lifelink.txt b/forge-gui/res/tokenscripts/wb_1_1_vampire_lifelink.txt
new file mode 100644
index 00000000000..c087c941b6a
--- /dev/null
+++ b/forge-gui/res/tokenscripts/wb_1_1_vampire_lifelink.txt
@@ -0,0 +1,7 @@
+Name:Vampire
+ManaCost:no cost
+Types:Creature Vampire
+Colors:white,black
+PT:1/1
+K:Lifelink
+Oracle:Lifelink
diff --git a/forge-gui/src/main/java/forge/deck/DeckImportController.java b/forge-gui/src/main/java/forge/deck/DeckImportController.java
index 5d341d6a9bd..cede55f28de 100644
--- a/forge-gui/src/main/java/forge/deck/DeckImportController.java
+++ b/forge-gui/src/main/java/forge/deck/DeckImportController.java
@@ -407,6 +407,8 @@ public class DeckImportController {
boolean isExpansionTheMajorityInThePool = (cardArtReferencePool.getTheMostFrequentEditionType() == CardEdition.Type.EXPANSION);
boolean isPoolModernFramed = cardArtReferencePool.isModern();
CardEdition pivotEdition = cardArtReferencePool.getPivotCardEdition(isCardArtPreferenceLatestArt);
+ if (pivotEdition == null)
+ continue;
Date releaseDatePivotEdition = pivotEdition.getDate();
List tokensToOptimise = tokensPerSectionWithNoSet.get(section);
diff --git a/forge-gui/src/main/java/forge/gamemodes/match/input/InputBase.java b/forge-gui/src/main/java/forge/gamemodes/match/input/InputBase.java
index d69b681c895..5a52d579371 100644
--- a/forge-gui/src/main/java/forge/gamemodes/match/input/InputBase.java
+++ b/forge-gui/src/main/java/forge/gamemodes/match/input/InputBase.java
@@ -134,7 +134,18 @@ public abstract class InputBase implements java.io.Serializable, Input {
final StringBuilder sb = new StringBuilder();
Localizer localizer = Localizer.getInstance();
sb.append(localizer.getMessage("lblPriority")).append(": ").append(ph.getPriorityPlayer()).append("\n");
- sb.append(localizer.getMessage("lblTurn")).append(": ").append(ph.getTurn()).append(" (").append(ph.getPlayerTurn()).append(")\n");
+ sb.append(localizer.getMessage("lblTurn")).append(": ").append(ph.getTurn()).append(" (").append(ph.getPlayerTurn()).append(")");
+
+ if (!game.isNeitherDayNorNight()) {
+ sb.append(" [");
+
+ String dayLabel = game.isDay() ? "Day" : "Night";
+
+ sb.append(Localizer.getInstance().getMessage("lbl" + dayLabel));
+ sb.append("]");
+ }
+
+ sb.append("\n");
sb.append(localizer.getMessage("lblPhase")).append(": ").append(ph.getPhase().nameForUi).append("\n");
sb.append(localizer.getMessage("lblStack")).append(": ");
if (!game.getStack().isEmpty()) {
diff --git a/forge-gui/src/main/java/forge/gui/card/CardScriptParser.java b/forge-gui/src/main/java/forge/gui/card/CardScriptParser.java
index f374adc7930..33e4d8aee94 100644
--- a/forge-gui/src/main/java/forge/gui/card/CardScriptParser.java
+++ b/forge-gui/src/main/java/forge/gui/card/CardScriptParser.java
@@ -442,7 +442,7 @@ public final class CardScriptParser {
"HasDevoured", "HasNotDevoured", "IsMonstrous", "IsNotMonstrous",
"CostsPhyrexianMana", "IsRemembered", "IsNotRemembered",
"IsImprinted", "IsNotImprinted", "hasActivatedAbilityWithTapCost",
- "hasActivatedAbility", "hasManaAbility",
+ "hasActivatedAbility", "hasManaAbility", "withoutManaAbility",
"hasNonManaActivatedAbility", "NoAbilities", "HasCounters",
"wasNotCast", "ChosenType", "IsNotChosenType", "IsCommander",
"IsNotCommander","IsRenowned", "IsNotRenowned");
diff --git a/forge-gui/src/main/java/forge/player/HumanCostDecision.java b/forge-gui/src/main/java/forge/player/HumanCostDecision.java
index 1e9297da736..96ae4850e45 100644
--- a/forge-gui/src/main/java/forge/player/HumanCostDecision.java
+++ b/forge-gui/src/main/java/forge/player/HumanCostDecision.java
@@ -48,12 +48,17 @@ public class HumanCostDecision extends CostDecisionMakerBase {
private final PlayerControllerHuman controller;
private final SpellAbility ability;
private final Card source;
+ private String orString = null;
public HumanCostDecision(final PlayerControllerHuman controller, final Player p, final SpellAbility sa, final Card source) {
+ this(controller, p, sa, source, null);
+ }
+ public HumanCostDecision(final PlayerControllerHuman controller, final Player p, final SpellAbility sa, final Card source, final String orString) {
super(p);
this.controller = controller;
ability = sa;
this.source = source;
+ this.orString = orString;
}
@Override
@@ -201,18 +206,35 @@ public class HumanCostDecision extends CostDecisionMakerBase {
@Override
public PaymentDecision visit(final CostDraw cost) {
- final String amount = cost.getAmount();
-
- Integer c = cost.convertAmount();
- if (c == null) {
- c = AbilityUtils.calculateAmount(source, amount, ability);
- }
-
- if (!controller.confirmPayment(cost, Localizer.getInstance().getMessage("lblDrawNCardsConfirm", String.valueOf(c)), ability)) {
+ if (!cost.canPay(ability, player)) {
return null;
}
- return PaymentDecision.number(c);
+ Integer c = cost.convertAmount();
+ if (c == null) {
+ c = AbilityUtils.calculateAmount(source, cost.getAmount(), ability);
+ }
+
+ List res = cost.getPotentialPlayers(player, ability);
+
+ String message = null;
+ if (orString != null && !orString.isEmpty()) {
+ if (res.contains(player)) {
+ message = Localizer.getInstance().getMessage("lblDoYouWantLetThatPlayerDrawNCardOrDoAction", String.valueOf(c), orString);
+ } else {
+ message = Localizer.getInstance().getMessage("lblDoYouWantDrawNCardOrDoAction", String.valueOf(c), orString);
+ }
+ } else {
+ message = Localizer.getInstance().getMessage("lblDrawNCardsConfirm", String.valueOf(c));
+ }
+
+ if (!controller.confirmPayment(cost, message, ability)) {
+ return null;
+ }
+
+ PaymentDecision decision = PaymentDecision.players(res);
+ decision.c = c;
+ return decision;
}
@Override
@@ -382,11 +404,11 @@ public class HumanCostDecision extends CostDecisionMakerBase {
origin.add(cost.from);
final CardCollection exiled = new CardCollection();
- final List chosen = controller.chooseCardsForZoneChange(ZoneType.Exile, origin, sa, typeList, nNeeded,
+ final List chosen = controller.chooseCardsForZoneChange(ZoneType.Exile, origin, sa, typeList, 0,
nNeeded, null, cost.toString(), null);
exiled.addAll(chosen);
- if (exiled.isEmpty()) {
+ if (exiled.size() < nNeeded) {
return null;
}
return PaymentDecision.card(exiled);
@@ -556,7 +578,14 @@ public class HumanCostDecision extends CostDecisionMakerBase {
c = AbilityUtils.calculateAmount(source, amount, ability);
}
- if (!controller.confirmPayment(cost, Localizer.getInstance().getMessage("lblMillNCardsFromYourLibraryConfirm", String.valueOf(c)), ability)) {
+ String message = null;
+ if (orString != null && !orString.isEmpty()) {
+ message = Localizer.getInstance().getMessage("lblDoYouWantMillNCardsOrDoAction", String.valueOf(amount), orString);
+ } else {
+ message = Localizer.getInstance().getMessage("lblMillNCardsFromYourLibraryConfirm", String.valueOf(c));
+ }
+
+ if (!controller.confirmPayment(cost, message, ability)) {
return null;
}
return PaymentDecision.number(c);
@@ -571,8 +600,19 @@ public class HumanCostDecision extends CostDecisionMakerBase {
c = AbilityUtils.calculateAmount(source, amount, ability);
}
+ if (ability.getPayCosts().isMandatory()) {
+ return PaymentDecision.number(c);
+ }
+
+ String message = null;
+ if (orString != null && !orString.isEmpty()) {
+ message = Localizer.getInstance().getMessage("lblDoYouWantPayNLife", String.valueOf(amount), orString);
+ } else {
+ message = Localizer.getInstance().getMessage("lblPayNLifeConfirm", String.valueOf(c));
+ }
+
// for costs declared mandatory, this is only reachable with a valid amount
- if (ability.getPayCosts().isMandatory() || (player.canPayLife(c) && controller.confirmPayment(cost, Localizer.getInstance().getMessage("lblPayNLifeConfirm", String.valueOf(c)), ability))) {
+ if (player.canPayLife(c) && controller.confirmPayment(cost, message, ability)) {
return PaymentDecision.number(c);
}
return null;
diff --git a/forge-gui/src/main/java/forge/player/HumanPlay.java b/forge-gui/src/main/java/forge/player/HumanPlay.java
index 8279014a25b..50589a6aa06 100644
--- a/forge-gui/src/main/java/forge/player/HumanPlay.java
+++ b/forge-gui/src/main/java/forge/player/HumanPlay.java
@@ -262,55 +262,30 @@ public class HumanPlay {
}
}
- final HumanCostDecision hcd = new HumanCostDecision(controller, p, sourceAbility, source);
+ final HumanCostDecision hcd = new HumanCostDecision(controller, p, sourceAbility, source, orString);
boolean mandatory = cost.isMandatory();
//the following costs do not need inputs
for (CostPart part : parts) {
+ // early bail to check if the part can be paid
+ if (!part.canPay(sourceAbility, p)) {
+ return false;
+ }
+
boolean mayRemovePart = true;
- if (part instanceof CostPayLife) {
- final int amount = getAmountFromPart(part, source, sourceAbility);
- if (!p.canPayLife(amount)) {
- return false;
- }
-
- if (!p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblDoYouWantPayNLife", String.valueOf(amount)) + orString, sourceAbility)) {
- return false;
- }
-
- p.payLife(amount, null);
- }
- else if (part instanceof CostDraw) {
- final int amount = getAmountFromPart(part, source, sourceAbility);
- List res = new ArrayList<>();
- String type = part.getType();
- for (Player player : p.getGame().getPlayers()) {
- if (player.isValid(type, p, source, sourceAbility) && player.canDraw()) {
- res.add(player);
- }
- }
-
- if (res.isEmpty()) {
- return false;
- }
-
- String message = null;
- if (res.contains(p)) {
- message = Localizer.getInstance().getMessage("lblDoYouWantLetThatPlayerDrawNCardOrDoAction", String.valueOf(amount), orString);
- } else {
- message = Localizer.getInstance().getMessage("lblDoYouWantDrawNCardOrDoAction", String.valueOf(amount), orString);
- }
-
- if (!p.getController().confirmPayment(part, message, sourceAbility)) {
- return false;
- }
-
- for (Player player : res) {
- player.drawCards(amount, sourceAbility);
- }
- }
- else if (part instanceof CostGainLife) {
+ // simplified costs that can use the HCD
+ if (part instanceof CostPayLife
+ || part instanceof CostDraw
+ || part instanceof CostGainLife
+ || part instanceof CostFlipCoin
+ || part instanceof CostRollDice
+ || part instanceof CostDamage
+ || part instanceof CostPutCounter
+ || part instanceof CostRemoveCounter
+ || part instanceof CostRemoveAnyCounter
+ || part instanceof CostMill
+ || part instanceof CostSacrifice) {
PaymentDecision pd = part.accept(hcd);
if (pd == null) {
@@ -332,81 +307,6 @@ public class HumanPlay {
}
part.payAsDecided(p, pd, sourceAbility);
}
- else if (part instanceof CostMill) {
- final int amount = getAmountFromPart(part, source, sourceAbility);
- final CardCollectionView list = p.getCardsIn(ZoneType.Library);
- if (list.size() < amount) { return false; }
- if (!p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblDoYouWantMillNCardsOrDoAction", String.valueOf(amount), orString), sourceAbility)) {
- return false;
- }
- CardCollectionView listmill = p.getCardsIn(ZoneType.Library, amount);
- ((CostMill) part).payAsDecided(p, PaymentDecision.card(listmill), sourceAbility);
- }
- else if (part instanceof CostFlipCoin) {
- if (!part.canPay(sourceAbility, p)) {
- return false;
- }
-
- PaymentDecision pd = part.accept(hcd);
-
- if (pd == null) {
- return false;
- }
- part.payAsDecided(p, pd, sourceAbility);
- }
- else if (part instanceof CostRollDice) {
- if (!part.canPay(sourceAbility, p)) {
- return false;
- }
-
- PaymentDecision pd = part.accept(hcd);
-
- if (pd == null) {
- return false;
- }
- part.payAsDecided(p, pd, sourceAbility);
- }
- else if (part instanceof CostDamage) {
- if (!part.canPay(sourceAbility, p)) {
- return false;
- }
-
- // not a pay life but damage!
- PaymentDecision pd = part.accept(hcd);
-
- if (pd == null) {
- return false;
- }
- part.payAsDecided(p, pd, sourceAbility);
- }
- else if (part instanceof CostPutCounter) {
- if (!part.canPay(sourceAbility, p)) {
- return false;
- }
-
- PaymentDecision pd = part.accept(hcd);
-
- if (pd == null) {
- return false;
- }
- part.payAsDecided(p, pd, sourceAbility);
- }
- else if (part instanceof CostRemoveCounter) {
- PaymentDecision pd = part.accept(hcd);
-
- if (pd == null) {
- return false;
- }
- part.payAsDecided(p, pd, sourceAbility);
- }
- else if (part instanceof CostRemoveAnyCounter) {
- PaymentDecision pd = part.accept(hcd);
-
- if (pd == null) {
- return false;
- }
- part.payAsDecided(p, pd, sourceAbility);
- }
else if (part instanceof CostExile) {
CostExile costExile = (CostExile) part;
@@ -553,13 +453,6 @@ public class HumanPlay {
}
return true;
}
- else if (part instanceof CostSacrifice) {
- PaymentDecision pd = part.accept(hcd);
- if (pd == null) {
- return false;
- }
- part.payAsDecided(p, pd, sourceAbility);
- }
else if (part instanceof CostGainControl) {
int amount = Integer.parseInt(part.getAmount());
CardCollectionView list = CardLists.getValidCards(p.getGame().getCardsIn(ZoneType.Battlefield), part.getType(), p, source, sourceAbility);
@@ -581,7 +474,7 @@ public class HumanPlay {
((CostDiscard)part).payAsDecided(p, PaymentDecision.card(p.getCardsIn(ZoneType.Hand)), sourceAbility);
} else if ("Random".equals(part.getType())) {
- if (!part.canPay(sourceAbility, p) || !p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblWouldYouLikeRandomDiscardTargetCard", amount), sourceAbility)) {
+ if (!p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblWouldYouLikeRandomDiscardTargetCard", amount), sourceAbility)) {
return false;
}
@@ -615,10 +508,6 @@ public class HumanPlay {
CounterType counterType = CounterType.get(CounterEnumType.ENERGY);
int amount = getAmountFromPartX(part, source, sourceAbility);
- if (!part.canPay(sourceAbility, p)) {
- return false;
- }
-
if (!mandatory && !p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblDoYouWantSpendNTargetTypeCounter", String.valueOf(amount), counterType.getName()), sourceAbility)) {
return false;
}
@@ -677,7 +566,6 @@ public class HumanPlay {
return true;
}
-
private static boolean handleOfferingConvokeAndDelve(final SpellAbility ability, CardCollection cardsToDelve, boolean manaInputCancelled) {
Card hostCard = ability.getHostCard();
final Game game = hostCard.getGame();
diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java
index a2960771422..6546810ffb0 100644
--- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java
+++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java
@@ -1191,6 +1191,10 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont
for (String part : splitUTypes) {
if (c.getType().hasStringType(part)) {
return true;
+ } else if (part.equals("Basic Land")) {
+ if (c.isBasicLand()) {
+ return true;
+ }
}
}
}
@@ -1201,9 +1205,9 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont
StringBuilder promptType = new StringBuilder();
for (String part : splitUTypes) {
if (n==1) {
- promptType.append(part);
+ promptType.append(part.toLowerCase());
} else {
- promptType.append(" or ").append(part);
+ promptType.append(" or ").append(part.toLowerCase());
}
n++;
}
diff --git a/forge-lda/pom.xml b/forge-lda/pom.xml
index a6dfe97b03a..8dbb003f21f 100644
--- a/forge-lda/pom.xml
+++ b/forge-lda/pom.xml
@@ -4,7 +4,7 @@
forge
forge
- 1.6.46-SNAPSHOT
+ 1.6.47-SNAPSHOT
forge-lda
diff --git a/pom.xml b/pom.xml
index b698310c92a..4407ff738e6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
forge
pom
Forge Parent
- 1.6.46-SNAPSHOT
+ 1.6.47-SNAPSHOT
Forge lets you play the card game Magic: The Gathering against a computer opponent using all of the rules.