diff --git a/forge-ai/pom.xml b/forge-ai/pom.xml
index ec14ef4f065..86ceb211dab 100644
--- a/forge-ai/pom.xml
+++ b/forge-ai/pom.xml
@@ -6,7 +6,7 @@
forge
forge
- 1.6.26-SNAPSHOT
+ 1.6.27-SNAPSHOT
forge-ai
diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java
index 557ab6c1ef9..de72afa9903 100644
--- a/forge-ai/src/main/java/forge/ai/AiController.java
+++ b/forge-ai/src/main/java/forge/ai/AiController.java
@@ -1778,7 +1778,7 @@ public class AiController {
+ MyRandom.getRandom().nextInt(3);
return Math.max(remaining, min) / 2;
} else if ("LowestLoseLife".equals(logic)) {
- return MyRandom.getRandom().nextInt(Math.min(player.getLife() / 3, ComputerUtil.getOpponentFor(player).getLife())) + 1;
+ return MyRandom.getRandom().nextInt(Math.min(player.getLife() / 3, player.getWeakestOpponent().getLife())) + 1;
} else if ("HighestGetCounter".equals(logic)) {
return MyRandom.getRandom().nextInt(3);
} else if (source.hasSVar("EnergyToPay")) {
diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java
index 12f984154c9..e013f26d785 100644
--- a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java
+++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java
@@ -521,7 +521,7 @@ public class ComputerUtilCard {
*/
public static CardCollectionView getLikelyBlockers(final Player ai, final CardCollectionView blockers) {
AiBlockController aiBlk = new AiBlockController(ai);
- final Player opp = ComputerUtil.getOpponentFor(ai);
+ final Player opp = ai.getWeakestOpponent();
Combat combat = new Combat(opp);
//Use actual attackers if available, else consider all possible attackers
Combat currentCombat = ai.getGame().getCombat();
@@ -884,7 +884,7 @@ public class ComputerUtilCard {
List chosen = new ArrayList();
Player ai = sa.getActivatingPlayer();
final Game game = ai.getGame();
- Player opp = ComputerUtil.getOpponentFor(ai);
+ Player opp = ai.getWeakestOpponent();
if (sa.hasParam("AILogic")) {
final String logic = sa.getParam("AILogic");
@@ -974,7 +974,7 @@ public class ComputerUtilCard {
public static boolean useRemovalNow(final SpellAbility sa, final Card c, final int dmg, ZoneType destination) {
final Player ai = sa.getActivatingPlayer();
final AiController aic = ((PlayerControllerAi)ai.getController()).getAi();
- final Player opp = ComputerUtil.getOpponentFor(ai);
+ final Player opp = ai.getWeakestOpponent();
final Game game = ai.getGame();
final PhaseHandler ph = game.getPhaseHandler();
final PhaseType phaseType = ph.getPhase();
@@ -1269,7 +1269,7 @@ public class ComputerUtilCard {
}
}
- final Player opp = ComputerUtil.getOpponentFor(ai);
+ final Player opp = ai.getWeakestOpponent();
Card pumped = getPumpedCreature(ai, sa, c, toughness, power, keywords);
List oppCreatures = opp.getCreaturesInPlay();
float chance = 0;
@@ -1842,17 +1842,45 @@ public class ComputerUtilCard {
String needsToPlayName = isRightSplit ? "SplitNeedsToPlay" : "NeedsToPlay";
String needsToPlayVarName = isRightSplit ? "SplitNeedsToPlayVar" : "NeedsToPlayVar";
- if (sa != null && sa.isEvoke()) {
- if (card.hasSVar("NeedsToPlayEvoked")) {
- needsToPlayName = "NeedsToPlayEvoked";
- }
- if (card.hasSVar("NeedsToPlayEvokedVar")) {
- needsToPlayVarName = "NeedsToPlayEvokedVar";
+ // TODO: if there are ever split cards with Evoke or Kicker, factor in the right split option above
+ if (sa != null) {
+ if (sa.isEvoke()) {
+ // if the spell is evoked, will use NeedsToPlayEvoked if available (otherwise falls back to NeedsToPlay)
+ if (card.hasSVar("NeedsToPlayEvoked")) {
+ needsToPlayName = "NeedsToPlayEvoked";
+ }
+ if (card.hasSVar("NeedsToPlayEvokedVar")) {
+ needsToPlayVarName = "NeedsToPlayEvokedVar";
+ }
+ } else if (sa.isKicked()) {
+ // if the spell is kicked, uses NeedsToPlayKicked if able and locks out the regular NeedsToPlay check
+ // for unkicked spells, uses NeedsToPlay
+ if (card.hasSVar("NeedsToPlayKicked")) {
+ needsToPlayName = "NeedsToPlayKicked";
+ } else {
+ needsToPlayName = "UNUSED";
+ }
+ if (card.hasSVar("NeedsToPlayKickedVar")) {
+ needsToPlayVarName = "NeedsToPlayKickedVar";
+ } else {
+ needsToPlayVarName = "UNUSED";
+ }
}
}
if (card.hasSVar(needsToPlayName)) {
final String needsToPlay = card.getSVar(needsToPlayName);
+
+ // A special case which checks that this creature will attack if it's the AI's turn
+ if (needsToPlay.equalsIgnoreCase("WillAttack")) {
+ if (game.getPhaseHandler().isPlayerTurn(sa.getActivatingPlayer())) {
+ return ComputerUtilCard.doesSpecifiedCreatureAttackAI(sa.getActivatingPlayer(), card) ?
+ AiPlayDecision.WillPlay : AiPlayDecision.BadEtbEffects;
+ } else {
+ return AiPlayDecision.WillPlay; // not our turn, skip this check for the possible Flash use etc.
+ }
+ }
+
CardCollectionView list = game.getCardsIn(ZoneType.Battlefield);
list = CardLists.getValidCards(list, needsToPlay.split(","), card.getController(), card, null);
diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java
index fcd1f648a49..8685990addf 100644
--- a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java
+++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java
@@ -635,7 +635,7 @@ public class ComputerUtilCost {
&& (!source.getName().equals("Tyrannize") || payer.getCardsIn(ZoneType.Hand).size() > 2)
&& (!source.getName().equals("Perplex") || payer.getCardsIn(ZoneType.Hand).size() < 2)
&& (!source.getName().equals("Breaking Point") || payer.getCreaturesInPlay().size() > 1)
- && (!source.getName().equals("Chain of Vapor") || (ComputerUtil.getOpponentFor(payer).getCreaturesInPlay().size() > 0 && payer.getLandsInPlay().size() > 3));
+ && (!source.getName().equals("Chain of Vapor") || (payer.getWeakestOpponent().getCreaturesInPlay().size() > 0 && payer.getLandsInPlay().size() > 3));
}
public static Set getAvailableManaColors(Player ai, Card additionalLand) {
diff --git a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java
index 2365e971abc..df01caaf238 100644
--- a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java
+++ b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java
@@ -1105,7 +1105,7 @@ public class PlayerControllerAi extends PlayerController {
public String chooseCardName(SpellAbility sa, Predicate cpp, String valid, String message) {
if (sa.hasParam("AILogic")) {
CardCollectionView aiLibrary = player.getCardsIn(ZoneType.Library);
- CardCollectionView oppLibrary = ComputerUtil.getOpponentFor(player).getCardsIn(ZoneType.Library);
+ CardCollectionView oppLibrary = player.getWeakestOpponent().getCardsIn(ZoneType.Library);
final Card source = sa.getHostCard();
final String logic = sa.getParam("AILogic");
@@ -1227,6 +1227,18 @@ public class PlayerControllerAi extends PlayerController {
// Choose the optional cost if it can be paid (to be improved later, check for playability and other conditions perhaps)
Cost fullCost = opt.getCost().copy().add(costSoFar);
SpellAbility fullCostSa = chosen.copyWithDefinedCost(fullCost);
+
+ // Playability check for Kicker
+ if (opt.getType() == OptionalCost.Kicker1 || opt.getType() == OptionalCost.Kicker2) {
+ SpellAbility kickedSaCopy = fullCostSa.copy();
+ kickedSaCopy.addOptionalCost(opt.getType());
+ Card copy = CardUtil.getLKICopy(chosen.getHostCard());
+ copy.addOptionalCostPaid(opt.getType());
+ if (ComputerUtilCard.checkNeedsToPlayReqs(copy, kickedSaCopy) != AiPlayDecision.WillPlay) {
+ continue; // don't choose kickers we don't want to play
+ }
+ }
+
if (ComputerUtilCost.canPayCost(fullCostSa, player)) {
chosenOptCosts.add(opt);
costSoFar.add(opt.getCost());
diff --git a/forge-ai/src/main/java/forge/ai/ability/ActivateAbilityAi.java b/forge-ai/src/main/java/forge/ai/ability/ActivateAbilityAi.java
index 7eba97960da..44780ec2e94 100644
--- a/forge-ai/src/main/java/forge/ai/ability/ActivateAbilityAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/ActivateAbilityAi.java
@@ -1,6 +1,5 @@
package forge.ai.ability;
-import forge.ai.ComputerUtil;
import forge.ai.SpellAbilityAi;
import forge.game.ability.AbilityUtils;
import forge.game.card.Card;
@@ -22,7 +21,7 @@ public class ActivateAbilityAi extends SpellAbilityAi {
final TargetRestrictions tgt = sa.getTargetRestrictions();
final Card source = sa.getHostCard();
- final Player opp = ComputerUtil.getOpponentFor(ai);
+ final Player opp = ai.getWeakestOpponent();
boolean randomReturn = MyRandom.getRandom().nextFloat() <= Math.pow(.6667, sa.getActivationsThisTurn());
List list = CardLists.getType(opp.getCardsIn(ZoneType.Battlefield), sa.getParamOrDefault("Type", "Card"));
@@ -46,7 +45,7 @@ public class ActivateAbilityAi extends SpellAbilityAi {
@Override
protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) {
- final Player opp = ComputerUtil.getOpponentFor(ai);
+ final Player opp = ai.getWeakestOpponent();
final TargetRestrictions tgt = sa.getTargetRestrictions();
final Card source = sa.getHostCard();
@@ -87,7 +86,7 @@ public class ActivateAbilityAi extends SpellAbilityAi {
}
} else {
sa.resetTargets();
- sa.getTargets().add(ComputerUtil.getOpponentFor(ai));
+ sa.getTargets().add(ai.getWeakestOpponent());
}
return randomReturn;
diff --git a/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java b/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java
index 42a5831ed7b..0ba446e250e 100644
--- a/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java
@@ -78,13 +78,13 @@ public class AnimateAi extends SpellAbilityAi {
num = (num == null) ? "1" : num;
final int nToSac = AbilityUtils.calculateAmount(topStack.getHostCard(), num, topStack);
CardCollection list = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid.split(","),
- ComputerUtil.getOpponentFor(ai), topStack.getHostCard(), topStack);
+ ai.getWeakestOpponent(), topStack.getHostCard(), topStack);
list = CardLists.filter(list, CardPredicates.canBeSacrificedBy(topStack));
ComputerUtilCard.sortByEvaluateCreature(list);
if (!list.isEmpty() && list.size() == nToSac && ComputerUtilCost.canPayCost(sa, ai)) {
Card animatedCopy = becomeAnimated(source, sa);
list.add(animatedCopy);
- list = CardLists.getValidCards(list, valid.split(","), ComputerUtil.getOpponentFor(ai), topStack.getHostCard(),
+ list = CardLists.getValidCards(list, valid.split(","), ai.getWeakestOpponent(), topStack.getHostCard(),
topStack);
list = CardLists.filter(list, CardPredicates.canBeSacrificedBy(topStack));
if (ComputerUtilCard.evaluateCreature(animatedCopy) < ComputerUtilCard.evaluateCreature(list.get(0))
diff --git a/forge-ai/src/main/java/forge/ai/ability/BalanceAi.java b/forge-ai/src/main/java/forge/ai/ability/BalanceAi.java
index b5576134334..9aba6e53fe9 100644
--- a/forge-ai/src/main/java/forge/ai/ability/BalanceAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/BalanceAi.java
@@ -1,6 +1,5 @@
package forge.ai.ability;
-import forge.ai.ComputerUtil;
import forge.ai.SpellAbilityAi;
import forge.game.card.CardCollectionView;
import forge.game.card.CardLists;
@@ -17,7 +16,7 @@ public class BalanceAi extends SpellAbilityAi {
int diff = 0;
// TODO Add support for multiplayer logic
- final Player opp = ComputerUtil.getOpponentFor(aiPlayer);
+ final Player opp = aiPlayer.getWeakestOpponent();
final CardCollectionView humPerms = opp.getCardsIn(ZoneType.Battlefield);
final CardCollectionView compPerms = aiPlayer.getCardsIn(ZoneType.Battlefield);
diff --git a/forge-ai/src/main/java/forge/ai/ability/BidLifeAi.java b/forge-ai/src/main/java/forge/ai/ability/BidLifeAi.java
index 55ceb865919..634fabc1254 100644
--- a/forge-ai/src/main/java/forge/ai/ability/BidLifeAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/BidLifeAi.java
@@ -2,7 +2,6 @@ package forge.ai.ability;
import java.util.List;
-import forge.ai.ComputerUtil;
import forge.ai.ComputerUtilCard;
import forge.ai.SpellAbilityAi;
import forge.game.Game;
@@ -25,7 +24,7 @@ public class BidLifeAi extends SpellAbilityAi {
if (tgt != null) {
sa.resetTargets();
if (tgt.canTgtCreature()) {
- List list = CardLists.getTargetableCards(ComputerUtil.getOpponentFor(aiPlayer).getCardsIn(ZoneType.Battlefield), sa);
+ List list = CardLists.getTargetableCards(aiPlayer.getWeakestOpponent().getCardsIn(ZoneType.Battlefield), sa);
list = CardLists.getValidCards(list, tgt.getValidTgts(), source.getController(), source, sa);
if (list.isEmpty()) {
return false;
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 d2c4a7c55ef..77dcb36069e 100644
--- a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java
@@ -229,7 +229,7 @@ public class ChangeZoneAi extends SpellAbilityAi {
final Card source = sa.getHostCard();
final String sourceName = ComputerUtilAbility.getAbilitySourceName(sa);
ZoneType origin = null;
- final Player opponent = ComputerUtil.getOpponentFor(ai);
+ final Player opponent = ai.getWeakestOpponent();
boolean activateForCost = ComputerUtil.activateForCost(sa, ai);
if (sa.hasParam("Origin")) {
@@ -439,7 +439,7 @@ public class ChangeZoneAi extends SpellAbilityAi {
// if putting cards from hand to library and parent is drawing cards
// make sure this will actually do something:
final TargetRestrictions tgt = sa.getTargetRestrictions();
- final Player opp = ComputerUtil.getOpponentFor(aiPlayer);
+ final Player opp = aiPlayer.getWeakestOpponent();
if (tgt != null && tgt.canTgtPlayer()) {
boolean isCurse = sa.isCurse();
if (isCurse && sa.canTarget(opp)) {
@@ -500,7 +500,7 @@ public class ChangeZoneAi extends SpellAbilityAi {
Iterable pDefined;
final TargetRestrictions tgt = sa.getTargetRestrictions();
if ((tgt != null) && tgt.canTgtPlayer()) {
- final Player opp = ComputerUtil.getOpponentFor(ai);
+ final Player opp = ai.getWeakestOpponent();
if (sa.isCurse()) {
if (sa.canTarget(opp)) {
sa.getTargets().add(opp);
@@ -619,7 +619,7 @@ public class ChangeZoneAi extends SpellAbilityAi {
*/
private static Card chooseCreature(final Player ai, CardCollection list) {
// Creating a new combat for testing purposes.
- final Player opponent = ComputerUtil.getOpponentFor(ai);
+ final Player opponent = ai.getWeakestOpponent();
Combat combat = new Combat(opponent);
for (Card att : opponent.getCreaturesInPlay()) {
combat.addAttacker(att, ai);
@@ -935,7 +935,7 @@ public class ChangeZoneAi extends SpellAbilityAi {
&& !currCombat.getBlockers(attacker).isEmpty()) {
ComputerUtilCard.sortByEvaluateCreature(blockers);
Combat combat = new Combat(ai);
- combat.addAttacker(attacker, ComputerUtil.getOpponentFor(ai));
+ combat.addAttacker(attacker, ai.getWeakestOpponent());
for (Card blocker : blockers) {
combat.addBlocker(attacker, blocker);
}
diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseCardAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseCardAi.java
index db861634ebe..6d0cee69a14 100644
--- a/forge-ai/src/main/java/forge/ai/ability/ChooseCardAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/ChooseCardAi.java
@@ -8,7 +8,6 @@ import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
-import forge.ai.ComputerUtil;
import forge.ai.ComputerUtilAbility;
import forge.ai.ComputerUtilCard;
@@ -127,7 +126,7 @@ public class ChooseCardAi extends SpellAbilityAi {
}
} else if (aiLogic.equals("Duneblast")) {
CardCollection aiCreatures = ai.getCreaturesInPlay();
- CardCollection oppCreatures = ComputerUtil.getOpponentFor(ai).getCreaturesInPlay();
+ CardCollection oppCreatures = ai.getWeakestOpponent().getCreaturesInPlay();
aiCreatures = CardLists.getNotKeyword(aiCreatures, Keyword.INDESTRUCTIBLE);
oppCreatures = CardLists.getNotKeyword(oppCreatures, Keyword.INDESTRUCTIBLE);
diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseCardNameAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseCardNameAi.java
index 6148e60fdb5..ff0bfc2ceaa 100644
--- a/forge-ai/src/main/java/forge/ai/ability/ChooseCardNameAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/ChooseCardNameAi.java
@@ -41,7 +41,7 @@ public class ChooseCardNameAi extends SpellAbilityAi {
if (tgt != null) {
sa.resetTargets();
if (tgt.canOnlyTgtOpponent()) {
- sa.getTargets().add(ComputerUtil.getOpponentFor(ai));
+ sa.getTargets().add(ai.getWeakestOpponent());
} else {
sa.getTargets().add(ai);
}
diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseColorAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseColorAi.java
index 905fdab48f8..8ba40274dcd 100644
--- a/forge-ai/src/main/java/forge/ai/ability/ChooseColorAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/ChooseColorAi.java
@@ -52,7 +52,7 @@ public class ChooseColorAi extends SpellAbilityAi {
}
if ("Addle".equals(sourceName)) {
- if (ph.getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS) || ComputerUtil.getOpponentFor(ai).getCardsIn(ZoneType.Hand).isEmpty()) {
+ if (ph.getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS) || ai.getWeakestOpponent().getCardsIn(ZoneType.Hand).isEmpty()) {
return false;
}
return true;
@@ -61,7 +61,7 @@ public class ChooseColorAi extends SpellAbilityAi {
if (logic.equals("MostExcessOpponentControls")) {
for (byte color : MagicColor.WUBRG) {
CardCollectionView ailist = ai.getCardsIn(ZoneType.Battlefield);
- CardCollectionView opplist = ComputerUtil.getOpponentFor(ai).getCardsIn(ZoneType.Battlefield);
+ CardCollectionView opplist = ai.getWeakestOpponent().getCardsIn(ZoneType.Battlefield);
ailist = CardLists.filter(ailist, CardPredicates.isColor(color));
opplist = CardLists.filter(opplist, CardPredicates.isColor(color));
diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseNumberAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseNumberAi.java
index fe84327251b..46276414778 100644
--- a/forge-ai/src/main/java/forge/ai/ability/ChooseNumberAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/ChooseNumberAi.java
@@ -1,6 +1,5 @@
package forge.ai.ability;
-import forge.ai.ComputerUtil;
import forge.ai.SpellAbilityAi;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
@@ -17,7 +16,7 @@ public class ChooseNumberAi extends SpellAbilityAi {
TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt != null) {
sa.resetTargets();
- Player opp = ComputerUtil.getOpponentFor(aiPlayer);
+ Player opp = aiPlayer.getWeakestOpponent();
if (sa.canTarget(opp)) {
sa.getTargets().add(opp);
} else {
diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseSourceAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseSourceAi.java
index 7f740adb8dc..3478e74b73b 100644
--- a/forge-ai/src/main/java/forge/ai/ability/ChooseSourceAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/ChooseSourceAi.java
@@ -7,7 +7,6 @@ import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
-import forge.ai.ComputerUtil;
import forge.ai.ComputerUtilCard;
import forge.ai.ComputerUtilCombat;
import forge.ai.ComputerUtilCost;
@@ -68,7 +67,7 @@ public class ChooseSourceAi extends SpellAbilityAi {
final TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt != null) {
sa.resetTargets();
- Player opp = ComputerUtil.getOpponentFor(ai);
+ Player opp = ai.getWeakestOpponent();
if (sa.canTarget(opp)) {
sa.getTargets().add(opp);
} else {
diff --git a/forge-ai/src/main/java/forge/ai/ability/ControlExchangeAi.java b/forge-ai/src/main/java/forge/ai/ability/ControlExchangeAi.java
index ab3c3465127..f21b327b3fd 100644
--- a/forge-ai/src/main/java/forge/ai/ability/ControlExchangeAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/ControlExchangeAi.java
@@ -3,7 +3,6 @@ package forge.ai.ability;
import com.google.common.base.Predicate;
import com.google.common.collect.Lists;
-import forge.ai.ComputerUtil;
import forge.ai.ComputerUtilCard;
import forge.ai.SpellAbilityAi;
import forge.game.ability.AbilityUtils;
@@ -30,7 +29,7 @@ public class ControlExchangeAi extends SpellAbilityAi {
sa.resetTargets();
CardCollection list =
- CardLists.getValidCards(ComputerUtil.getOpponentFor(ai).getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), ai, sa.getHostCard(), sa);
+ CardLists.getValidCards(ai.getWeakestOpponent().getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), ai, sa.getHostCard(), sa);
// AI won't try to grab cards that are filtered out of AI decks on
// purpose
list = CardLists.filter(list, new Predicate() {
diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersPutAllAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersPutAllAi.java
index 82dc7f1adfd..0be541d2f5f 100644
--- a/forge-ai/src/main/java/forge/ai/ability/CountersPutAllAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutAllAi.java
@@ -2,7 +2,6 @@ package forge.ai.ability;
import com.google.common.base.Predicate;
import com.google.common.collect.Lists;
-import forge.ai.ComputerUtil;
import forge.ai.ComputerUtilCost;
import forge.ai.ComputerUtilMana;
import forge.ai.SpellAbilityAi;
@@ -39,7 +38,7 @@ public class CountersPutAllAi extends SpellAbilityAi {
final boolean curse = sa.isCurse();
final TargetRestrictions tgt = sa.getTargetRestrictions();
- hList = CardLists.getValidCards(ComputerUtil.getOpponentFor(ai).getCardsIn(ZoneType.Battlefield), valid, source.getController(), source);
+ hList = CardLists.getValidCards(ai.getWeakestOpponent().getCardsIn(ZoneType.Battlefield), valid, source.getController(), source);
cList = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid, source.getController(), source);
if (abCost != null) {
@@ -68,7 +67,7 @@ public class CountersPutAllAi extends SpellAbilityAi {
}
if (tgt != null) {
- Player pl = curse ? ComputerUtil.getOpponentFor(ai) : ai;
+ Player pl = curse ? ai.getWeakestOpponent() : ai;
sa.getTargets().add(pl);
hList = CardLists.filterControlledBy(hList, pl);
@@ -149,7 +148,7 @@ public class CountersPutAllAi extends SpellAbilityAi {
*/
@Override
public boolean confirmAction(Player player, SpellAbility sa, PlayerActionConfirmMode mode, String message) {
- return player.getCreaturesInPlay().size() >= ComputerUtil.getOpponentFor(player).getCreaturesInPlay().size();
+ return player.getCreaturesInPlay().size() >= player.getWeakestOpponent().getCreaturesInPlay().size();
}
@Override
diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageAiBase.java b/forge-ai/src/main/java/forge/ai/ability/DamageAiBase.java
index 1b2dc7ee7fd..d894b2f7a79 100644
--- a/forge-ai/src/main/java/forge/ai/ability/DamageAiBase.java
+++ b/forge-ai/src/main/java/forge/ai/ability/DamageAiBase.java
@@ -1,7 +1,6 @@
package forge.ai.ability;
import com.google.common.collect.Iterables;
-import forge.ai.ComputerUtil;
import forge.ai.ComputerUtilCombat;
import forge.ai.SpellAbilityAi;
import forge.game.Game;
@@ -20,7 +19,7 @@ import forge.util.MyRandom;
public abstract class DamageAiBase extends SpellAbilityAi {
protected boolean avoidTargetP(final Player comp, final SpellAbility sa) {
- Player enemy = ComputerUtil.getOpponentFor(comp);
+ Player enemy = comp.getWeakestOpponent();
// Logic for cards that damage owner, like Fireslinger
// Do not target a player if they aren't below 75% of our health.
// Unless Lifelink will cancel the damage to us
@@ -54,7 +53,7 @@ public abstract class DamageAiBase extends SpellAbilityAi {
protected boolean shouldTgtP(final Player comp, final SpellAbility sa, final int d, final boolean noPrevention, final boolean noPlaneswalkerRedirection) {
int restDamage = d;
final Game game = comp.getGame();
- Player enemy = ComputerUtil.getOpponentFor(comp);
+ Player enemy = comp.getWeakestOpponent();
boolean dmgByCardsInHand = false;
if ("X".equals(sa.getParam("NumDmg")) && sa.getHostCard() != null && sa.hasSVar(sa.getParam("NumDmg")) &&
diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageAllAi.java b/forge-ai/src/main/java/forge/ai/ability/DamageAllAi.java
index e43dfac49ab..cbede1c1a11 100644
--- a/forge-ai/src/main/java/forge/ai/ability/DamageAllAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/DamageAllAi.java
@@ -212,7 +212,7 @@ public class DamageAllAi extends SpellAbilityAi {
}
// Evaluate creatures getting killed
- Player enemy = ComputerUtil.getOpponentFor(ai);
+ Player enemy = ai.getWeakestOpponent();
final CardCollection humanList = getKillableCreatures(sa, enemy, dmg);
CardCollection computerList = getKillableCreatures(sa, ai, dmg);
final TargetRestrictions tgt = sa.getTargetRestrictions();
@@ -294,7 +294,7 @@ public class DamageAllAi extends SpellAbilityAi {
}
// Evaluate creatures getting killed
- Player enemy = ComputerUtil.getOpponentFor(ai);
+ Player enemy = ai.getWeakestOpponent();
final CardCollection humanList = getKillableCreatures(sa, enemy, dmg);
CardCollection computerList = getKillableCreatures(sa, ai, dmg);
final TargetRestrictions tgt = sa.getTargetRestrictions();
diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java
index 3671da06f71..7ca4915f285 100644
--- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java
@@ -552,7 +552,7 @@ public class DamageDealAi extends DamageAiBase {
final boolean oppTargetsChoice = sa.hasParam("TargetingPlayer");
final String logic = sa.getParamOrDefault("AILogic", "");
- Player enemy = ComputerUtil.getOpponentFor(ai);
+ Player enemy = ai.getWeakestOpponent();
if ("PowerDmg".equals(logic)) {
// check if it is better to target the player instead, the original target is already set in PumpAi.pumpTgtAI()
@@ -876,7 +876,7 @@ public class DamageDealAi extends DamageAiBase {
// this is for Triggered targets that are mandatory
final boolean noPrevention = sa.hasParam("NoPrevention");
final boolean divided = sa.hasParam("DividedAsYouChoose");
- final Player opp = ComputerUtil.getOpponentFor(ai);
+ final Player opp = ai.getWeakestOpponent();
while (sa.getTargets().getNumTargeted() < tgt.getMinTargets(sa.getHostCard(), sa)) {
if (tgt.canTgtPlaneswalker()) {
diff --git a/forge-ai/src/main/java/forge/ai/ability/DebuffAi.java b/forge-ai/src/main/java/forge/ai/ability/DebuffAi.java
index eee46d29579..ca3fae2f3a8 100644
--- a/forge-ai/src/main/java/forge/ai/ability/DebuffAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/DebuffAi.java
@@ -4,7 +4,6 @@ import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
-import forge.ai.ComputerUtil;
import forge.ai.ComputerUtilCard;
import forge.ai.ComputerUtilCost;
import forge.ai.SpellAbilityAi;
@@ -177,7 +176,7 @@ public class DebuffAi extends SpellAbilityAi {
* @return a CardCollection.
*/
private CardCollection getCurseCreatures(final Player ai, final SpellAbility sa, final List kws) {
- final Player opp = ComputerUtil.getOpponentFor(ai);
+ final Player opp = ai.getWeakestOpponent();
CardCollection list = CardLists.getTargetableCards(opp.getCreaturesInPlay(), sa);
if (!list.isEmpty()) {
list = CardLists.filter(list, new Predicate() {
@@ -217,7 +216,7 @@ public class DebuffAi extends SpellAbilityAi {
list.remove(c);
}
- final CardCollection pref = CardLists.filterControlledBy(list, ComputerUtil.getOpponentFor(ai));
+ final CardCollection pref = CardLists.filterControlledBy(list, ai.getWeakestOpponent());
final CardCollection forced = CardLists.filterControlledBy(list, ai);
final Card source = sa.getHostCard();
diff --git a/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java b/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java
index 06705baf8bf..cede308bfc7 100644
--- a/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java
@@ -288,7 +288,7 @@ public class DestroyAi extends SpellAbilityAi {
} else if (sa.hasParam("Defined")) {
list = AbilityUtils.getDefinedCards(source, sa.getParam("Defined"), sa);
if ("WillSkipTurn".equals(logic) && (sa.getHostCard().getController().equals(ai)
- || ai.getCreaturesInPlay().size() < ComputerUtil.getOpponentFor(ai).getCreaturesInPlay().size()
+ || ai.getCreaturesInPlay().size() < ai.getWeakestOpponent().getCreaturesInPlay().size()
|| !source.getGame().getPhaseHandler().isPlayerTurn(ai)
|| ai.getLife() <= 5)) {
// Basic ai logic for Lethal Vapors
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 b2b06161f29..16d426c7f62 100644
--- a/forge-ai/src/main/java/forge/ai/ability/DestroyAllAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/DestroyAllAi.java
@@ -66,7 +66,7 @@ public class DestroyAllAi extends SpellAbilityAi {
public boolean doMassRemovalLogic(Player ai, SpellAbility sa) {
final Card source = sa.getHostCard();
final String logic = sa.getParamOrDefault("AILogic", "");
- Player opponent = ComputerUtil.getOpponentFor(ai); // TODO: how should this AI logic work for multiplayer and getOpponents()?
+ Player opponent = ai.getWeakestOpponent(); // TODO: how should this AI logic work for multiplayer and getOpponents()?
final int CREATURE_EVAL_THRESHOLD = 200;
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 e33409722e7..e3435869c4d 100644
--- a/forge-ai/src/main/java/forge/ai/ability/DigAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/DigAi.java
@@ -24,7 +24,7 @@ public class DigAi extends SpellAbilityAi {
@Override
protected boolean canPlayAI(Player ai, SpellAbility sa) {
final Game game = ai.getGame();
- Player opp = ComputerUtil.getOpponentFor(ai);
+ Player opp = ai.getWeakestOpponent();
final Card host = sa.getHostCard();
Player libraryOwner = ai;
@@ -106,7 +106,7 @@ public class DigAi extends SpellAbilityAi {
@Override
protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) {
- final Player opp = ComputerUtil.getOpponentFor(ai);
+ final Player opp = ai.getWeakestOpponent();
if (sa.usesTargeting()) {
sa.resetTargets();
if (mandatory && sa.canTarget(opp)) {
diff --git a/forge-ai/src/main/java/forge/ai/ability/DigUntilAi.java b/forge-ai/src/main/java/forge/ai/ability/DigUntilAi.java
index 7be26f04209..f18dc3c7784 100644
--- a/forge-ai/src/main/java/forge/ai/ability/DigUntilAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/DigUntilAi.java
@@ -1,6 +1,5 @@
package forge.ai.ability;
-import forge.ai.ComputerUtil;
import forge.ai.ComputerUtilMana;
import forge.ai.SpellAbilityAi;
import forge.game.card.Card;
@@ -36,7 +35,7 @@ public class DigUntilAi extends SpellAbilityAi {
final boolean randomReturn = MyRandom.getRandom().nextFloat() <= Math.pow(chance, sa.getActivationsThisTurn() + 1);
Player libraryOwner = ai;
- Player opp = ComputerUtil.getOpponentFor(ai);
+ Player opp = ai.getWeakestOpponent();
if ("DontMillSelf".equals(logic)) {
// A card that digs for specific things and puts everything revealed before it into graveyard
diff --git a/forge-ai/src/main/java/forge/ai/ability/DiscardAi.java b/forge-ai/src/main/java/forge/ai/ability/DiscardAi.java
index dbc18b05808..d7dad6b293d 100644
--- a/forge-ai/src/main/java/forge/ai/ability/DiscardAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/DiscardAi.java
@@ -56,7 +56,7 @@ public class DiscardAi extends SpellAbilityAi {
return SpecialCardAi.VolrathsShapeshifter.consider(ai, sa);
}
- final boolean humanHasHand = ComputerUtil.getOpponentFor(ai).getCardsIn(ZoneType.Hand).size() > 0;
+ final boolean humanHasHand = ai.getWeakestOpponent().getCardsIn(ZoneType.Hand).size() > 0;
if (tgt != null) {
if (!discardTargetAI(ai, sa)) {
@@ -87,7 +87,7 @@ public class DiscardAi extends SpellAbilityAi {
if (sa.hasParam("NumCards")) {
if (sa.getParam("NumCards").equals("X") && source.getSVar("X").equals("Count$xPaid")) {
// Set PayX here to maximum value.
- final int cardsToDiscard = Math.min(ComputerUtilMana.determineLeftoverMana(sa, ai), ComputerUtil.getOpponentFor(ai)
+ final int cardsToDiscard = Math.min(ComputerUtilMana.determineLeftoverMana(sa, ai), ai.getWeakestOpponent()
.getCardsIn(ZoneType.Hand).size());
if (cardsToDiscard < 1) {
return false;
@@ -172,7 +172,7 @@ public class DiscardAi extends SpellAbilityAi {
protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) {
final TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt != null) {
- Player opp = ComputerUtil.getOpponentFor(ai);
+ Player opp = ai.getWeakestOpponent();
if (!discardTargetAI(ai, sa)) {
if (mandatory && sa.canTarget(opp)) {
sa.getTargets().add(opp);
@@ -193,7 +193,7 @@ public class DiscardAi extends SpellAbilityAi {
}
if ("X".equals(sa.getParam("RevealNumber")) && sa.getHostCard().getSVar("X").equals("Count$xPaid")) {
// Set PayX here to maximum value.
- final int cardsToDiscard = Math.min(ComputerUtilMana.determineLeftoverMana(sa, ai), ComputerUtil.getOpponentFor(ai)
+ final int cardsToDiscard = Math.min(ComputerUtilMana.determineLeftoverMana(sa, ai), ai.getWeakestOpponent()
.getCardsIn(ZoneType.Hand).size());
sa.getHostCard().setSVar("PayX", Integer.toString(cardsToDiscard));
}
diff --git a/forge-ai/src/main/java/forge/ai/ability/DrainManaAi.java b/forge-ai/src/main/java/forge/ai/ability/DrainManaAi.java
index a922c0f0508..f6745d73c39 100644
--- a/forge-ai/src/main/java/forge/ai/ability/DrainManaAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/DrainManaAi.java
@@ -1,6 +1,5 @@
package forge.ai.ability;
-import forge.ai.ComputerUtil;
import forge.ai.SpellAbilityAi;
import forge.game.ability.AbilityUtils;
import forge.game.card.Card;
@@ -19,7 +18,7 @@ public class DrainManaAi extends SpellAbilityAi {
final TargetRestrictions tgt = sa.getTargetRestrictions();
final Card source = sa.getHostCard();
- final Player opp = ComputerUtil.getOpponentFor(ai);
+ final Player opp = ai.getWeakestOpponent();
boolean randomReturn = MyRandom.getRandom().nextFloat() <= Math.pow(.6667, sa.getActivationsThisTurn());
if (tgt == null) {
@@ -41,7 +40,7 @@ public class DrainManaAi extends SpellAbilityAi {
@Override
protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) {
- final Player opp = ComputerUtil.getOpponentFor(ai);
+ final Player opp = ai.getWeakestOpponent();
final TargetRestrictions tgt = sa.getTargetRestrictions();
final Card source = sa.getHostCard();
@@ -82,7 +81,7 @@ public class DrainManaAi extends SpellAbilityAi {
}
} else {
sa.resetTargets();
- sa.getTargets().add(ComputerUtil.getOpponentFor(ai));
+ sa.getTargets().add(ai.getWeakestOpponent());
}
return randomReturn;
diff --git a/forge-ai/src/main/java/forge/ai/ability/FogAi.java b/forge-ai/src/main/java/forge/ai/ability/FogAi.java
index ecdb0c03b4f..9d919b10b22 100644
--- a/forge-ai/src/main/java/forge/ai/ability/FogAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/FogAi.java
@@ -107,7 +107,7 @@ public class FogAi extends SpellAbilityAi {
protected boolean doTriggerAINoCost(Player aiPlayer, SpellAbility sa, boolean mandatory) {
final Game game = aiPlayer.getGame();
boolean chance;
- if (game.getPhaseHandler().isPlayerTurn(ComputerUtil.getOpponentFor(sa.getActivatingPlayer()))) {
+ if (game.getPhaseHandler().isPlayerTurn(sa.getActivatingPlayer().getWeakestOpponent())) {
chance = game.getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_FIRST_STRIKE_DAMAGE);
} else {
chance = game.getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_DAMAGE);
diff --git a/forge-ai/src/main/java/forge/ai/ability/GameLossAi.java b/forge-ai/src/main/java/forge/ai/ability/GameLossAi.java
index 1fbb7c7d943..03b77143d99 100644
--- a/forge-ai/src/main/java/forge/ai/ability/GameLossAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/GameLossAi.java
@@ -1,6 +1,5 @@
package forge.ai.ability;
-import forge.ai.ComputerUtil;
import forge.ai.SpellAbilityAi;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
@@ -9,7 +8,7 @@ import forge.game.spellability.TargetRestrictions;
public class GameLossAi extends SpellAbilityAi {
@Override
protected boolean canPlayAI(Player ai, SpellAbility sa) {
- final Player opp = ComputerUtil.getOpponentFor(ai);
+ final Player opp = ai.getWeakestOpponent();
if (opp.cantLose()) {
return false;
}
@@ -34,15 +33,16 @@ public class GameLossAi extends SpellAbilityAi {
// Phage the Untouchable
// (Final Fortune would need to attach it's delayed trigger to a
// specific turn, which can't be done yet)
+ Player opp = ai.getWeakestOpponent();
- if (!mandatory && ComputerUtil.getOpponentFor(ai).cantLose()) {
+ if (!mandatory && opp.cantLose()) {
return false;
}
final TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt != null) {
sa.resetTargets();
- sa.getTargets().add(ComputerUtil.getOpponentFor(ai));
+ sa.getTargets().add(opp);
}
return true;
diff --git a/forge-ai/src/main/java/forge/ai/ability/LifeExchangeAi.java b/forge-ai/src/main/java/forge/ai/ability/LifeExchangeAi.java
index e9b7515b950..8b387b7791a 100644
--- a/forge-ai/src/main/java/forge/ai/ability/LifeExchangeAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/LifeExchangeAi.java
@@ -1,6 +1,5 @@
package forge.ai.ability;
-import forge.ai.ComputerUtil;
import forge.ai.SpellAbilityAi;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
@@ -20,7 +19,7 @@ public class LifeExchangeAi extends SpellAbilityAi {
@Override
protected boolean canPlayAI(Player aiPlayer, SpellAbility sa) {
final int myLife = aiPlayer.getLife();
- Player opponent = ComputerUtil.getOpponentFor(aiPlayer);
+ Player opponent = aiPlayer.getWeakestOpponent();
final int hLife = opponent.getLife();
if (!aiPlayer.canGainLife()) {
@@ -76,7 +75,7 @@ public class LifeExchangeAi extends SpellAbilityAi {
final boolean mandatory) {
final TargetRestrictions tgt = sa.getTargetRestrictions();
- Player opp = ComputerUtil.getOpponentFor(ai);
+ Player opp = ai.getWeakestOpponent();
if (tgt != null) {
sa.resetTargets();
if (sa.canTarget(opp) && (mandatory || ai.getLife() < opp.getLife())) {
diff --git a/forge-ai/src/main/java/forge/ai/ability/LifeExchangeVariantAi.java b/forge-ai/src/main/java/forge/ai/ability/LifeExchangeVariantAi.java
index 144e91ff726..e1432844d01 100644
--- a/forge-ai/src/main/java/forge/ai/ability/LifeExchangeVariantAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/LifeExchangeVariantAi.java
@@ -149,7 +149,7 @@ public class LifeExchangeVariantAi extends SpellAbilityAi {
final boolean mandatory) {
final TargetRestrictions tgt = sa.getTargetRestrictions();
- Player opp = ComputerUtil.getOpponentFor(ai);
+ Player opp = ai.getWeakestOpponent();
if (tgt != null) {
sa.resetTargets();
if (sa.canTarget(opp) && (mandatory || ai.getLife() < opp.getLife())) {
diff --git a/forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java b/forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java
index fb8c0797711..cc4d851bd9b 100644
--- a/forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java
@@ -1,6 +1,5 @@
package forge.ai.ability;
-import forge.ai.ComputerUtil;
import forge.ai.ComputerUtilAbility;
import forge.ai.ComputerUtilMana;
import forge.ai.SpellAbilityAi;
@@ -20,7 +19,7 @@ public class LifeSetAi extends SpellAbilityAi {
// Ability_Cost abCost = sa.getPayCosts();
final Card source = sa.getHostCard();
final int myLife = ai.getLife();
- final Player opponent = ComputerUtil.getOpponentFor(ai);
+ final Player opponent = ai.getWeakestOpponent();
final int hlife = opponent.getLife();
final String amountStr = sa.getParam("LifeAmount");
@@ -107,7 +106,7 @@ public class LifeSetAi extends SpellAbilityAi {
@Override
protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) {
final int myLife = ai.getLife();
- final Player opponent = ComputerUtil.getOpponentFor(ai);
+ final Player opponent = ai.getWeakestOpponent();
final int hlife = opponent.getLife();
final Card source = sa.getHostCard();
final String sourceName = ComputerUtilAbility.getAbilitySourceName(sa);
diff --git a/forge-ai/src/main/java/forge/ai/ability/MustBlockAi.java b/forge-ai/src/main/java/forge/ai/ability/MustBlockAi.java
index e01d0b38943..238ba76c409 100644
--- a/forge-ai/src/main/java/forge/ai/ability/MustBlockAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/MustBlockAi.java
@@ -95,7 +95,7 @@ public class MustBlockAi extends SpellAbilityAi {
boolean chance = false;
if (abTgt != null) {
- final List list = determineGoodBlockers(definedAttacker, ai, ComputerUtil.getOpponentFor(ai), sa, true,true);
+ final List list = determineGoodBlockers(definedAttacker, ai, ai.getWeakestOpponent(), sa, true,true);
if (list.isEmpty()) {
return false;
}
diff --git a/forge-ai/src/main/java/forge/ai/ability/PowerExchangeAi.java b/forge-ai/src/main/java/forge/ai/ability/PowerExchangeAi.java
index 6dd2e5aa767..1db4d76d321 100644
--- a/forge-ai/src/main/java/forge/ai/ability/PowerExchangeAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/PowerExchangeAi.java
@@ -2,7 +2,6 @@ package forge.ai.ability;
import com.google.common.base.Predicate;
-import forge.ai.ComputerUtil;
import forge.ai.ComputerUtilCard;
import forge.ai.SpellAbilityAi;
import forge.game.ability.AbilityUtils;
@@ -31,7 +30,7 @@ public class PowerExchangeAi extends SpellAbilityAi {
sa.resetTargets();
List list =
- CardLists.getValidCards(ComputerUtil.getOpponentFor(ai).getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), ai, sa.getHostCard(), sa);
+ CardLists.getValidCards(ai.getWeakestOpponent().getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), ai, sa.getHostCard(), sa);
// AI won't try to grab cards that are filtered out of AI decks on
// purpose
list = CardLists.filter(list, new Predicate() {
diff --git a/forge-ai/src/main/java/forge/ai/ability/ProtectAi.java b/forge-ai/src/main/java/forge/ai/ability/ProtectAi.java
index a7030e1180f..513b8689a0c 100644
--- a/forge-ai/src/main/java/forge/ai/ability/ProtectAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/ProtectAi.java
@@ -146,7 +146,7 @@ public class ProtectAi extends SpellAbilityAi {
if (s==null) {
return false;
} else {
- Player opponent = ComputerUtil.getOpponentFor(ai);
+ Player opponent = ai.getWeakestOpponent();
Combat combat = ai.getGame().getCombat();
int dmg = ComputerUtilCombat.damageIfUnblocked(c, opponent, combat, true);
float ratio = 1.0f * dmg / opponent.getLife();
diff --git a/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java b/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java
index 89af0bf5722..e4567af164f 100644
--- a/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java
+++ b/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java
@@ -177,7 +177,7 @@ public abstract class PumpAiBase extends SpellAbilityAi {
final Game game = ai.getGame();
final Combat combat = game.getCombat();
final PhaseHandler ph = game.getPhaseHandler();
- final Player opp = ComputerUtil.getOpponentFor(ai);
+ final Player opp = ai.getWeakestOpponent();
final int newPower = card.getNetCombatDamage() + attack;
//int defense = getNumDefense(sa);
if (!CardUtil.isStackingKeyword(keyword) && card.hasKeyword(keyword)) {
diff --git a/forge-ai/src/main/java/forge/ai/ability/PumpAllAi.java b/forge-ai/src/main/java/forge/ai/ability/PumpAllAi.java
index dfa5db11642..7f03f31ddf4 100644
--- a/forge-ai/src/main/java/forge/ai/ability/PumpAllAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/PumpAllAi.java
@@ -68,7 +68,7 @@ public class PumpAllAi extends PumpAiBase {
valid = sa.getParam("ValidCards");
}
- final Player opp = ComputerUtil.getOpponentFor(ai);
+ final Player opp = ai.getWeakestOpponent();
CardCollection comp = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid, source.getController(), source);
CardCollection human = CardLists.getValidCards(opp.getCardsIn(ZoneType.Battlefield), valid, source.getController(), source);
diff --git a/forge-ai/src/main/java/forge/ai/ability/RearrangeTopOfLibraryAi.java b/forge-ai/src/main/java/forge/ai/ability/RearrangeTopOfLibraryAi.java
index b896edbb8a2..e8092eccfa2 100644
--- a/forge-ai/src/main/java/forge/ai/ability/RearrangeTopOfLibraryAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/RearrangeTopOfLibraryAi.java
@@ -46,10 +46,10 @@ public class RearrangeTopOfLibraryAi extends SpellAbilityAi {
// ability is targeted
sa.resetTargets();
- Player opp = ComputerUtil.getOpponentFor(aiPlayer);
+ Player opp = aiPlayer.getWeakestOpponent();
final boolean canTgtAI = sa.canTarget(aiPlayer);
final boolean canTgtHuman = sa.canTarget(opp);
-
+
if (canTgtHuman && canTgtAI) {
// TODO: maybe some other consideration rather than random?
Player preferredTarget = MyRandom.percentTrue(50) ? aiPlayer : opp;
diff --git a/forge-ai/src/main/java/forge/ai/ability/RepeatAi.java b/forge-ai/src/main/java/forge/ai/ability/RepeatAi.java
index 20d43fa814b..08059c5cace 100644
--- a/forge-ai/src/main/java/forge/ai/ability/RepeatAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/RepeatAi.java
@@ -15,7 +15,7 @@ public class RepeatAi extends SpellAbilityAi {
protected boolean canPlayAI(Player ai, SpellAbility sa) {
final Card source = sa.getHostCard();
final TargetRestrictions tgt = sa.getTargetRestrictions();
- final Player opp = ComputerUtil.getOpponentFor(ai);
+ final Player opp = ai.getWeakestOpponent();
if (tgt != null) {
if (!opp.canBeTargetedBy(sa)) {
@@ -49,7 +49,7 @@ public class RepeatAi extends SpellAbilityAi {
protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) {
if (sa.usesTargeting()) {
- final Player opp = ComputerUtil.getOpponentFor(ai);
+ final Player opp = ai.getWeakestOpponent();
if (sa.canTarget(opp)) {
sa.resetTargets();
sa.getTargets().add(opp);
diff --git a/forge-ai/src/main/java/forge/ai/ability/SacrificeAi.java b/forge-ai/src/main/java/forge/ai/ability/SacrificeAi.java
index 97ebb3004df..f5f1c587075 100644
--- a/forge-ai/src/main/java/forge/ai/ability/SacrificeAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/SacrificeAi.java
@@ -1,6 +1,5 @@
package forge.ai.ability;
-import forge.ai.ComputerUtil;
import forge.ai.ComputerUtilCard;
import forge.ai.ComputerUtilMana;
import forge.ai.SpellAbilityAi;
@@ -63,7 +62,7 @@ public class SacrificeAi extends SpellAbilityAi {
final TargetRestrictions tgt = sa.getTargetRestrictions();
final boolean destroy = sa.hasParam("Destroy");
- Player opp = ComputerUtil.getOpponentFor(ai);
+ Player opp = ai.getWeakestOpponent();
if (tgt != null) {
sa.resetTargets();
if (!opp.canBeTargetedBy(sa)) {
diff --git a/forge-ai/src/main/java/forge/ai/ability/SacrificeAllAi.java b/forge-ai/src/main/java/forge/ai/ability/SacrificeAllAi.java
index 4a077ba19a1..8032c127eed 100644
--- a/forge-ai/src/main/java/forge/ai/ability/SacrificeAllAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/SacrificeAllAi.java
@@ -1,6 +1,5 @@
package forge.ai.ability;
-import forge.ai.ComputerUtil;
import forge.ai.ComputerUtilCard;
import forge.ai.ComputerUtilCost;
import forge.ai.ComputerUtilMana;
@@ -37,7 +36,7 @@ public class SacrificeAllAi extends SpellAbilityAi {
}
CardCollection humanlist =
- CardLists.getValidCards(ComputerUtil.getOpponentFor(ai).getCardsIn(ZoneType.Battlefield), valid.split(","), source.getController(), source, sa);
+ CardLists.getValidCards(ai.getWeakestOpponent().getCardsIn(ZoneType.Battlefield), valid.split(","), source.getController(), source, sa);
CardCollection computerlist =
CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid.split(","), source.getController(), source, sa);
diff --git a/forge-ai/src/main/java/forge/ai/ability/TapAiBase.java b/forge-ai/src/main/java/forge/ai/ability/TapAiBase.java
index 79b627dae43..77f83383db6 100644
--- a/forge-ai/src/main/java/forge/ai/ability/TapAiBase.java
+++ b/forge-ai/src/main/java/forge/ai/ability/TapAiBase.java
@@ -112,7 +112,7 @@ public abstract class TapAiBase extends SpellAbilityAi {
* @return a boolean.
*/
protected boolean tapPrefTargeting(final Player ai, final Card source, final TargetRestrictions tgt, final SpellAbility sa, final boolean mandatory) {
- final Player opp = ComputerUtil.getOpponentFor(ai);
+ final Player opp = ai.getWeakestOpponent();
final Game game = ai.getGame();
CardCollection tapList = CardLists.filterControlledBy(game.getCardsIn(ZoneType.Battlefield), ai.getOpponents());
tapList = CardLists.getValidCards(tapList, tgt.getValidTgts(), source.getController(), source, sa);
diff --git a/forge-ai/src/main/java/forge/ai/ability/TapAllAi.java b/forge-ai/src/main/java/forge/ai/ability/TapAllAi.java
index c61ef26a721..8744ade29f0 100644
--- a/forge-ai/src/main/java/forge/ai/ability/TapAllAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/TapAllAi.java
@@ -3,7 +3,6 @@ package forge.ai.ability;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
-import forge.ai.ComputerUtil;
import forge.ai.ComputerUtilCombat;
import forge.ai.SpellAbilityAi;
import forge.game.Game;
@@ -30,7 +29,7 @@ public class TapAllAi extends SpellAbilityAi {
// or during upkeep/begin combat?
final Card source = sa.getHostCard();
- final Player opp = ComputerUtil.getOpponentFor(ai);
+ final Player opp = ai.getWeakestOpponent();
final Game game = ai.getGame();
if (game.getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_BEGIN)) {
@@ -125,8 +124,9 @@ public class TapAllAi extends SpellAbilityAi {
if (tgt != null) {
sa.resetTargets();
- sa.getTargets().add(ComputerUtil.getOpponentFor(ai));
- validTappables = ComputerUtil.getOpponentFor(ai).getCardsIn(ZoneType.Battlefield);
+ Player opp = ai.getWeakestOpponent();
+ sa.getTargets().add(opp);
+ validTappables = opp.getCardsIn(ZoneType.Battlefield);
}
if (mandatory) {
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 feae6ff6106..cee492ffb3c 100644
--- a/forge-ai/src/main/java/forge/ai/ability/TokenAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/TokenAi.java
@@ -167,7 +167,7 @@ public class TokenAi extends SpellAbilityAi {
*/
final Card source = sa.getHostCard();
final Game game = ai.getGame();
- final Player opp = ComputerUtil.getOpponentFor(ai);
+ final Player opp = ai.getWeakestOpponent();
if (ComputerUtil.preventRunAwayActivations(sa)) {
return false; // prevent infinite tokens?
@@ -261,13 +261,13 @@ public class TokenAi extends SpellAbilityAi {
num = (num == null) ? "1" : num;
final int nToSac = AbilityUtils.calculateAmount(topStack.getHostCard(), num, topStack);
CardCollection list = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid.split(","),
- ComputerUtil.getOpponentFor(ai), topStack.getHostCard(), sa);
+ ai.getWeakestOpponent(), topStack.getHostCard(), sa);
list = CardLists.filter(list, CardPredicates.canBeSacrificedBy(topStack));
// only care about saving single creature for now
if (!list.isEmpty() && nTokens > 0 && list.size() == nToSac) {
ComputerUtilCard.sortByEvaluateCreature(list);
list.add(token);
- list = CardLists.getValidCards(list, valid.split(","), ComputerUtil.getOpponentFor(ai), topStack.getHostCard(), sa);
+ list = CardLists.getValidCards(list, valid.split(","), ai.getWeakestOpponent(), topStack.getHostCard(), sa);
list = CardLists.filter(list, CardPredicates.canBeSacrificedBy(topStack));
if (ComputerUtilCard.evaluateCreature(token) < ComputerUtilCard.evaluateCreature(list.get(0))
&& list.contains(token)) {
@@ -285,7 +285,7 @@ public class TokenAi extends SpellAbilityAi {
if (tgt != null) {
sa.resetTargets();
if (tgt.canOnlyTgtOpponent()) {
- sa.getTargets().add(ComputerUtil.getOpponentFor(ai));
+ sa.getTargets().add(ai.getWeakestOpponent());
} else {
sa.getTargets().add(ai);
}
diff --git a/forge-ai/src/main/java/forge/ai/ability/TwoPilesAi.java b/forge-ai/src/main/java/forge/ai/ability/TwoPilesAi.java
index 871ec928ed1..1589ec3f41d 100644
--- a/forge-ai/src/main/java/forge/ai/ability/TwoPilesAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/TwoPilesAi.java
@@ -2,7 +2,6 @@ package forge.ai.ability;
import java.util.List;
-import forge.ai.ComputerUtil;
import forge.ai.SpellAbilityAi;
import forge.game.ability.AbilityUtils;
import forge.game.card.Card;
@@ -29,7 +28,7 @@ public class TwoPilesAi extends SpellAbilityAi {
valid = sa.getParam("ValidCards");
}
- final Player opp = ComputerUtil.getOpponentFor(ai);
+ final Player opp = ai.getWeakestOpponent();
final TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt != null) {
diff --git a/forge-ai/src/main/java/forge/ai/ability/UnattachAllAi.java b/forge-ai/src/main/java/forge/ai/ability/UnattachAllAi.java
index 5a105d49d00..6b7ad4eefbe 100644
--- a/forge-ai/src/main/java/forge/ai/ability/UnattachAllAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/UnattachAllAi.java
@@ -1,6 +1,5 @@
package forge.ai.ability;
-import forge.ai.ComputerUtil;
import forge.ai.ComputerUtilCard;
import forge.ai.ComputerUtilMana;
import forge.ai.SpellAbilityAi;
@@ -65,7 +64,7 @@ public class UnattachAllAi extends SpellAbilityAi {
@Override
protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) {
final Card card = sa.getHostCard();
- final Player opp = ComputerUtil.getOpponentFor(ai);
+ final Player opp = ai.getWeakestOpponent();
// Check if there are any valid targets
List targets = new ArrayList();
final TargetRestrictions tgt = sa.getTargetRestrictions();
diff --git a/forge-ai/src/main/java/forge/ai/ability/UntapAi.java b/forge-ai/src/main/java/forge/ai/ability/UntapAi.java
index 7e692b9240b..48884ee524f 100644
--- a/forge-ai/src/main/java/forge/ai/ability/UntapAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/UntapAi.java
@@ -139,7 +139,7 @@ public class UntapAi extends SpellAbilityAi {
Player targetController = ai;
if (sa.isCurse()) {
- targetController = ComputerUtil.getOpponentFor(ai);
+ targetController = ai.getWeakestOpponent();
}
CardCollection list = CardLists.getTargetableCards(targetController.getCardsIn(ZoneType.Battlefield), sa);
diff --git a/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java b/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java
index 0664b2c767d..b2b8fa39ffa 100644
--- a/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java
+++ b/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java
@@ -1,24 +1,13 @@
package forge.ai.simulation;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
-
import forge.LobbyPlayer;
import forge.ai.LobbyPlayerAi;
import forge.card.CardStateName;
-import forge.game.Game;
-import forge.game.GameEntity;
-import forge.game.GameObject;
-import forge.game.GameObjectMap;
-import forge.game.GameRules;
-import forge.game.Match;
-import forge.game.StaticEffect;
+import forge.game.*;
import forge.game.card.*;
import forge.game.card.token.TokenInfo;
import forge.game.combat.Combat;
@@ -28,13 +17,16 @@ import forge.game.phase.PhaseType;
import forge.game.player.Player;
import forge.game.player.RegisteredPlayer;
import forge.game.spellability.SpellAbility;
-import forge.game.spellability.SpellAbilityRestriction;
import forge.game.spellability.SpellAbilityStackInstance;
import forge.game.staticability.StaticAbility;
import forge.game.trigger.TriggerType;
import forge.game.zone.PlayerZoneBattlefield;
import forge.game.zone.ZoneType;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
public class GameCopier {
private static final ZoneType[] ZONES = new ZoneType[] {
ZoneType.Battlefield,
@@ -323,7 +315,6 @@ public class GameCopier {
}
if (c.isPlaneswalker()) {
for (SpellAbility sa : c.getAllSpellAbilities()) {
- SpellAbilityRestriction restrict = sa.getRestrictions();
int active = sa.getActivationsThisTurn();
if (sa.isPwAbility() && active > 0) {
SpellAbility newSa = findSAInCard(sa, newCard);
diff --git a/forge-ai/src/main/java/forge/ai/simulation/GameSimulator.java b/forge-ai/src/main/java/forge/ai/simulation/GameSimulator.java
index 106670042d7..6fe8a5074be 100644
--- a/forge-ai/src/main/java/forge/ai/simulation/GameSimulator.java
+++ b/forge-ai/src/main/java/forge/ai/simulation/GameSimulator.java
@@ -207,7 +207,7 @@ public class GameSimulator {
}
// TODO: Support multiple opponents.
- Player opponent = ComputerUtil.getOpponentFor(aiPlayer);
+ Player opponent = aiPlayer.getWeakestOpponent();
resolveStack(simGame, opponent);
// TODO: If this is during combat, before blockers are declared,
diff --git a/forge-core/pom.xml b/forge-core/pom.xml
index 8a79508056a..b7a37945a7b 100644
--- a/forge-core/pom.xml
+++ b/forge-core/pom.xml
@@ -6,7 +6,7 @@
forge
forge
- 1.6.26-SNAPSHOT
+ 1.6.27-SNAPSHOT
forge-core
diff --git a/forge-core/src/main/java/forge/util/ImageUtil.java b/forge-core/src/main/java/forge/util/ImageUtil.java
index cd5668bb20c..fff1213d844 100644
--- a/forge-core/src/main/java/forge/util/ImageUtil.java
+++ b/forge-core/src/main/java/forge/util/ImageUtil.java
@@ -7,8 +7,6 @@ import forge.card.CardRules;
import forge.card.CardSplitType;
import forge.item.PaperCard;
-import org.apache.commons.lang3.StringUtils;
-
public class ImageUtil {
public static float getNearestHQSize(float baseSize, float actualSize) {
//get nearest power of actualSize to baseSize so that the image renders good
@@ -46,9 +44,7 @@ public class ImageUtil {
cntPictures = db.getPrintCount(card.getName(), edition);
hasManyPictures = cntPictures > 1;
} else {
- // without set number of pictures equals number of urls provided in Svar:Picture
- String urls = card.getPictureUrl(backFace);
- cntPictures = StringUtils.countMatches(urls, "\\") + 1;
+ cntPictures = 1;
// raise the art index limit to the maximum of the sets this card was printed in
int maxCntPictures = db.getMaxPrintCount(card.getName());
diff --git a/forge-game/pom.xml b/forge-game/pom.xml
index 1133ec9e0f9..7b6e798417a 100644
--- a/forge-game/pom.xml
+++ b/forge-game/pom.xml
@@ -6,7 +6,7 @@
forge
forge
- 1.6.26-SNAPSHOT
+ 1.6.27-SNAPSHOT
forge-game
diff --git a/forge-game/src/main/java/forge/game/card/CardUtil.java b/forge-game/src/main/java/forge/game/card/CardUtil.java
index 542f11d9d8f..1c177ec82fa 100644
--- a/forge-game/src/main/java/forge/game/card/CardUtil.java
+++ b/forge-game/src/main/java/forge/game/card/CardUtil.java
@@ -17,18 +17,7 @@
*/
package forge.game.card;
-import java.util.List;
-import java.util.Set;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-import com.google.common.collect.Table;
-
-import io.sentry.Sentry;
-import io.sentry.event.BreadcrumbBuilder;
-
+import com.google.common.collect.*;
import forge.ImageKeys;
import forge.card.CardStateName;
import forge.card.CardType;
@@ -40,14 +29,16 @@ import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType;
import forge.game.player.Player;
import forge.game.replacement.ReplacementEffect;
-import forge.game.spellability.AbilityManaPart;
-import forge.game.spellability.AbilitySub;
-import forge.game.spellability.SpellAbility;
-import forge.game.spellability.TargetRestrictions;
+import forge.game.spellability.*;
import forge.game.trigger.Trigger;
import forge.game.zone.ZoneType;
import forge.util.TextUtil;
import forge.util.collect.FCollection;
+import io.sentry.Sentry;
+import io.sentry.event.BreadcrumbBuilder;
+
+import java.util.List;
+import java.util.Set;
public final class CardUtil {
// disable instantiation
@@ -308,6 +299,15 @@ public final class CardUtil {
newCopy.updateKeywordsCache(newCopy.getState(s));
}
+ newCopy.setKickerMagnitude(in.getKickerMagnitude());
+
+ for (OptionalCost ocost : in.getOptionalCostsPaid()) {
+ newCopy.addOptionalCostPaid(ocost);
+ }
+
+ newCopy.setCastSA(in.getCastSA());
+ newCopy.setCastFrom(in.getCastFrom());
+
return newCopy;
}
diff --git a/forge-gui-android/pom.xml b/forge-gui-android/pom.xml
index 5633bacc26c..7ad73ededae 100644
--- a/forge-gui-android/pom.xml
+++ b/forge-gui-android/pom.xml
@@ -6,7 +6,7 @@
jar
-Xms1024m
-Xmx1536m
- 1.6.25.001
+ 1.6.26.001
keystore
alias
storepass
@@ -19,7 +19,7 @@
forge
forge
- 1.6.26-SNAPSHOT
+ 1.6.27-SNAPSHOT
forge-gui-android
diff --git a/forge-gui-desktop/pom.xml b/forge-gui-desktop/pom.xml
index 13d08231132..a46c9d91fd3 100644
--- a/forge-gui-desktop/pom.xml
+++ b/forge-gui-desktop/pom.xml
@@ -4,7 +4,7 @@
forge
forge
- 1.6.26-SNAPSHOT
+ 1.6.27-SNAPSHOT
forge-gui-desktop
diff --git a/forge-gui-desktop/src/main/java/forge/control/FControl.java b/forge-gui-desktop/src/main/java/forge/control/FControl.java
index ae655029173..4c836b0d76e 100644
--- a/forge-gui-desktop/src/main/java/forge/control/FControl.java
+++ b/forge-gui-desktop/src/main/java/forge/control/FControl.java
@@ -386,7 +386,7 @@ public enum FControl implements KeyEventDispatcher {
return true;
}
}
- else if (e.getID() == KeyEvent.KEY_PRESSED && e.getModifiers() == InputEvent.ALT_MASK) {
+ else if (e.getID() == KeyEvent.KEY_PRESSED && e.getModifiersEx() == InputEvent.ALT_DOWN_MASK) {
altKeyLastDown = true;
}
}
diff --git a/forge-gui-desktop/src/main/java/forge/gui/ImportSourceAnalyzer.java b/forge-gui-desktop/src/main/java/forge/gui/ImportSourceAnalyzer.java
index 3879b66185c..c19d9c5b10f 100644
--- a/forge-gui-desktop/src/main/java/forge/gui/ImportSourceAnalyzer.java
+++ b/forge-gui-desktop/src/main/java/forge/gui/ImportSourceAnalyzer.java
@@ -20,7 +20,6 @@ package forge.gui;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import forge.card.CardEdition;
-import forge.card.CardRules;
import forge.item.IPaperCard;
import forge.item.PaperCard;
import forge.model.FModel;
@@ -295,30 +294,10 @@ public class ImportSourceAnalyzer {
// character mangling on some system locales, but we want to replicate the old code here exactly
return out.toString().toLowerCase();
}
-
+
+ @Deprecated
private void addDefaultPicNames(final PaperCard c, final boolean backFace) {
- final CardRules card = c.getRules();
- final String urls = card.getPictureUrl(backFace);
- if (StringUtils.isEmpty(urls)) { return; }
-
- final int numPics = 1 + StringUtils.countMatches(urls, "\\");
- if (c.getArtIndex() > numPics) {
- return;
- }
-
- final String filenameBase = ImageUtil.getImageKey(c, backFace, false);
- final String filename = filenameBase + ".jpg";
- final boolean alreadyHadIt = null != defaultPicNames.put(filename, filename);
- if ( alreadyHadIt ) {
- return;
- }
-
- // Do you shift artIndex by one here?
- final String newLastSymbol = 0 == c.getArtIndex() ? "" : String.valueOf(c.getArtIndex() /* + 1 */);
- final String oldFilename = oldCleanString(filenameBase.replaceAll("[0-9]?(\\.full)?$", "")) + newLastSymbol + ".jpg";
- //if ( numPics > 1 )
- //System.out.printf("Will move %s -> %s%n", oldFilename, filename);
- defaultPicOldNameToCurrentName.put(oldFilename, filename);
+ return;
}
diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/TextSearchFilter.java b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/TextSearchFilter.java
index 75cfc6418cb..dc9ad7af8f4 100644
--- a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/TextSearchFilter.java
+++ b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/TextSearchFilter.java
@@ -79,7 +79,7 @@ public class TextSearchFilter extends ItemFilter {
itemManager.focus();
break;
case KeyEvent.VK_ENTER:
- if (e.getModifiers() == 0) {
+ if (e.getModifiersEx() == 0) {
if (changeTimer.isRunning()) {
applyChange(); //apply change now if currently delayed
}
diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/views/ItemView.java b/forge-gui-desktop/src/main/java/forge/itemmanager/views/ItemView.java
index 58e774f3142..aaff5a98c15 100644
--- a/forge-gui-desktop/src/main/java/forge/itemmanager/views/ItemView.java
+++ b/forge-gui-desktop/src/main/java/forge/itemmanager/views/ItemView.java
@@ -327,7 +327,7 @@ public abstract class ItemView {
private boolean popupShowing = false;
private Popup popup;
private Timer popupTimer;
- private static final int okModifiers = InputEvent.SHIFT_MASK | InputEvent.ALT_GRAPH_MASK;
+ private static final int okModifiers = InputEvent.SHIFT_DOWN_MASK | InputEvent.ALT_GRAPH_DOWN_MASK;
public IncrementalSearch() {
}
@@ -481,7 +481,7 @@ public abstract class ItemView {
//$FALL-THROUGH$
default:
// shift and/or alt-graph down is ok. anything else is a hotkey (e.g. ctrl-f)
- if (okModifiers != (e.getModifiers() | okModifiers)
+ if (okModifiers != (e.getModifiersEx() | okModifiers)
|| !CharUtils.isAsciiPrintable(e.getKeyChar())) { // escape sneaks in here on Windows
return;
}
diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/ACEditorBase.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/ACEditorBase.java
index bce6256d230..d616c02ef3b 100644
--- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/ACEditorBase.java
+++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/ACEditorBase.java
@@ -585,7 +585,7 @@ public abstract class ACEditorBase {
txtScript.setDocument(doc);
error = doc.addStyle("error", null);
error.addAttribute(StyleConstants.Background, Color.red);
- error.addAttribute(StyleConstants.Bold, new Boolean(true));
+ error.addAttribute(StyleConstants.Bold, Boolean.valueOf(true));
}
public JTextPane getTxtScript() {
diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/FUndoManager.java b/forge-gui-desktop/src/main/java/forge/toolbox/FUndoManager.java
index e088eb85555..ad24d10575f 100644
--- a/forge-gui-desktop/src/main/java/forge/toolbox/FUndoManager.java
+++ b/forge-gui-desktop/src/main/java/forge/toolbox/FUndoManager.java
@@ -200,8 +200,8 @@ public class FUndoManager extends UndoManager implements DocumentListener {
public UndoAction() {
putValue(Action.NAME, "Undo");
putValue(Action.SHORT_DESCRIPTION, getValue(Action.NAME));
- putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_U));
- putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_Z, InputEvent.CTRL_MASK));
+ putValue(Action.MNEMONIC_KEY, Integer.valueOf(KeyEvent.VK_U));
+ putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_Z, InputEvent.CTRL_DOWN_MASK));
setEnabled(false);
}
@@ -229,8 +229,8 @@ public class FUndoManager extends UndoManager implements DocumentListener {
public RedoAction() {
putValue(Action.NAME, "Redo");
putValue(Action.SHORT_DESCRIPTION, getValue(Action.NAME));
- putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_R));
- putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_Y, InputEvent.CTRL_MASK));
+ putValue(Action.MNEMONIC_KEY, Integer.valueOf(KeyEvent.VK_R));
+ putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_Y, InputEvent.CTRL_DOWN_MASK));
setEnabled(false);
}
diff --git a/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulatorTest.java b/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulatorTest.java
index b521cd68f12..062cdcb54ce 100644
--- a/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulatorTest.java
+++ b/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulatorTest.java
@@ -1849,7 +1849,7 @@ public class GameSimulatorTest extends SimulationTestCase {
Card simSpark = (Card)sim.getGameCopier().find(sparkDouble);
- assertTrue(simSpark != null);
+ assertNotNull(simSpark);
assertTrue(simSpark.getZone().is(ZoneType.Battlefield));
assertTrue(simSpark.getCounters(CounterType.P1P1) == 1);
assertTrue(simSpark.getCounters(CounterType.LOYALTY) == 5);
@@ -1882,13 +1882,59 @@ public class GameSimulatorTest extends SimulationTestCase {
Card awakened = findCardWithName(sim.getSimulatedGameState(), "Vitu-Ghazi");
- assertTrue(awakened != null);
+ assertNotNull(awakened);
assertTrue(awakened.getName().equals("Vitu-Ghazi"));
assertTrue(awakened.getCounters(CounterType.P1P1) == 9);
assertTrue(awakened.hasKeyword(Keyword.HASTE));
assertTrue(awakened.getType().hasSubtype("Goblin"));
}
+ public void testNecroticOozeActivateOnce() {
+ Game game = initAndCreateGame();
+ Player p = game.getPlayers().get(0);
+ game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p);
+
+ for (int i=0; i<7; i++) { addCardToZone("Swamp", p, ZoneType.Battlefield); }
+ for (int i=0; i<7; i++) { addCardToZone("Forest", p, ZoneType.Battlefield); }
+
+ addCardToZone("Basking Rootwalla", p, ZoneType.Graveyard);
+ Card ooze = addCardToZone("Necrotic Ooze", p, ZoneType.Hand);
+
+ SpellAbility oozeSA = ooze.getFirstSpellAbility();
+ GameSimulator sim = createSimulator(game, p);
+ sim.simulateSpellAbility(oozeSA);
+
+ Card oozeOTB = findCardWithName(sim.getSimulatedGameState(), "Necrotic Ooze");
+
+ assertNotNull(oozeOTB);
+
+ SpellAbility copiedSA = findSAWithPrefix(oozeOTB, "{1}{G}:");
+ assertNotNull(copiedSA);
+ assertTrue(copiedSA.getRestrictions().getLimitToCheck().equals("1"));
+ }
+
+ public void testEpochrasite() {
+ Game game = initAndCreateGame();
+ Player p = game.getPlayers().get(0);
+ game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p);
+
+ for (int i=0; i<7; i++) { addCardToZone("Swamp", p, ZoneType.Battlefield); }
+
+ Card epo = addCardToZone("Epochrasite", p, ZoneType.Graveyard);
+ Card animate = addCardToZone("Animate Dead", p, ZoneType.Hand);
+
+ SpellAbility saAnimate = animate.getFirstSpellAbility();
+ saAnimate.getTargets().add(epo);
+
+ GameSimulator sim = createSimulator(game, p);
+ sim.simulateSpellAbility(saAnimate);
+
+ Card epoOTB = findCardWithName(sim.getSimulatedGameState(), "Epochrasite");
+
+ assertNotNull(epoOTB);
+ assertTrue(epoOTB.getCounters(CounterType.P1P1) == 3);
+ }
+
@SuppressWarnings("unused")
public void broken_testCloneDimir() {
Game game = initAndCreateGame();
diff --git a/forge-gui-ios/pom.xml b/forge-gui-ios/pom.xml
index bdd558aacb8..6cf49bae10c 100644
--- a/forge-gui-ios/pom.xml
+++ b/forge-gui-ios/pom.xml
@@ -6,13 +6,13 @@
jar
-Xms128m
-Xmx2048m
- 1.6.25.001
+ 1.6.26.001
forge
forge
- 1.6.26-SNAPSHOT
+ 1.6.27-SNAPSHOT
forge-gui-ios
diff --git a/forge-gui-mobile-dev/pom.xml b/forge-gui-mobile-dev/pom.xml
index 6aaa483d474..72e6d85ba06 100644
--- a/forge-gui-mobile-dev/pom.xml
+++ b/forge-gui-mobile-dev/pom.xml
@@ -4,7 +4,7 @@
forge
forge
- 1.6.26-SNAPSHOT
+ 1.6.27-SNAPSHOT
forge-gui-mobile-dev
diff --git a/forge-gui-mobile/pom.xml b/forge-gui-mobile/pom.xml
index d0e1c628b54..00726e8d5dc 100644
--- a/forge-gui-mobile/pom.xml
+++ b/forge-gui-mobile/pom.xml
@@ -4,7 +4,7 @@
forge
forge
- 1.6.26-SNAPSHOT
+ 1.6.27-SNAPSHOT
forge-gui-mobile
diff --git a/forge-gui-mobile/src/forge/Forge.java b/forge-gui-mobile/src/forge/Forge.java
index 8594963adcb..cb2b1720c95 100644
--- a/forge-gui-mobile/src/forge/Forge.java
+++ b/forge-gui-mobile/src/forge/Forge.java
@@ -34,7 +34,7 @@ import java.util.List;
import java.util.Stack;
public class Forge implements ApplicationListener {
- public static final String CURRENT_VERSION = "1.6.25.001";
+ public static final String CURRENT_VERSION = "1.6.26.001";
private static final ApplicationListener app = new Forge();
private static Clipboard clipboard;
diff --git a/forge-gui/pom.xml b/forge-gui/pom.xml
index e2602b9e7d3..d93a5621274 100644
--- a/forge-gui/pom.xml
+++ b/forge-gui/pom.xml
@@ -4,7 +4,7 @@
forge
forge
- 1.6.26-SNAPSHOT
+ 1.6.27-SNAPSHOT
forge-gui
diff --git a/forge-gui/release-files/CHANGES.txt b/forge-gui/release-files/CHANGES.txt
index 498ee89e95b..05f0bf1829e 100644
--- a/forge-gui/release-files/CHANGES.txt
+++ b/forge-gui/release-files/CHANGES.txt
@@ -1,5 +1,2 @@
-- New Net Deck Category -
-The Genetic Algorithm AI Decks category has been added to net decks. This contains decks generated using a genetic algorithm to try to find decks that the AI plays best in each format.
-
- Bug fixes -
As always, this release of Forge features an assortment of bug fixes and improvements based on user feedback during the previous release run.
diff --git a/forge-gui/res/cardsfolder/upcoming/abominable_treefolk.txt b/forge-gui/res/cardsfolder/a/abominable_treefolk.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/abominable_treefolk.txt
rename to forge-gui/res/cardsfolder/a/abominable_treefolk.txt
diff --git a/forge-gui/res/cardsfolder/a/ajanis_pridemate.txt b/forge-gui/res/cardsfolder/a/ajanis_pridemate.txt
index 41409051805..9defa76ed61 100644
--- a/forge-gui/res/cardsfolder/a/ajanis_pridemate.txt
+++ b/forge-gui/res/cardsfolder/a/ajanis_pridemate.txt
@@ -2,9 +2,9 @@ Name:Ajani's Pridemate
ManaCost:1 W
Types:Creature Cat Soldier
PT:2/2
-T:Mode$ LifeGained | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | OptionalDecider$ You | TriggerDescription$ Whenever you gain life, you may put a +1/+1 counter on CARDNAME.
+T:Mode$ LifeGained | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever you gain life, put a +1/+1 counter on CARDNAME.
SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1
SVar:Picture:http://www.wizards.com/global/images/magic/general/ajanis_pridemate.jpg
DeckHints:Ability$LifeGain
DeckHas:Ability$Counters
-Oracle:Whenever you gain life, you may put a +1/+1 counter on Ajani's Pridemate.
+Oracle:Whenever you gain life, put a +1/+1 counter on Ajani's Pridemate.
diff --git a/forge-gui/res/cardsfolder/upcoming/alpine_guide.txt b/forge-gui/res/cardsfolder/a/alpine_guide.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/alpine_guide.txt
rename to forge-gui/res/cardsfolder/a/alpine_guide.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/amorphous_axe.txt b/forge-gui/res/cardsfolder/a/amorphous_axe.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/amorphous_axe.txt
rename to forge-gui/res/cardsfolder/a/amorphous_axe.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/answered_prayers.txt b/forge-gui/res/cardsfolder/a/answered_prayers.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/answered_prayers.txt
rename to forge-gui/res/cardsfolder/a/answered_prayers.txt
diff --git a/forge-gui/res/cardsfolder/a/approach_of_the_second_sun.txt b/forge-gui/res/cardsfolder/a/approach_of_the_second_sun.txt
index 70d201f1af9..48c890acdfb 100644
--- a/forge-gui/res/cardsfolder/a/approach_of_the_second_sun.txt
+++ b/forge-gui/res/cardsfolder/a/approach_of_the_second_sun.txt
@@ -3,7 +3,7 @@ ManaCost:6 W
Types:Sorcery
T:Mode$ SpellCast | ValidCard$ Card.Self | Static$ True | Execute$ ApproachingSuns
SVar:ApproachingSuns:DB$ Effect | Name$ ApproachingSuns | Duration$ Permanent
-A:SP$ Branch | Cost$ 6 W | References$ X,Y,Z | BranchConditionSVar$ X | BranchConditionSVarCompare$ EQ3 | TrueSubAbility$ WinGame | FalseSubAbility$ GainLife | SpellDescription$ If CARDNAME was cast from your hand and you've cast another spell named Approach of the Second Sun this game, you win the game. Otherwise, put CARDNAME into its owner's library seventh from the top and you gain 7 life.
+A:SP$ Branch | Cost$ 6 W | References$ X,Y,Z | BranchConditionSVar$ X | BranchConditionSVarCompare$ EQ3 | TrueSubAbility$ WinGame | FalseSubAbility$ GainLife | SpellDescription$ If this spell was cast from your hand and you've cast another spell named Approach of the Second Sun this game, you win the game. Otherwise, put CARDNAME into its owner's library seventh from the top and you gain 7 life.
SVar:WinGame:DB$ WinsGame | Defined$ You
SVar:GainLife:DB$ GainLife | LifeAmount$ 7 | Defined$ You | SubAbility$ Reapproach
SVar:Reapproach:DB$ ChangeZone | Origin$ Stack | Destination$ Library | LibraryPosition$ 6 | Defined$ Self
@@ -11,4 +11,4 @@ SVar:Y:Count$ValidCommand Effect.YouCtrl+namedApproachingSuns/LimitMax.2
SVar:Z:Count$ValidStack Card.wasCastFromHand+Self/LimitMax.1
SVar:X:SVar$Y/Plus.Z
DeckNeeds:Name$Approach of the Second Sun
-Oracle:If Approach of the Second Sun was cast from your hand and you've cast another spell named Approach of the Second Sun this game, you win the game. Otherwise, put Approach of the Second Sun into its owner's library seventh from the top and you gain 7 life.
\ No newline at end of file
+Oracle:If this spell was cast from your hand and you've cast another spell named Approach of the Second Sun this game, you win the game. Otherwise, put Approach of the Second Sun into its owner's library seventh from the top and you gain 7 life.
\ No newline at end of file
diff --git a/forge-gui/res/cardsfolder/upcoming/archmages_charm.txt b/forge-gui/res/cardsfolder/a/archmages_charm.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/archmages_charm.txt
rename to forge-gui/res/cardsfolder/a/archmages_charm.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/arcums_astrolabe.txt b/forge-gui/res/cardsfolder/a/arcums_astrolabe.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/arcums_astrolabe.txt
rename to forge-gui/res/cardsfolder/a/arcums_astrolabe.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/aria_of_flame.txt b/forge-gui/res/cardsfolder/a/aria_of_flame.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/aria_of_flame.txt
rename to forge-gui/res/cardsfolder/a/aria_of_flame.txt
diff --git a/forge-gui/res/cardsfolder/a/artisan_of_forms.txt b/forge-gui/res/cardsfolder/a/artisan_of_forms.txt
index 5168bc73c30..69eccedc206 100644
--- a/forge-gui/res/cardsfolder/a/artisan_of_forms.txt
+++ b/forge-gui/res/cardsfolder/a/artisan_of_forms.txt
@@ -2,7 +2,7 @@ Name:Artisan of Forms
ManaCost:1 U
Types:Creature Human Wizard
PT:1/1
-T:Mode$ SpellCast | ValidActivatingPlayer$ You | TargetsValid$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigArtisanCopy | TriggerDescription$ Heroic — Whenever you cast a spell that targets CARDNAME, you may have CARDNAME become a copy of target creature and gain this ability.
+T:Mode$ SpellCast | ValidActivatingPlayer$ You | TargetsValid$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigArtisanCopy | TriggerDescription$ Heroic — Whenever you cast a spell that targets CARDNAME, you may have CARDNAME become a copy of target creature, except it has this ability.
SVar:TrigArtisanCopy:DB$ Clone | ValidTgts$ Creature | TgtPrompt$ Select target creature to copy | Optional$ True | GainThisAbility$ True | AddSVars$ TrigArtisanCopy | AILogic$ CloneBestCreature
SVar:Picture:http://www.wizards.com/global/images/magic/general/artisan_of_forms.jpg
-Oracle:Heroic — Whenever you cast a spell that targets Artisan of Forms, you may have Artisan of Forms become a copy of target creature and gain this ability.
+Oracle:Heroic — Whenever you cast a spell that targets Artisan of Forms, you may have Artisan of Forms become a copy of target creature, except it has this ability.
diff --git a/forge-gui/res/cardsfolder/upcoming/astral_drift.txt b/forge-gui/res/cardsfolder/a/astral_drift.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/astral_drift.txt
rename to forge-gui/res/cardsfolder/a/astral_drift.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/ayula_queen_among_bears.txt b/forge-gui/res/cardsfolder/a/ayula_queen_among_bears.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/ayula_queen_among_bears.txt
rename to forge-gui/res/cardsfolder/a/ayula_queen_among_bears.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/ayulas_influence.txt b/forge-gui/res/cardsfolder/a/ayulas_influence.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/ayulas_influence.txt
rename to forge-gui/res/cardsfolder/a/ayulas_influence.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/azra_smokeshaper.txt b/forge-gui/res/cardsfolder/a/azra_smokeshaper.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/azra_smokeshaper.txt
rename to forge-gui/res/cardsfolder/a/azra_smokeshaper.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/bazaar_trademage.txt b/forge-gui/res/cardsfolder/b/bazaar_trademage.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/bazaar_trademage.txt
rename to forge-gui/res/cardsfolder/b/bazaar_trademage.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/bellowing_elk.txt b/forge-gui/res/cardsfolder/b/bellowing_elk.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/bellowing_elk.txt
rename to forge-gui/res/cardsfolder/b/bellowing_elk.txt
diff --git a/forge-gui/res/cardsfolder/b/benalish_emissary.txt b/forge-gui/res/cardsfolder/b/benalish_emissary.txt
index 430c6072f3e..695fb18021c 100644
--- a/forge-gui/res/cardsfolder/b/benalish_emissary.txt
+++ b/forge-gui/res/cardsfolder/b/benalish_emissary.txt
@@ -6,5 +6,6 @@ K:Kicker:1 G
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, destroy target land.
SVar:TrigKicker:DB$Destroy | ValidTgts$ Land | TgtPrompt$ Select target land
DeckHints:Color$Green
+SVar:NeedsToPlayKicked:Land.OppCtrl
SVar:Picture:http://www.wizards.com/global/images/magic/general/benalish_emissary.jpg
Oracle:Kicker {1}{G} (You may pay an additional {1}{G} as you cast this spell.)\nWhen Benalish Emissary enters the battlefield, if it was kicked, destroy target land.
diff --git a/forge-gui/res/cardsfolder/upcoming/birthing_boughs.txt b/forge-gui/res/cardsfolder/b/birthing_boughs.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/birthing_boughs.txt
rename to forge-gui/res/cardsfolder/b/birthing_boughs.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/bladeback_sliver.txt b/forge-gui/res/cardsfolder/b/bladeback_sliver.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/bladeback_sliver.txt
rename to forge-gui/res/cardsfolder/b/bladeback_sliver.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/blizzard_strix.txt b/forge-gui/res/cardsfolder/b/blizzard_strix.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/blizzard_strix.txt
rename to forge-gui/res/cardsfolder/b/blizzard_strix.txt
diff --git a/forge-gui/res/cardsfolder/b/bog_down.txt b/forge-gui/res/cardsfolder/b/bog_down.txt
index 381fcab0669..127d1745bba 100644
--- a/forge-gui/res/cardsfolder/b/bog_down.txt
+++ b/forge-gui/res/cardsfolder/b/bog_down.txt
@@ -4,5 +4,8 @@ Types:Sorcery
K:Kicker:Sac<2/Land>
A:SP$ Discard | Cost$ 2 B | ValidTgts$ Player | TgtPrompt$ Choose a player | NumCards$ WasKicked | References$ WasKicked | Mode$ TgtChoose | SpellDescription$ Target player discards two cards. If CARDNAME was kicked, that player discards three cards instead.
SVar:WasKicked:Count$Kicked.3.2
+SVar:NeedsToPlayKickedVar:Z GE3
+SVar:Z:Count$ValidHand Card.OppCtrl
+SVar:AIPreference:SacCost$Land.basic+YouCtrl
SVar:Picture:http://www.wizards.com/global/images/magic/general/bog_down.jpg
Oracle:Kicker—Sacrifice two lands. (You may sacrifice two lands in addition to any other costs as you cast this spell.)\nTarget player discards two cards. If this spell was kicked, that player discards three cards instead.
diff --git a/forge-gui/res/cardsfolder/upcoming/bogardan_dragonheart.txt b/forge-gui/res/cardsfolder/b/bogardan_dragonheart.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/bogardan_dragonheart.txt
rename to forge-gui/res/cardsfolder/b/bogardan_dragonheart.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/cabal_therapist.txt b/forge-gui/res/cardsfolder/c/cabal_therapist.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/cabal_therapist.txt
rename to forge-gui/res/cardsfolder/c/cabal_therapist.txt
diff --git a/forge-gui/res/cardsfolder/c/caligo_skin_witch.txt b/forge-gui/res/cardsfolder/c/caligo_skin_witch.txt
index db9cb3200b3..09282fc143a 100644
--- a/forge-gui/res/cardsfolder/c/caligo_skin_witch.txt
+++ b/forge-gui/res/cardsfolder/c/caligo_skin_witch.txt
@@ -5,4 +5,6 @@ PT:1/3
K:Kicker:3 B
T:Mode$ ChangesZone | ValidCard$ Card.Self+kicked | Origin$ Any | Destination$ Battlefield | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, each opponent discards two cards.
SVar:TrigDiscard:DB$ Discard | Defined$ Player.Opponent | NumCards$ 2 | Mode$ TgtChoose
+SVar:NeedsToPlayKickedVar:Z GE1
+SVar:Z:Count$ValidHand Card.OppCtrl
Oracle:Kicker {3}{B} (You may pay an additional {3}{B} as you cast this spell.)\nWhen Caligo Skin-Witch enters the battlefield, if it was kicked, each opponent discards two cards.
diff --git a/forge-gui/res/cardsfolder/upcoming/cave_of_temptation.txt b/forge-gui/res/cardsfolder/c/cave_of_temptation.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/cave_of_temptation.txt
rename to forge-gui/res/cardsfolder/c/cave_of_temptation.txt
diff --git a/forge-gui/res/cardsfolder/c/cemetery_puca.txt b/forge-gui/res/cardsfolder/c/cemetery_puca.txt
index 6bc8c257d6a..a0f53309c88 100644
--- a/forge-gui/res/cardsfolder/c/cemetery_puca.txt
+++ b/forge-gui/res/cardsfolder/c/cemetery_puca.txt
@@ -3,8 +3,8 @@ ManaCost:1 UB UB
Types:Creature Shapeshifter
PT:1/2
# Make Svars for granting abilities and triggers on clones distinct to avoid SVars getting overwritten when cloning a clone
-T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ CemeteryPucaCopy | TriggerDescription$ Whenever a creature dies, you may pay {1}. If you do, CARDNAME becomes a copy of that creature and gains this ability.
+T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ CemeteryPucaCopy | TriggerDescription$ Whenever a creature dies, you may pay {1}. If you do, CARDNAME becomes a copy of that creature, except it has this ability.
SVar:CemeteryPucaCopy:AB$ Clone | Cost$ 1 | Defined$ TriggeredCardLKICopy | GainThisAbility$ True
AI:RemoveDeck:All
SVar:Picture:http://www.wizards.com/global/images/magic/general/cemetery_puca.jpg
-Oracle:Whenever a creature dies, you may pay {1}. If you do, Cemetery Puca becomes a copy of that creature and gains this ability.
+Oracle:Whenever a creature dies, you may pay {1}. If you do, Cemetery Puca becomes a copy of that creature, except it has this ability.
diff --git a/forge-gui/res/cardsfolder/upcoming/changeling_outcast.txt b/forge-gui/res/cardsfolder/c/changeling_outcast.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/changeling_outcast.txt
rename to forge-gui/res/cardsfolder/c/changeling_outcast.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/chillerpillar.txt b/forge-gui/res/cardsfolder/c/chillerpillar.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/chillerpillar.txt
rename to forge-gui/res/cardsfolder/c/chillerpillar.txt
diff --git a/forge-gui/res/cardsfolder/c/cho_arrim_legate.txt b/forge-gui/res/cardsfolder/c/cho_arrim_legate.txt
index 4dd663e25ce..66f35d47fb8 100644
--- a/forge-gui/res/cardsfolder/c/cho_arrim_legate.txt
+++ b/forge-gui/res/cardsfolder/c/cho_arrim_legate.txt
@@ -3,8 +3,8 @@ ManaCost:2 W
Types:Creature Human Soldier
PT:1/2
K:Protection from black
-S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | Description$ If an opponent controls a Swamp and you control a Plains, you may cast CARDNAME without paying its mana cost.
+S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | Description$ If an opponent controls a Swamp and you control a Plains, you may cast this spell without paying its mana cost.
SVar:X:Count$Valid Swamp.OppCtrl
SVar:Y:Count$Valid Plains.YouCtrl
SVar:Picture:http://www.wizards.com/global/images/magic/general/cho_arrim_legate.jpg
-Oracle:Protection from black\nIf an opponent controls a Swamp and you control a Plains, you may cast Cho-Arrim Legate without paying its mana cost.
+Oracle:Protection from black\nIf an opponent controls a Swamp and you control a Plains, you may cast this spell without paying its mana cost.
diff --git a/forge-gui/res/cardsfolder/upcoming/cleaving_sliver.txt b/forge-gui/res/cardsfolder/c/cleaving_sliver.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/cleaving_sliver.txt
rename to forge-gui/res/cardsfolder/c/cleaving_sliver.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/cloudshredder_sliver.txt b/forge-gui/res/cardsfolder/c/cloudshredder_sliver.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/cloudshredder_sliver.txt
rename to forge-gui/res/cardsfolder/c/cloudshredder_sliver.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/collected_conjuring.txt b/forge-gui/res/cardsfolder/c/collected_conjuring.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/collected_conjuring.txt
rename to forge-gui/res/cardsfolder/c/collected_conjuring.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/collector_ouphe.txt b/forge-gui/res/cardsfolder/c/collector_ouphe.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/collector_ouphe.txt
rename to forge-gui/res/cardsfolder/c/collector_ouphe.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/conifer_wurm.txt b/forge-gui/res/cardsfolder/c/conifer_wurm.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/conifer_wurm.txt
rename to forge-gui/res/cardsfolder/c/conifer_wurm.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/cordial_vampire.txt b/forge-gui/res/cardsfolder/c/cordial_vampire.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/cordial_vampire.txt
rename to forge-gui/res/cardsfolder/c/cordial_vampire.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/crashing_footfalls.txt b/forge-gui/res/cardsfolder/c/crashing_footfalls.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/crashing_footfalls.txt
rename to forge-gui/res/cardsfolder/c/crashing_footfalls.txt
diff --git a/forge-gui/res/cardsfolder/c/crazed_firecat.txt b/forge-gui/res/cardsfolder/c/crazed_firecat.txt
index 5729d197783..b7f1aa0f2bd 100644
--- a/forge-gui/res/cardsfolder/c/crazed_firecat.txt
+++ b/forge-gui/res/cardsfolder/c/crazed_firecat.txt
@@ -2,9 +2,9 @@ Name:Crazed Firecat
ManaCost:5 R R
Types:Creature Elemental Cat
PT:4/4
-T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigFlip | TriggerDescription$ When CARDNAME enters the battlefield, flip a coin until you lose a flip. Put a +1/+1 counter on CARDNAME for each flip you win.
+T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigFlip | TriggerDescription$ When CARDNAME enters the battlefield, flip a coin until you lose a flip. Put a +1/+1 counter on CARDNAME for each flip you won.
SVar:TrigFlip:DB$ FlipACoin | FlipUntilYouLose$ True | SaveNumFlipsToSVar$ X | LoseSubAbility$ DBPutCounter
SVar:DBPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ X | References$ X
SVar:X:Number$0
SVar:Picture:http://www.wizards.com/global/images/magic/general/crazed_firecat.jpg
-Oracle:When Crazed Firecat enters the battlefield, flip a coin until you lose a flip. Put a +1/+1 counter on Crazed Firecat for each flip you win.
+Oracle:When Crazed Firecat enters the battlefield, flip a coin until you lose a flip. Put a +1/+1 counter on Crazed Firecat for each flip you won.
diff --git a/forge-gui/res/cardsfolder/upcoming/cunning_evasion.txt b/forge-gui/res/cardsfolder/c/cunning_evasion.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/cunning_evasion.txt
rename to forge-gui/res/cardsfolder/c/cunning_evasion.txt
diff --git a/forge-gui/res/cardsfolder/d/dacks_duplicate.txt b/forge-gui/res/cardsfolder/d/dacks_duplicate.txt
index ce5cd483f24..8cf010a908b 100644
--- a/forge-gui/res/cardsfolder/d/dacks_duplicate.txt
+++ b/forge-gui/res/cardsfolder/d/dacks_duplicate.txt
@@ -3,6 +3,6 @@ ManaCost:2 U R
Types:Creature Shapeshifter
PT:0/0
K:ETBReplacement:Copy:DBCopy:Optional
-SVar:DBCopy:DB$ Clone | Choices$ Creature.Other | AddKeywords$ Haste & Dethrone | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield except it gains haste and dethrone. (Whenever it attacks the player with the most life or tied for most life, put a +1/+1 counter on it.)
+SVar:DBCopy:DB$ Clone | Choices$ Creature.Other | AddKeywords$ Haste & Dethrone | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield, except it has haste and dethrone. (Whenever it attacks the player with the most life or tied for most life, put a +1/+1 counter on it.)
SVar:Picture:http://www.wizards.com/global/images/magic/general/dacks_duplicate.jpg
-Oracle:You may have Dack's Duplicate enter the battlefield as a copy of any creature on the battlefield except it gains haste and dethrone. (Whenever it attacks the player with the most life or tied for most life, put a +1/+1 counter on it.)
+Oracle:You may have Dack's Duplicate enter the battlefield as a copy of any creature on the battlefield, except it has haste and dethrone. (Whenever it attacks the player with the most life or tied for most life, put a +1/+1 counter on it.)
diff --git a/forge-gui/res/cardsfolder/d/dark_depths.txt b/forge-gui/res/cardsfolder/d/dark_depths.txt
index 923bb8f20d4..e4ec8c13d6a 100644
--- a/forge-gui/res/cardsfolder/d/dark_depths.txt
+++ b/forge-gui/res/cardsfolder/d/dark_depths.txt
@@ -3,9 +3,9 @@ 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 a legendary 20/20 black Avatar creature token with flying and indestructible named Marit Lage.
+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
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 a legendary 20/20 black Avatar creature token with flying and indestructible named Marit Lage.
+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/upcoming/dead_of_winter.txt b/forge-gui/res/cardsfolder/d/dead_of_winter.txt
similarity index 51%
rename from forge-gui/res/cardsfolder/upcoming/dead_of_winter.txt
rename to forge-gui/res/cardsfolder/d/dead_of_winter.txt
index f01e6a9a775..762ab799287 100644
--- a/forge-gui/res/cardsfolder/upcoming/dead_of_winter.txt
+++ b/forge-gui/res/cardsfolder/d/dead_of_winter.txt
@@ -1,7 +1,7 @@
Name:Dead of Winter
ManaCost:2 B
Types:Sorcery
-A:SP$ PumpAll | Cost$ 2 B | ValidCards$ Creature.Snow | NumAtt$ -X | NumDef$ -X | References$ X | SpellDescription$ All nonsnow creatures get -X/-X until end of turn, where X is the number of snow permanents you control.
+A:SP$ PumpAll | Cost$ 2 B | ValidCards$ Creature.nonSnow | NumAtt$ -X | NumDef$ -X | References$ X | SpellDescription$ All nonsnow creatures get -X/-X until end of turn, where X is the number of snow permanents you control.
SVar:X:Count$Valid Permanent.Snow+YouCtrl
AI:RemoveDeck:Random
DeckNeeds:Type$Snow
diff --git a/forge-gui/res/cardsfolder/upcoming/deep_forest_hermit.txt b/forge-gui/res/cardsfolder/d/deep_forest_hermit.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/deep_forest_hermit.txt
rename to forge-gui/res/cardsfolder/d/deep_forest_hermit.txt
diff --git a/forge-gui/res/cardsfolder/d/deepwood_legate.txt b/forge-gui/res/cardsfolder/d/deepwood_legate.txt
index 48294e9cf39..45deb129a93 100644
--- a/forge-gui/res/cardsfolder/d/deepwood_legate.txt
+++ b/forge-gui/res/cardsfolder/d/deepwood_legate.txt
@@ -2,9 +2,9 @@ Name:Deepwood Legate
ManaCost:3 B
Types:Creature Shade
PT:1/1
-S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | Description$ If an opponent controls a Forest and you control a Swamp, you may cast CARDNAME without paying its mana cost.
+S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | Description$ If an opponent controls a Forest and you control a Swamp, you may cast this spell without paying its mana cost.
A:AB$ Pump | Cost$ B | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn.
SVar:X:Count$Valid Forest.OppCtrl
SVar:Y:Count$Valid Swamp.YouCtrl
SVar:Picture:http://www.wizards.com/global/images/magic/general/deepwood_legate.jpg
-Oracle:If an opponent controls a Forest and you control a Swamp, you may cast Deepwood Legate without paying its mana cost.\n{B}: Deepwood Legate gets +1/+1 until end of turn.
+Oracle:If an opponent controls a Forest and you control a Swamp, you may cast this spell without paying its mana cost.\n{B}: Deepwood Legate gets +1/+1 until end of turn.
diff --git a/forge-gui/res/cardsfolder/upcoming/defile.txt b/forge-gui/res/cardsfolder/d/defile.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/defile.txt
rename to forge-gui/res/cardsfolder/d/defile.txt
diff --git a/forge-gui/res/cardsfolder/d/dimir_doppelganger.txt b/forge-gui/res/cardsfolder/d/dimir_doppelganger.txt
index 8eb95e9fc7f..0b47311defa 100644
--- a/forge-gui/res/cardsfolder/d/dimir_doppelganger.txt
+++ b/forge-gui/res/cardsfolder/d/dimir_doppelganger.txt
@@ -3,8 +3,8 @@ ManaCost:1 U B
Types:Creature Shapeshifter
PT:0/2
# Make Svars for granting abilities and triggers on clones distinct to avoid SVars getting overwritten when cloning a clone
-A:AB$ ChangeZone | Cost$ 1 U B | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Creature | RememberTargets$ True | ForgetOtherTargets$ True | SubAbility$ DDCopy | SpellDescription$ Exile target creature card from a graveyard. CARDNAME becomes a copy of that card and gains this ability.
+A:AB$ ChangeZone | Cost$ 1 U B | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Creature | RememberTargets$ True | ForgetOtherTargets$ True | SubAbility$ DDCopy | SpellDescription$ Exile target creature card from a graveyard. CARDNAME becomes a copy of that card, except it has this ability.
SVar:DDCopy:DB$ Clone | Defined$ Remembered | GainThisAbility$ True
AI:RemoveDeck:All
SVar:Picture:http://www.wizards.com/global/images/magic/general/dimir_doppelganger.jpg
-Oracle:{1}{U}{B}: Exile target creature card from a graveyard. Dimir Doppelganger becomes a copy of that card and gains this ability.
+Oracle:{1}{U}{B}: Exile target creature card from a graveyard. Dimir Doppelganger becomes a copy of that card, except it has this ability.
diff --git a/forge-gui/res/cardsfolder/d/dream_pillager.txt b/forge-gui/res/cardsfolder/d/dream_pillager.txt
index 9956b223480..53c861debfc 100644
--- a/forge-gui/res/cardsfolder/d/dream_pillager.txt
+++ b/forge-gui/res/cardsfolder/d/dream_pillager.txt
@@ -3,11 +3,11 @@ ManaCost:5 R R
Types:Creature Dragon
PT:4/4
K:Flying
-T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigExile | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, exile that many cards from the top of your library. Until end of turn, you may cast nonland cards exiled this way.
+T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigExile | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, exile that many cards from the top of your library. Until end of turn, you may cast nonland cards from among those exiled cards.
SVar:TrigExile:DB$ Mill | Defined$ You | NumCards$ X | References$ X | Destination$ Exile | RememberMilled$ True | SubAbility$ DBEffect
SVar:DBEffect:DB$ Effect | StaticAbilities$ STPlay | ForgetOnMoved$ Exile | RememberObjects$ RememberedCard | SubAbility$ DBCleanup
-SVar:STPlay:Mode$ Continuous | EffectZone$ Command | Affected$ Card.nonLand+IsRemembered | MayPlay$ True | AffectedZone$ Exile | Description$ Until end of turn, you may play that card.
+SVar:STPlay:Mode$ Continuous | EffectZone$ Command | Affected$ Card.nonLand+IsRemembered | MayPlay$ True | AffectedZone$ Exile | Description$ Until end of turn, you may cast nonland cards from among those exiled cards.
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:X:TriggerCount$DamageAmount
SVar:Picture:http://www.wizards.com/global/images/magic/general/dream_pillager.jpg
-Oracle:Flying\nWhenever Dream Pillager deals combat damage to a player, exile that many cards from the top of your library. Until end of turn, you may cast nonland cards exiled this way.
+Oracle:Flying\nWhenever Dream Pillager deals combat damage to a player, exile that many cards from the top of your library. Until end of turn, you may cast nonland cards from among those exiled cards.
diff --git a/forge-gui/res/cardsfolder/upcoming/dregscape_sliver.txt b/forge-gui/res/cardsfolder/d/dregscape_sliver.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/dregscape_sliver.txt
rename to forge-gui/res/cardsfolder/d/dregscape_sliver.txt
diff --git a/forge-gui/res/cardsfolder/d/dwarven_landslide.txt b/forge-gui/res/cardsfolder/d/dwarven_landslide.txt
index ac41042fa2f..9b0a47d15de 100644
--- a/forge-gui/res/cardsfolder/d/dwarven_landslide.txt
+++ b/forge-gui/res/cardsfolder/d/dwarven_landslide.txt
@@ -4,5 +4,7 @@ Types:Sorcery
K:Kicker:2 R Sac<1/Land>
A:SP$ Destroy | Cost$ 3 R | ValidTgts$ Land | TargetMin$ X | TargetMax$ X | References$ X | TgtPrompt$ Select target land | SpellDescription$ Destroy target land. If CARDNAME was kicked, destroy another target land.
SVar:X:Count$Kicked.2.1
+SVar:NeedsToPlayKickedVar:Z GE2
+SVar:Z:Count$Valid Land.OppCtrl
SVar:Picture:http://www.wizards.com/global/images/magic/general/dwarven_landslide.jpg
Oracle:Kicker—{2}{R}, Sacrifice a land. (You may pay {2}{R} and sacrifice a land in addition to any other costs as you cast this spell.)\nDestroy target land. If Dwarven Landslide was kicked, destroy another target land.
diff --git a/forge-gui/res/cardsfolder/upcoming/echo_of_eons.txt b/forge-gui/res/cardsfolder/e/echo_of_eons.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/echo_of_eons.txt
rename to forge-gui/res/cardsfolder/e/echo_of_eons.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/endling.txt b/forge-gui/res/cardsfolder/e/endling.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/endling.txt
rename to forge-gui/res/cardsfolder/e/endling.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/enduring_sliver.txt b/forge-gui/res/cardsfolder/e/enduring_sliver.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/enduring_sliver.txt
rename to forge-gui/res/cardsfolder/e/enduring_sliver.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/ephemerate.txt b/forge-gui/res/cardsfolder/e/ephemerate.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/ephemerate.txt
rename to forge-gui/res/cardsfolder/e/ephemerate.txt
diff --git a/forge-gui/res/cardsfolder/e/epochrasite.txt b/forge-gui/res/cardsfolder/e/epochrasite.txt
index f1e017ceebd..e6a5965d55a 100644
--- a/forge-gui/res/cardsfolder/e/epochrasite.txt
+++ b/forge-gui/res/cardsfolder/e/epochrasite.txt
@@ -2,7 +2,7 @@ Name:Epochrasite
ManaCost:2
Types:Artifact Creature Construct
PT:1/1
-K:etbCounter:P1P1:3:ValidLKI$ Card.Self+wasNotCastFromHand:CARDNAME enters the battlefield with three +1/+1 counters on it if you didn't cast it from your hand.
+K:etbCounter:P1P1:3:ValidCard$ Card.Self+wasNotCastFromHand:CARDNAME enters the battlefield with three +1/+1 counters on it if you didn't cast it from your hand.
T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigExile | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, exile it with three time counters on it and it gains suspend.
SVar:TrigExile:DB$ ChangeZone | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Exile | SubAbility$ DBPutCounter | RememberChanged$ True
SVar:DBPutCounter:DB$ PutCounter | Defined$ Remembered | CounterType$ TIME | CounterNum$ 3 | SubAbility$ GiveSuspend
diff --git a/forge-gui/res/cardsfolder/upcoming/etchings_of_the_chosen.txt b/forge-gui/res/cardsfolder/e/etchings_of_the_chosen.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/etchings_of_the_chosen.txt
rename to forge-gui/res/cardsfolder/e/etchings_of_the_chosen.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/everdream.txt b/forge-gui/res/cardsfolder/e/everdream.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/everdream.txt
rename to forge-gui/res/cardsfolder/e/everdream.txt
diff --git a/forge-gui/res/cardsfolder/e/evil_twin.txt b/forge-gui/res/cardsfolder/e/evil_twin.txt
index 683191e7ed6..0a55f1b6eec 100644
--- a/forge-gui/res/cardsfolder/e/evil_twin.txt
+++ b/forge-gui/res/cardsfolder/e/evil_twin.txt
@@ -4,7 +4,7 @@ Types:Creature Shapeshifter
PT:0/0
# Make Svars for granting abilities and triggers on clones distinct to avoid SVars getting overwritten when cloning a clone
K:ETBReplacement:Copy:DBCopy:Optional
-SVar:DBCopy:DB$ Clone | Choices$ Creature.Other | AddAbilities$ EvilTwin | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield, except it gains "{U}{B}, {T}: Destroy target creature with the same name as this creature."
+SVar:DBCopy:DB$ Clone | Choices$ Creature.Other | AddAbilities$ EvilTwin | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield, except it has "{U}{B}, {T}: Destroy target creature with the same name as this creature."
SVar:EvilTwin:AB$Destroy | Cost$ U B T | ValidTgts$ Creature.sameName | TgtPrompt$ Select target creature with the same name. | SpellDescription$ Destroy target creature with the same name as this creature.
SVar:Picture:http://www.wizards.com/global/images/magic/general/evil_twin.jpg
-Oracle:You may have Evil Twin enter the battlefield as a copy of any creature on the battlefield, except it gains "{U}{B}, {T}: Destroy target creature with the same name as this creature."
+Oracle:You may have Evil Twin enter the battlefield as a copy of any creature on the battlefield, except it has "{U}{B}, {T}: Destroy target creature with the same name as this creature."
diff --git a/forge-gui/res/cardsfolder/upcoming/excavating_anurid.txt b/forge-gui/res/cardsfolder/e/excavating_anurid.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/excavating_anurid.txt
rename to forge-gui/res/cardsfolder/e/excavating_anurid.txt
diff --git a/forge-gui/res/cardsfolder/e/excavation_elephant.txt b/forge-gui/res/cardsfolder/e/excavation_elephant.txt
index 5d4c069b4d0..3d9fd4f727e 100644
--- a/forge-gui/res/cardsfolder/e/excavation_elephant.txt
+++ b/forge-gui/res/cardsfolder/e/excavation_elephant.txt
@@ -5,4 +5,6 @@ PT:3/5
K:Kicker:1 W
T:Mode$ ChangesZone | ValidCard$ Card.Self+kicked | Origin$ Any | Destination$ Battlefield | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, return target artifact card from your graveyard to your hand.
SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target artifact card in your graveyard | ValidTgts$ Artifact.YouOwn
+SVar:NeedsToPlayKickedVar:Z GE1
+SVar:Z:Count$ValidGraveyard Artifact.YouOwn
Oracle:Kicker {1}{W} (You may pay an additional {1}{W} as you cast this spell.)\nWhen Excavation Elephant enters the battlefield, if it was kicked, return target artifact card from your graveyard to your hand.
diff --git a/forge-gui/res/cardsfolder/upcoming/eyekite.txt b/forge-gui/res/cardsfolder/e/eyekite.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/eyekite.txt
rename to forge-gui/res/cardsfolder/e/eyekite.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/face_of_divinity.txt b/forge-gui/res/cardsfolder/f/face_of_divinity.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/face_of_divinity.txt
rename to forge-gui/res/cardsfolder/f/face_of_divinity.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/faerie_seer.txt b/forge-gui/res/cardsfolder/f/faerie_seer.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/faerie_seer.txt
rename to forge-gui/res/cardsfolder/f/faerie_seer.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/fallen_shinobi.txt b/forge-gui/res/cardsfolder/f/fallen_shinobi.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/fallen_shinobi.txt
rename to forge-gui/res/cardsfolder/f/fallen_shinobi.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/farmstead_gleaner.txt b/forge-gui/res/cardsfolder/f/farmstead_gleaner.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/farmstead_gleaner.txt
rename to forge-gui/res/cardsfolder/f/farmstead_gleaner.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/feaster_of_fools.txt b/forge-gui/res/cardsfolder/f/feaster_of_fools.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/feaster_of_fools.txt
rename to forge-gui/res/cardsfolder/f/feaster_of_fools.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/fiery_islet.txt b/forge-gui/res/cardsfolder/f/fiery_islet.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/fiery_islet.txt
rename to forge-gui/res/cardsfolder/f/fiery_islet.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/first_slivers_chosen.txt b/forge-gui/res/cardsfolder/f/first_slivers_chosen.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/first_slivers_chosen.txt
rename to forge-gui/res/cardsfolder/f/first_slivers_chosen.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/first_sphere_gargantua.txt b/forge-gui/res/cardsfolder/f/first_sphere_gargantua.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/first_sphere_gargantua.txt
rename to forge-gui/res/cardsfolder/f/first_sphere_gargantua.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/fists_of_flame.txt b/forge-gui/res/cardsfolder/f/fists_of_flame.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/fists_of_flame.txt
rename to forge-gui/res/cardsfolder/f/fists_of_flame.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/force_of_despair.txt b/forge-gui/res/cardsfolder/f/force_of_despair.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/force_of_despair.txt
rename to forge-gui/res/cardsfolder/f/force_of_despair.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/force_of_negation.txt b/forge-gui/res/cardsfolder/f/force_of_negation.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/force_of_negation.txt
rename to forge-gui/res/cardsfolder/f/force_of_negation.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/force_of_rage.txt b/forge-gui/res/cardsfolder/f/force_of_rage.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/force_of_rage.txt
rename to forge-gui/res/cardsfolder/f/force_of_rage.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/force_of_vigor.txt b/forge-gui/res/cardsfolder/f/force_of_vigor.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/force_of_vigor.txt
rename to forge-gui/res/cardsfolder/f/force_of_vigor.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/force_of_virtue.txt b/forge-gui/res/cardsfolder/f/force_of_virtue.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/force_of_virtue.txt
rename to forge-gui/res/cardsfolder/f/force_of_virtue.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/fountain_of_ichor.txt b/forge-gui/res/cardsfolder/f/fountain_of_ichor.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/fountain_of_ichor.txt
rename to forge-gui/res/cardsfolder/f/fountain_of_ichor.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/frostwalk_bastion.txt b/forge-gui/res/cardsfolder/f/frostwalk_bastion.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/frostwalk_bastion.txt
rename to forge-gui/res/cardsfolder/f/frostwalk_bastion.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/frostwalla.txt b/forge-gui/res/cardsfolder/f/frostwalla.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/frostwalla.txt
rename to forge-gui/res/cardsfolder/f/frostwalla.txt
diff --git a/forge-gui/res/cardsfolder/g/gatekeeper_of_malakir.txt b/forge-gui/res/cardsfolder/g/gatekeeper_of_malakir.txt
index 1e71c7024a4..9f428d0adec 100644
--- a/forge-gui/res/cardsfolder/g/gatekeeper_of_malakir.txt
+++ b/forge-gui/res/cardsfolder/g/gatekeeper_of_malakir.txt
@@ -5,7 +5,7 @@ PT:2/2
K:Kicker:B
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, target player sacrifices a creature.
SVar:TrigKicker:DB$ Sacrifice | ValidTgts$ Player | SacValid$ Creature | SacMessage$ Creature
-SVar:NeedsToPlay:Creature.YouDontCtrl
+SVar:NeedsToPlayKicked:Creature.YouDontCtrl
SVar:PlayMain1:TRUE
SVar:Picture:http://www.wizards.com/global/images/magic/general/gatekeeper_of_malakir.jpg
Oracle:Kicker {B} (You may pay an additional {B} as you cast this spell.)\nWhen Gatekeeper of Malakir enters the battlefield, if it was kicked, target player sacrifices a creature.
diff --git a/forge-gui/res/cardsfolder/upcoming/generous_gift.txt b/forge-gui/res/cardsfolder/g/generous_gift.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/generous_gift.txt
rename to forge-gui/res/cardsfolder/g/generous_gift.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/geomancers_gambit.txt b/forge-gui/res/cardsfolder/g/geomancers_gambit.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/geomancers_gambit.txt
rename to forge-gui/res/cardsfolder/g/geomancers_gambit.txt
diff --git a/forge-gui/res/cardsfolder/g/ghitu_chronicler.txt b/forge-gui/res/cardsfolder/g/ghitu_chronicler.txt
index 59ec14dca72..93057963ce8 100644
--- a/forge-gui/res/cardsfolder/g/ghitu_chronicler.txt
+++ b/forge-gui/res/cardsfolder/g/ghitu_chronicler.txt
@@ -5,4 +5,7 @@ PT:1/3
K:Kicker:3 R
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, return target instant or sorcery card from your graveyard to your hand.
SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl
+SVar:NeedsToPlayKickedVar:Z GE1
+SVar:Z:Count$ValidGraveyard Instant.YouOwn/Plus.Z1
+SVar:Z1:Count$ValidGraveyard Sorcery.YouOwn
Oracle:Kicker {3}{R} (You may pay an additional {3}{R} as you cast this spell.)\nWhen Ghitu Chronicler enters the battlefield, if it was kicked, return target instant or sorcery card from your graveyard to your hand.
diff --git a/forge-gui/res/cardsfolder/g/gigantoplasm.txt b/forge-gui/res/cardsfolder/g/gigantoplasm.txt
index eea8196c8c6..73733579483 100644
--- a/forge-gui/res/cardsfolder/g/gigantoplasm.txt
+++ b/forge-gui/res/cardsfolder/g/gigantoplasm.txt
@@ -3,8 +3,8 @@ ManaCost:3 U
Types:Creature Shapeshifter
PT:0/0
K:ETBReplacement:Copy:DBCopy:Optional
-SVar:DBCopy:DB$ Clone | Choices$ Creature.Other | AddAbilities$ Gigantoplasm | AddSVars$ X | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield except it gains "{X}: This creature has base power and toughness of X/X."
+SVar:DBCopy:DB$ Clone | Choices$ Creature.Other | AddAbilities$ Gigantoplasm | AddSVars$ X | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield, except it has "{X}: This creature has base power and toughness of X/X."
SVar:Gigantoplasm:AB$ Animate | Cost$ X | Power$ X | Toughness$ X | References$ X | ValidCards$ Self | Permanent$ True | SpellDescription$ CARDNAME has base power and toughness of X/X.
SVar:X:Count$xPaid
SVar:Picture:http://www.wizards.com/global/images/magic/general/gigantoplasm.jpg
-Oracle:You may have Gigantoplasm enter the battlefield as a copy of any creature on the battlefield except it gains "{X}: This creature has base power and toughness X/X."
+Oracle:You may have Gigantoplasm enter the battlefield as a copy of any creature on the battlefield, except it has "{X}: This creature has base power and toughness X/X."
diff --git a/forge-gui/res/cardsfolder/upcoming/giver_of_runes.txt b/forge-gui/res/cardsfolder/g/giver_of_runes.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/giver_of_runes.txt
rename to forge-gui/res/cardsfolder/g/giver_of_runes.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/glacial_revelation.txt b/forge-gui/res/cardsfolder/g/glacial_revelation.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/glacial_revelation.txt
rename to forge-gui/res/cardsfolder/g/glacial_revelation.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/gluttonous_slug.txt b/forge-gui/res/cardsfolder/g/gluttonous_slug.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/gluttonous_slug.txt
rename to forge-gui/res/cardsfolder/g/gluttonous_slug.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/goatnap.txt b/forge-gui/res/cardsfolder/g/goatnap.txt
similarity index 86%
rename from forge-gui/res/cardsfolder/upcoming/goatnap.txt
rename to forge-gui/res/cardsfolder/g/goatnap.txt
index 0c21954562a..105bc13bc9b 100644
--- a/forge-gui/res/cardsfolder/upcoming/goatnap.txt
+++ b/forge-gui/res/cardsfolder/g/goatnap.txt
@@ -1,7 +1,7 @@
Name:Goatnap
ManaCost:2 R
Types:Sorcery
-A:SP$ GainControl | Cost$ 2 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | Untap$ True | AddKWs$ Haste | LoseControl$ EOT | SubAbility$ DBPump | SpellDescription$ Gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn. If that creature is a, it also gets +3/+0 until end of turn.
+A:SP$ GainControl | Cost$ 2 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | Untap$ True | AddKWs$ Haste | LoseControl$ EOT | SubAbility$ DBPump | SpellDescription$ Gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn. If that creature is a goat, it also gets +3/+0 until end of turn.
SVar:DBPump:DB$ Pump | Defined$ Targeted | NumAtt$ 3 | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | References$ X
SVar:X:Targeted$Valid Goat
Oracle:Gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn. If that creature is a goat, it also gets +3/+0 until end of turn.
diff --git a/forge-gui/res/cardsfolder/upcoming/goblin_champion.txt b/forge-gui/res/cardsfolder/g/goblin_champion.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/goblin_champion.txt
rename to forge-gui/res/cardsfolder/g/goblin_champion.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/goblin_engineer.txt b/forge-gui/res/cardsfolder/g/goblin_engineer.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/goblin_engineer.txt
rename to forge-gui/res/cardsfolder/g/goblin_engineer.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/goblin_oriflamme.txt b/forge-gui/res/cardsfolder/g/goblin_oriflamme.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/goblin_oriflamme.txt
rename to forge-gui/res/cardsfolder/g/goblin_oriflamme.txt
diff --git a/forge-gui/res/cardsfolder/g/goblin_ruinblaster.txt b/forge-gui/res/cardsfolder/g/goblin_ruinblaster.txt
index 523769fd6f9..3ee041e0021 100644
--- a/forge-gui/res/cardsfolder/g/goblin_ruinblaster.txt
+++ b/forge-gui/res/cardsfolder/g/goblin_ruinblaster.txt
@@ -6,5 +6,6 @@ K:Haste
K:Kicker:R
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, destroy target nonbasic land.
SVar:TrigKicker:DB$Destroy | ValidTgts$ Land.nonBasic | TgtPrompt$ Select target nonbasic land.
+SVar:NeedsToPlayKicked:Land.nonBasic+OppCtrl
SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_ruinblaster.jpg
Oracle:Kicker {R} (You may pay an additional {R} as you cast this spell.)\nHaste\nWhen Goblin Ruinblaster enters the battlefield, if it was kicked, destroy target nonbasic land.
diff --git a/forge-gui/res/cardsfolder/upcoming/goblin_war_party.txt b/forge-gui/res/cardsfolder/g/goblin_war_party.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/goblin_war_party.txt
rename to forge-gui/res/cardsfolder/g/goblin_war_party.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/good_fortune_unicorn.txt b/forge-gui/res/cardsfolder/g/good_fortune_unicorn.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/good_fortune_unicorn.txt
rename to forge-gui/res/cardsfolder/g/good_fortune_unicorn.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/graveshifter.txt b/forge-gui/res/cardsfolder/g/graveshifter.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/graveshifter.txt
rename to forge-gui/res/cardsfolder/g/graveshifter.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/hall_of_heliods_generosity.txt b/forge-gui/res/cardsfolder/h/hall_of_heliods_generosity.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/hall_of_heliods_generosity.txt
rename to forge-gui/res/cardsfolder/h/hall_of_heliods_generosity.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/headless_specter.txt b/forge-gui/res/cardsfolder/h/headless_specter.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/headless_specter.txt
rename to forge-gui/res/cardsfolder/h/headless_specter.txt
diff --git a/forge-gui/res/cardsfolder/h/heartstabber_mosquito.txt b/forge-gui/res/cardsfolder/h/heartstabber_mosquito.txt
index d2b45a5a3e2..e8ac0ea55c3 100644
--- a/forge-gui/res/cardsfolder/h/heartstabber_mosquito.txt
+++ b/forge-gui/res/cardsfolder/h/heartstabber_mosquito.txt
@@ -7,5 +7,6 @@ K:Kicker:2 B
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, destroy target creature.
SVar:TrigKicker:DB$Destroy | ValidTgts$ Creature | TgtPrompt$ Select target creature.
SVar:PlayMain1:TRUE
+SVar:NeedsToPlayKicked:Creature.OppCtrl
SVar:Picture:http://www.wizards.com/global/images/magic/general/Heartstabber_Mosquito.jpg
Oracle:Kicker {2}{B} (You may pay an additional {2}{B} as you cast this spell.)\nFlying\nWhen Heartstabber Mosquito enters the battlefield, if it was kicked, destroy target creature.
\ No newline at end of file
diff --git a/forge-gui/res/cardsfolder/h/heat_shimmer.txt b/forge-gui/res/cardsfolder/h/heat_shimmer.txt
index 5f3aff8e3ec..93391920855 100644
--- a/forge-gui/res/cardsfolder/h/heat_shimmer.txt
+++ b/forge-gui/res/cardsfolder/h/heat_shimmer.txt
@@ -1,6 +1,6 @@
Name:Heat Shimmer
ManaCost:2 R
Types:Sorcery
-A:SP$ CopyPermanent | Cost$ 2 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | AddKeywords$ Haste | AtEOTTrig$ Exile | SpellDescription$ Create a token that's a copy of target creature. That token has haste and "At the beginning of the end step, exile this permanent."
+A:SP$ CopyPermanent | Cost$ 2 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | AddKeywords$ Haste | AtEOTTrig$ Exile | SpellDescription$ Create a token that's a copy of target creature, except it has haste and "At the beginning of the end step, exile this permanent."
SVar:Picture:http://www.wizards.com/global/images/magic/general/heat_shimmer.jpg
-Oracle:Create a token that's a copy of target creature. That token has haste and "At the beginning of the end step, exile this permanent."
+Oracle:Create a token that's a copy of target creature, except it has haste and "At the beginning of the end step, exile this permanent."
diff --git a/forge-gui/res/cardsfolder/upcoming/hexdrinker.txt b/forge-gui/res/cardsfolder/h/hexdrinker.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/hexdrinker.txt
rename to forge-gui/res/cardsfolder/h/hexdrinker.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/hogaak_arisen_necropolis.txt b/forge-gui/res/cardsfolder/h/hogaak_arisen_necropolis.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/hogaak_arisen_necropolis.txt
rename to forge-gui/res/cardsfolder/h/hogaak_arisen_necropolis.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/hollowhead_sliver.txt b/forge-gui/res/cardsfolder/h/hollowhead_sliver.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/hollowhead_sliver.txt
rename to forge-gui/res/cardsfolder/h/hollowhead_sliver.txt
diff --git a/forge-gui/res/cardsfolder/h/hypnotic_cloud.txt b/forge-gui/res/cardsfolder/h/hypnotic_cloud.txt
index af49ff69459..b7c816f91d3 100644
--- a/forge-gui/res/cardsfolder/h/hypnotic_cloud.txt
+++ b/forge-gui/res/cardsfolder/h/hypnotic_cloud.txt
@@ -4,5 +4,7 @@ Types:Sorcery
K:Kicker:4
A:SP$ Discard | Cost$ 1 B | NumCards$ X | References$ X | ValidTgts$ Player | TgtPrompt$ Select target player | Mode$ TgtChoose | SpellDescription$ Target player discards a card. If CARDNAME was kicked, that player discards three cards instead.
SVar:X:Count$Kicked.3.1
+SVar:NeedsToPlayKickedVar:Z GE2
+SVar:Z:Count$ValidHand Card.OppCtrl
SVar:Picture:http://www.wizards.com/global/images/magic/general/hypnotic_cloud.jpg
Oracle:Kicker {4} (You may pay an additional {4} as you cast this spell.)\nTarget player discards a card. If Hypnotic Cloud was kicked, that player discards three cards instead.
diff --git a/forge-gui/res/cardsfolder/upcoming/ice_fang_coatl.txt b/forge-gui/res/cardsfolder/i/ice_fang_coatl.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/ice_fang_coatl.txt
rename to forge-gui/res/cardsfolder/i/ice_fang_coatl.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/iceberg_cancrix.txt b/forge-gui/res/cardsfolder/i/iceberg_cancrix.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/iceberg_cancrix.txt
rename to forge-gui/res/cardsfolder/i/iceberg_cancrix.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/icehide_golem.txt b/forge-gui/res/cardsfolder/i/icehide_golem.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/icehide_golem.txt
rename to forge-gui/res/cardsfolder/i/icehide_golem.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/igneous_elemental.txt b/forge-gui/res/cardsfolder/i/igneous_elemental.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/igneous_elemental.txt
rename to forge-gui/res/cardsfolder/i/igneous_elemental.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/impostor_of_the_sixth_pride.txt b/forge-gui/res/cardsfolder/i/impostor_of_the_sixth_pride.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/impostor_of_the_sixth_pride.txt
rename to forge-gui/res/cardsfolder/i/impostor_of_the_sixth_pride.txt
diff --git a/forge-gui/res/cardsfolder/i/increasing_ambition.txt b/forge-gui/res/cardsfolder/i/increasing_ambition.txt
index 3d195b06464..9c0c4747b61 100644
--- a/forge-gui/res/cardsfolder/i/increasing_ambition.txt
+++ b/forge-gui/res/cardsfolder/i/increasing_ambition.txt
@@ -2,7 +2,7 @@ Name:Increasing Ambition
ManaCost:4 B
Types:Sorcery
K:Flashback:7 B
-A:SP$ ChangeZone | Cost$ 4 B | Origin$ Library | Destination$ Hand | ChangeType$ Card | ChangeNum$ X | Mandatory$ True | References$ X | SpellDescription$ Search your library for a card and put that card into your hand. If CARDNAME was cast from a graveyard, instead search your library for two cards and put them into your hand. Then shuffle your library.
+A:SP$ ChangeZone | Cost$ 4 B | Origin$ Library | Destination$ Hand | ChangeType$ Card | ChangeNum$ X | Mandatory$ True | References$ X | SpellDescription$ Search your library for a card and put that card into your hand. If this spell was cast from a graveyard, instead search your library for two cards and put them into your hand. Then shuffle your library.
SVar:X:Count$wasCastFromGraveyard.2.1
SVar:Picture:http://www.wizards.com/global/images/magic/general/increasing_ambition.jpg
-Oracle:Search your library for a card and put that card into your hand. If Increasing Ambition was cast from a graveyard, instead search your library for two cards and put those cards into your hand. Then shuffle your library.\nFlashback {7}{B} (You may cast this card from your graveyard for its flashback cost. Then exile it.)
+Oracle:Search your library for a card and put that card into your hand. If this spell was cast from a graveyard, instead search your library for two cards and put those cards into your hand. Then shuffle your library.\nFlashback {7}{B} (You may cast this card from your graveyard for its flashback cost. Then exile it.)
diff --git a/forge-gui/res/cardsfolder/i/increasing_confusion.txt b/forge-gui/res/cardsfolder/i/increasing_confusion.txt
index 1dc02f5bbfc..76a7b09503e 100644
--- a/forge-gui/res/cardsfolder/i/increasing_confusion.txt
+++ b/forge-gui/res/cardsfolder/i/increasing_confusion.txt
@@ -2,9 +2,9 @@ Name:Increasing Confusion
ManaCost:X U
Types:Sorcery
K:Flashback:X U
-A:SP$ Mill | Cost$ X U | NumCards$ Z | ValidTgts$ Player | TgtPrompt$ Choose a player | References$ X,Y,Z | SpellDescription$ Target player puts the top X cards of their library into their graveyard. If CARDNAME was cast from a graveyard, that player puts twice as many cards into their graveyard instead.
+A:SP$ Mill | Cost$ X U | NumCards$ Z | ValidTgts$ Player | TgtPrompt$ Choose a player | References$ X,Y,Z | SpellDescription$ Target player puts the top X cards of their library into their graveyard. If this spell was cast from a graveyard, that player puts twice as many cards into their graveyard instead.
SVar:Z:SVar$X/Times.Y
SVar:X:Count$xPaid
SVar:Y:wasCastFromGraveyard.2.1
SVar:Picture:http://www.wizards.com/global/images/magic/general/increasing_confusion.jpg
-Oracle:Target player puts the top X cards of their library into their graveyard. If Increasing Confusion was cast from a graveyard, that player puts twice that many cards into their graveyard instead.\nFlashback {X}{U} (You may cast this card from your graveyard for its flashback cost. Then exile it.)
+Oracle:Target player puts the top X cards of their library into their graveyard. If this spell was cast from a graveyard, that player puts twice that many cards into their graveyard instead.\nFlashback {X}{U} (You may cast this card from your graveyard for its flashback cost. Then exile it.)
diff --git a/forge-gui/res/cardsfolder/i/increasing_devotion.txt b/forge-gui/res/cardsfolder/i/increasing_devotion.txt
index 77ba865a7cc..5a95cd235eb 100644
--- a/forge-gui/res/cardsfolder/i/increasing_devotion.txt
+++ b/forge-gui/res/cardsfolder/i/increasing_devotion.txt
@@ -2,7 +2,7 @@ Name:Increasing Devotion
ManaCost:3 W W
Types:Sorcery
K:Flashback:7 W W
-A:SP$ Token | Cost$ 3 W W | TokenAmount$ X | TokenScript$ w_1_1_human | LegacyImage$ w 1 1 human dka | TokenOwner$ You | References$ X | SpellDescription$ Create five 1/1 white Human creature tokens. If CARDNAME was cast from a graveyard, create ten of those tokens instead.
+A:SP$ Token | Cost$ 3 W W | TokenAmount$ X | TokenScript$ w_1_1_human | LegacyImage$ w 1 1 human dka | TokenOwner$ You | References$ X | SpellDescription$ Create five 1/1 white Human creature tokens. If this spell was cast from a graveyard, create ten of those tokens instead.
SVar:X:Count$wasCastFromGraveyard.10.5
SVar:Picture:http://www.wizards.com/global/images/magic/general/increasing_devotion.jpg
-Oracle:Create five 1/1 white Human creature tokens. If Increasing Devotion was cast from a graveyard, create ten of those tokens instead.\nFlashback {7}{W}{W} (You may cast this card from your graveyard for its flashback cost. Then exile it.)
+Oracle:Create five 1/1 white Human creature tokens. If this spell was cast from a graveyard, create ten of those tokens instead.\nFlashback {7}{W}{W} (You may cast this card from your graveyard for its flashback cost. Then exile it.)
diff --git a/forge-gui/res/cardsfolder/i/increasing_savagery.txt b/forge-gui/res/cardsfolder/i/increasing_savagery.txt
index 335714eb288..4eb9d8216b2 100644
--- a/forge-gui/res/cardsfolder/i/increasing_savagery.txt
+++ b/forge-gui/res/cardsfolder/i/increasing_savagery.txt
@@ -2,7 +2,7 @@ Name:Increasing Savagery
ManaCost:2 G G
Types:Sorcery
K:Flashback:5 G G
-A:SP$ PutCounter | Cost$ 2 G G | CounterNum$ X | CounterType$ P1P1 | ValidTgts$ Creature | TgtPrompt$ Select target creature | References$ X | SpellDescription$ Put five +1/+1 counters on target creature. If CARDNAME was cast from a graveyard, put ten +1/+1 counters on that creature instead.
+A:SP$ PutCounter | Cost$ 2 G G | CounterNum$ X | CounterType$ P1P1 | ValidTgts$ Creature | TgtPrompt$ Select target creature | References$ X | SpellDescription$ Put five +1/+1 counters on target creature. If this spell was cast from a graveyard, put ten +1/+1 counters on that creature instead.
SVar:X:Count$wasCastFromGraveyard.10.5
SVar:Picture:http://www.wizards.com/global/images/magic/general/increasing_savagery.jpg
-Oracle:Put five +1/+1 counters on target creature. If Increasing Savagery was cast from a graveyard, put ten +1/+1 counters on that creature instead.\nFlashback {5}{G}{G} (You may cast this card from your graveyard for its flashback cost. Then exile it.)
+Oracle:Put five +1/+1 counters on target creature. If this spell was cast from a graveyard, put ten +1/+1 counters on that creature instead.\nFlashback {5}{G}{G} (You may cast this card from your graveyard for its flashback cost. Then exile it.)
diff --git a/forge-gui/res/cardsfolder/i/increasing_vengeance.txt b/forge-gui/res/cardsfolder/i/increasing_vengeance.txt
index ae45627bd04..1c864b599af 100644
--- a/forge-gui/res/cardsfolder/i/increasing_vengeance.txt
+++ b/forge-gui/res/cardsfolder/i/increasing_vengeance.txt
@@ -2,8 +2,8 @@ Name:Increasing Vengeance
ManaCost:R R
Types:Instant
K:Flashback:3 R R
-A:SP$ CopySpellAbility | Cost$ R R | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl | TargetType$ Spell | SubAbility$ DBCopy2 | SpellDescription$ Copy target instant or sorcery spell you control. If CARDNAME was cast from a graveyard, copy that spell twice instead. You may choose new targets for the copies.
+A:SP$ CopySpellAbility | Cost$ R R | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl | TargetType$ Spell | SubAbility$ DBCopy2 | SpellDescription$ Copy target instant or sorcery spell you control. If this spell was cast from a graveyard, copy that spell twice instead. You may choose new targets for the copies.
SVar:DBCopy2:DB$ CopySpellAbility | Defined$ Targeted | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | References$ X | AILogic$ Always
SVar:X:Count$wasCastFromGraveyard.1.0
SVar:Picture:http://www.wizards.com/global/images/magic/general/increasing_vengeance.jpg
-Oracle:Copy target instant or sorcery spell you control. If Increasing Vengeance was cast from a graveyard, copy that spell twice instead. You may choose new targets for the copies.\nFlashback {3}{R}{R} (You may cast this card from your graveyard for its flashback cost. Then exile it.)
+Oracle:Copy target instant or sorcery spell you control. If this spell was cast from a graveyard, copy that spell twice instead. You may choose new targets for the copies.\nFlashback {3}{R}{R} (You may cast this card from your graveyard for its flashback cost. Then exile it.)
diff --git a/forge-gui/res/cardsfolder/upcoming/ingenious_infiltrator.txt b/forge-gui/res/cardsfolder/i/ingenious_infiltrator.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/ingenious_infiltrator.txt
rename to forge-gui/res/cardsfolder/i/ingenious_infiltrator.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/irregular_cohort.txt b/forge-gui/res/cardsfolder/i/irregular_cohort.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/irregular_cohort.txt
rename to forge-gui/res/cardsfolder/i/irregular_cohort.txt
diff --git a/forge-gui/res/cardsfolder/j/jilt.txt b/forge-gui/res/cardsfolder/j/jilt.txt
index 07c885f993e..1f372cb360c 100644
--- a/forge-gui/res/cardsfolder/j/jilt.txt
+++ b/forge-gui/res/cardsfolder/j/jilt.txt
@@ -5,5 +5,7 @@ K:Kicker:1 R
A:SP$ ChangeZone | Cost$ 1 U | ValidTgts$ Creature | TgtPrompt$ Select target creature to bounce | TargetUnique$ True | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBDamage | SpellDescription$ Return target creature to its owner's hand.
SVar:DBDamage:DB$ DealDamage | Condition$ Kicked | ValidTgts$ Creature | TgtPrompt$ Select another target creature to deal 2 damage | TargetUnique$ True | NumDmg$ 2 | TargetMin$ X | TargetMax$ X | SpellDescription$ If CARDNAME was kicked, it deals 2 damage to another target creature.
SVar:X:Count$Kicked.1.0
+SVar:NeedsToPlayKickedVar:Z GE2
+SVar:Z:Count$Valid Creature.OppCtrl
SVar:Picture:http://www.wizards.com/global/images/magic/general/jilt.jpg
Oracle:Kicker {1}{R} (You may pay an additional {1}{R} as you cast this spell.)\nReturn target creature to its owner's hand. If Jilt was kicked, it deals 2 damage to another target creature.
diff --git a/forge-gui/res/cardsfolder/k/kamahls_druidic_vow.txt b/forge-gui/res/cardsfolder/k/kamahls_druidic_vow.txt
index 4b197e4db3e..d1cb55fba67 100644
--- a/forge-gui/res/cardsfolder/k/kamahls_druidic_vow.txt
+++ b/forge-gui/res/cardsfolder/k/kamahls_druidic_vow.txt
@@ -1,7 +1,7 @@
Name:Kamahl's Druidic Vow
ManaCost:X G G
Types:Legendary Sorcery
-A:SP$ Dig | Cost$ X G G | DigNum$ X | Reveal$ True | AnyNumber$ True | ChangeValid$ Land,Permanent.Legendary+cmcLEX | DestinationZone$ Battlefield | DestinationZone2$ Graveyard | References$ X | SpellDescription$ Reveal the top X cards of your library. You may put any number of permanent cards with converted mana cost X or less from among them onto the battlefield. Then put all cards revealed this way that weren't put onto the battlefield into your graveyard.
+A:SP$ Dig | Cost$ X G G | DigNum$ X | Reveal$ True | AnyNumber$ True | ChangeValid$ Land,Permanent.Legendary+cmcLEX | DestinationZone$ Battlefield | DestinationZone2$ Graveyard | References$ X | SpellDescription$ Reveal the top X cards of your library. You may put any number of land and/or legendary permanent cards with converted mana cost X or less from among them onto the battlefield. Put the rest into your graveyard.
SVar:X:Count$xPaid
SVar:NeedsToPlayVar:Z GE6
SVar:Z:Count$Valid Land.YouCtrl+untapped
diff --git a/forge-gui/res/cardsfolder/upcoming/kayas_guile.txt b/forge-gui/res/cardsfolder/k/kayas_guile.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/kayas_guile.txt
rename to forge-gui/res/cardsfolder/k/kayas_guile.txt
diff --git a/forge-gui/res/cardsfolder/k/keldon_overseer.txt b/forge-gui/res/cardsfolder/k/keldon_overseer.txt
index b72b86373cf..3be69da62f3 100644
--- a/forge-gui/res/cardsfolder/k/keldon_overseer.txt
+++ b/forge-gui/res/cardsfolder/k/keldon_overseer.txt
@@ -6,4 +6,5 @@ K:Kicker:3 R
K:Haste
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn.
SVar:TrigKicker:DB$ GainControl | TgtPrompt$ Choose target creature. | ValidTgts$ Creature | LoseControl$ EOT | Untap$ True | AddKWs$ Haste | SpellDescription$ Gain control of target creature until end of turn, untap that creature, and it gains haste until end of turn.
+SVar:NeedsToPlayKicked:Creature.OppCtrl
Oracle:Kicker {3}{R} (You may pay an additional {3}{R} as you cast this spell.)\nHaste\nWhen Keldon Overseer enters the battlefield, if it was kicked, gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn.
\ No newline at end of file
diff --git a/forge-gui/res/cardsfolder/k/kiki_jiki_mirror_breaker.txt b/forge-gui/res/cardsfolder/k/kiki_jiki_mirror_breaker.txt
index e2102a880df..b21d030f25e 100644
--- a/forge-gui/res/cardsfolder/k/kiki_jiki_mirror_breaker.txt
+++ b/forge-gui/res/cardsfolder/k/kiki_jiki_mirror_breaker.txt
@@ -3,6 +3,6 @@ ManaCost:2 R R R
Types:Legendary Creature Goblin Shaman
PT:2/2
K:Haste
-A:AB$ CopyPermanent | Cost$ T | ValidTgts$ Creature.nonLegendary+YouCtrl | TgtPrompt$ Select target nonlegendary creature you control | AddKeywords$ Haste | AtEOT$ Sacrifice | AILogic$ BeforeCombat | SpellDescription$ Create a token that's a copy of target nonlegendary creature you control. That token has haste. Sacrifice it at the beginning of the next end step.
+A:AB$ CopyPermanent | Cost$ T | ValidTgts$ Creature.nonLegendary+YouCtrl | TgtPrompt$ Select target nonlegendary creature you control | AddKeywords$ Haste | AtEOT$ Sacrifice | AILogic$ BeforeCombat | SpellDescription$ Create a token that's a copy of target nonlegendary creature you control, except it has haste. Sacrifice it at the beginning of the next end step.
SVar:Picture:http://resources.wizards.com/magic/cards/chk/en-us/card50321.jpg
-Oracle:Haste\n{T}: Create a token that's a copy of target nonlegendary creature you control. That token has haste. Sacrifice it at the beginning of the next end step.
+Oracle:Haste\n{T}: Create a token that's a copy of target nonlegendary creature you control, except it has haste. Sacrifice it at the beginning of the next end step.
diff --git a/forge-gui/res/cardsfolder/upcoming/king_of_the_pride.txt b/forge-gui/res/cardsfolder/k/king_of_the_pride.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/king_of_the_pride.txt
rename to forge-gui/res/cardsfolder/k/king_of_the_pride.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/knight_of_old_benalia.txt b/forge-gui/res/cardsfolder/k/knight_of_old_benalia.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/knight_of_old_benalia.txt
rename to forge-gui/res/cardsfolder/k/knight_of_old_benalia.txt
diff --git a/forge-gui/res/cardsfolder/k/kor_aeronaut.txt b/forge-gui/res/cardsfolder/k/kor_aeronaut.txt
index 8effcc56db7..b104e1ccbde 100644
--- a/forge-gui/res/cardsfolder/k/kor_aeronaut.txt
+++ b/forge-gui/res/cardsfolder/k/kor_aeronaut.txt
@@ -7,5 +7,6 @@ K:Kicker:1 W
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, target creature gains flying until end of turn.
SVar:TrigKicker:DB$Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Flying
SVar:PlayMain1:True
+SVar:NeedsToPlayKicked:Creature.YouCtrl
SVar:Picture:http://www.wizards.com/global/images/magic/general/Kor_Aeronaut.jpg
Oracle:Kicker {1}{W} (You may pay an additional {1}{W} as you cast this spell.)\nFlying\nWhen Kor Aeronaut enters the battlefield, if it was kicked, target creature gains flying until end of turn.
diff --git a/forge-gui/res/cardsfolder/k/kor_sanctifiers.txt b/forge-gui/res/cardsfolder/k/kor_sanctifiers.txt
index f5de8cda75f..a4e03f07e28 100644
--- a/forge-gui/res/cardsfolder/k/kor_sanctifiers.txt
+++ b/forge-gui/res/cardsfolder/k/kor_sanctifiers.txt
@@ -5,5 +5,8 @@ PT:2/3
K:Kicker:W
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, destroy target artifact or enchantment.
SVar:TrigKicker:DB$Destroy | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment.
+SVar:NeedsToPlayKickedVar:Z GE1
+SVar:Z:Count$Valid Artifact.OppCtrl/Plus.Z1
+SVar:Z1:Count$Valid Enchantment.OppCtrl
SVar:Picture:http://www.wizards.com/global/images/magic/general/Kor_sanctifiers.jpg
Oracle:Kicker {W} (You may pay an additional {W} as you cast this spell.)\nWhen Kor Sanctifiers enters the battlefield, if it was kicked, destroy target artifact or enchantment.
diff --git a/forge-gui/res/cardsfolder/k/kyren_legate.txt b/forge-gui/res/cardsfolder/k/kyren_legate.txt
index f535099fa19..d9bb8b190ca 100644
--- a/forge-gui/res/cardsfolder/k/kyren_legate.txt
+++ b/forge-gui/res/cardsfolder/k/kyren_legate.txt
@@ -3,8 +3,8 @@ ManaCost:1 R
Types:Creature Goblin
PT:1/1
K:Haste
-S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | Description$ If an opponent controls a Plains and you control a Mountain, you may cast CARDNAME without paying its mana cost.
+S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | Description$ If an opponent controls a Plains and you control a Mountain, you may cast this spell without paying its mana cost.
SVar:X:Count$Valid Plains.OppCtrl
SVar:Y:Count$Valid Mountain.YouCtrl
SVar:Picture:http://www.wizards.com/global/images/magic/general/kyren_legate.jpg
-Oracle:Haste\nIf an opponent controls a Plains and you control a Mountain, you may cast Kyren Legate without paying its mana cost.
+Oracle:Haste\nIf an opponent controls a Plains and you control a Mountain, you may cast this spell without paying its mana cost.
diff --git a/forge-gui/res/cardsfolder/upcoming/lancer_sliver.txt b/forge-gui/res/cardsfolder/l/lancer_sliver.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/lancer_sliver.txt
rename to forge-gui/res/cardsfolder/l/lancer_sliver.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/lavabelly_sliver.txt b/forge-gui/res/cardsfolder/l/lavabelly_sliver.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/lavabelly_sliver.txt
rename to forge-gui/res/cardsfolder/l/lavabelly_sliver.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/lesser_masticore.txt b/forge-gui/res/cardsfolder/l/lesser_masticore.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/lesser_masticore.txt
rename to forge-gui/res/cardsfolder/l/lesser_masticore.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/lightning_skelemental.txt b/forge-gui/res/cardsfolder/l/lightning_skelemental.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/lightning_skelemental.txt
rename to forge-gui/res/cardsfolder/l/lightning_skelemental.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/llanowar_tribe.txt b/forge-gui/res/cardsfolder/l/llanowar_tribe.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/llanowar_tribe.txt
rename to forge-gui/res/cardsfolder/l/llanowar_tribe.txt
diff --git a/forge-gui/res/cardsfolder/l/lord_of_atlantis.txt b/forge-gui/res/cardsfolder/l/lord_of_atlantis.txt
index 2b4be094498..4d45f152ab0 100644
--- a/forge-gui/res/cardsfolder/l/lord_of_atlantis.txt
+++ b/forge-gui/res/cardsfolder/l/lord_of_atlantis.txt
@@ -2,7 +2,7 @@ Name:Lord of Atlantis
ManaCost:U U
Types:Creature Merfolk
PT:2/2
-S:Mode$ Continuous | Affected$ Creature.Merfolk+Other | AddPower$ 1 | AddToughness$ 1 | AddKeyword$ Islandwalk | Description$ Other Merfolk creatures get +1/+1 and have islandwalk.
+S:Mode$ Continuous | Affected$ Card.Merfolk+Other | AddPower$ 1 | AddToughness$ 1 | AddKeyword$ Islandwalk | Description$ Other Merfolk get +1/+1 and have islandwalk. (They can't be blocked as long as defending player controls an Island.)
SVar:PlayMain1:TRUE
SVar:Picture:http://www.wizards.com/global/images/magic/general/lord_of_atlantis.jpg
-Oracle:Other Merfolk creatures get +1/+1 and have islandwalk.
+Oracle:Other Merfolk get +1/+1 and have islandwalk. (They can't be blocked as long as defending player controls an Island.)
diff --git a/forge-gui/res/cardsfolder/m/magma_burst.txt b/forge-gui/res/cardsfolder/m/magma_burst.txt
index 2415c2b0884..698298d8595 100644
--- a/forge-gui/res/cardsfolder/m/magma_burst.txt
+++ b/forge-gui/res/cardsfolder/m/magma_burst.txt
@@ -4,6 +4,9 @@ Types:Instant
K:Kicker:Sac<2/Land>
A:SP$ DealDamage | Cost$ 3 R | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | TargetMin$ X | TargetMax$ X | References$ X | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to any target. If CARDNAME was kicked, it deals 3 damage to another target.
SVar:X:Count$Kicked.2.1
+SVar:NeedsToPlayKickedVar:Z GE2
+SVar:Z:Count$Valid Creature.OppCtrl/Plus.Z1
+SVar:Z1:Count$Valid Planeswalker.OppCtrl
AI:RemoveDeck:All
SVar:Picture:http://www.wizards.com/global/images/magic/general/magma_burst.jpg
Oracle:Kicker—Sacrifice two lands. (You may sacrifice two lands in addition to any other costs as you cast this spell.)\nMagma Burst deals 3 damage to any target. If Magma Burst was kicked, it deals 3 damage to another target.
diff --git a/forge-gui/res/cardsfolder/upcoming/magmatic_sinkhole.txt b/forge-gui/res/cardsfolder/m/magmatic_sinkhole.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/magmatic_sinkhole.txt
rename to forge-gui/res/cardsfolder/m/magmatic_sinkhole.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/marit_lages_slumber.txt b/forge-gui/res/cardsfolder/m/marit_lages_slumber.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/marit_lages_slumber.txt
rename to forge-gui/res/cardsfolder/m/marit_lages_slumber.txt
diff --git a/forge-gui/res/cardsfolder/m/marsh_casualties.txt b/forge-gui/res/cardsfolder/m/marsh_casualties.txt
index 5c869b43ed9..611856fec81 100644
--- a/forge-gui/res/cardsfolder/m/marsh_casualties.txt
+++ b/forge-gui/res/cardsfolder/m/marsh_casualties.txt
@@ -4,5 +4,6 @@ Types:Sorcery
K:Kicker:3
A:SP$ PumpAll | Cost$ B B | ValidTgts$ Player | TgtPrompt$ Select target player | ValidCards$ Creature | NumAtt$ -X | NumDef$ -X | References$ X | IsCurse$ True | SpellDescription$ Creatures target player controls get -1/-1 until end of turn. If CARDNAME was kicked, those creatures get -2/-2 until end of turn instead.
SVar:X:Count$Kicked.2.1
+SVar:NeedsToPlayKicked:Creature.OppCtrl+toughnessEQ2
SVar:Picture:http://www.wizards.com/global/images/magic/general/marsh_casualties.jpg
Oracle:Kicker {3} (You may pay an additional {3} as you cast this spell.)\nCreatures target player controls get -1/-1 until end of turn. If Marsh Casualties was kicked, those creatures get -2/-2 until end of turn instead.
diff --git a/forge-gui/res/cardsfolder/upcoming/martyrs_soul.txt b/forge-gui/res/cardsfolder/m/martyrs_soul.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/martyrs_soul.txt
rename to forge-gui/res/cardsfolder/m/martyrs_soul.txt
diff --git a/forge-gui/res/cardsfolder/m/massacre.txt b/forge-gui/res/cardsfolder/m/massacre.txt
index 2cc529de824..a46e441dee3 100644
--- a/forge-gui/res/cardsfolder/m/massacre.txt
+++ b/forge-gui/res/cardsfolder/m/massacre.txt
@@ -1,9 +1,9 @@
Name:Massacre
ManaCost:2 B B
Types:Sorcery
-S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | References$ X,Y | Description$ If an opponent controls a Plains and you control a Swamp, you may cast CARDNAME without paying its mana cost.
+S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | References$ X,Y | Description$ If an opponent controls a Plains and you control a Swamp, you may cast this spell without paying its mana cost.
SVar:X:Count$Valid Plains.OppCtrl
SVar:Y:Count$Valid Swamp.YouCtrl
A:SP$ PumpAll | Cost$ 2 B B | ValidCards$ Creature | NumAtt$ -2 | NumDef$ -2 | IsCurse$ True | SpellDescription$ All creatures get -2/-2 until end of turn.
SVar:Picture:http://www.wizards.com/global/images/magic/general/massacre.jpg
-Oracle:If an opponent controls a Plains and you control a Swamp, you may cast Massacre without paying its mana cost.\nAll creatures get -2/-2 until end of turn.
+Oracle:If an opponent controls a Plains and you control a Swamp, you may cast this spell without paying its mana cost.\nAll creatures get -2/-2 until end of turn.
diff --git a/forge-gui/res/cardsfolder/m/mercurial_pretender.txt b/forge-gui/res/cardsfolder/m/mercurial_pretender.txt
index c6e48a645d5..426f1da5e9e 100644
--- a/forge-gui/res/cardsfolder/m/mercurial_pretender.txt
+++ b/forge-gui/res/cardsfolder/m/mercurial_pretender.txt
@@ -3,7 +3,7 @@ ManaCost:4 U
Types:Creature Shapeshifter
PT:0/0
K:ETBReplacement:Copy:DBCopy:Optional
-SVar:DBCopy:DB$ Clone | Choices$ Creature.YouCtrl+Other | AddAbilities$ MercurialBounce | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature you control except it gains "{2}{U}{U}: Return this creature to its owner's hand."
+SVar:DBCopy:DB$ Clone | Choices$ Creature.YouCtrl+Other | AddAbilities$ MercurialBounce | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature you control, except it has "{2}{U}{U}: Return this creature to its owner's hand."
SVar:MercurialBounce:AB$ ChangeZone | Cost$ 2 U U | Defined$ Self | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand.
SVar:Picture:http://www.wizards.com/global/images/magic/general/mercurial_pretender.jpg
-Oracle:You may have Mercurial Pretender enter the battlefield as a copy of any creature you control except it gains "{2}{U}{U}: Return this creature to its owner's hand."
+Oracle:You may have Mercurial Pretender enter the battlefield as a copy of any creature you control, except it has "{2}{U}{U}: Return this creature to its owner's hand."
diff --git a/forge-gui/res/cardsfolder/upcoming/mind_rake.txt b/forge-gui/res/cardsfolder/m/mind_rake.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/mind_rake.txt
rename to forge-gui/res/cardsfolder/m/mind_rake.txt
diff --git a/forge-gui/res/cardsfolder/m/minion_reflector.txt b/forge-gui/res/cardsfolder/m/minion_reflector.txt
index f739e01c834..86f92f52888 100644
--- a/forge-gui/res/cardsfolder/m/minion_reflector.txt
+++ b/forge-gui/res/cardsfolder/m/minion_reflector.txt
@@ -1,8 +1,8 @@
Name:Minion Reflector
ManaCost:5
Types:Artifact
-T:Mode$ ChangesZone | ValidCard$ Creature.nonToken+YouCtrl | Origin$ Any | Destination$ Battlefield | TriggerZones$ Battlefield | Execute$ TrigCopy | OptionalDecider$ You | TriggerDescription$ Whenever a nontoken creature enters the battlefield under your control, you may pay {2}. If you do, create a token that's a copy of that creature. That token has haste and "At the beginning of the end step, sacrifice this permanent."
+T:Mode$ ChangesZone | ValidCard$ Creature.nonToken+YouCtrl | Origin$ Any | Destination$ Battlefield | TriggerZones$ Battlefield | Execute$ TrigCopy | OptionalDecider$ You | TriggerDescription$ Whenever a nontoken creature enters the battlefield under your control, you may pay {2}. If you do, create a token that's a copy of that creature, except it has haste and "At the beginning of the end step, sacrifice this permanent."
SVar:TrigCopy:AB$ CopyPermanent | Cost$ 2 | Defined$ TriggeredCard | AddKeywords$ Haste | AtEOTTrig$ Sacrifice
SVar:BuffedBy:Creature
SVar:Picture:http://www.wizards.com/global/images/magic/general/minion_reflector.jpg
-Oracle:Whenever a nontoken creature enters the battlefield under your control, you may pay {2}. If you do, create a token that's a copy of that creature. That token has haste and "At the beginning of the end step, sacrifice this permanent."
+Oracle:Whenever a nontoken creature enters the battlefield under your control, you may pay {2}. If you do, create a token that's a copy of that creature, except it has haste and "At the beginning of the end step, sacrifice this permanent."
diff --git a/forge-gui/res/cardsfolder/upcoming/mirrodin_besieged.txt b/forge-gui/res/cardsfolder/m/mirrodin_besieged.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/mirrodin_besieged.txt
rename to forge-gui/res/cardsfolder/m/mirrodin_besieged.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/mist_syndicate_naga.txt b/forge-gui/res/cardsfolder/m/mist_syndicate_naga.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/mist_syndicate_naga.txt
rename to forge-gui/res/cardsfolder/m/mist_syndicate_naga.txt
diff --git a/forge-gui/res/cardsfolder/m/mizzium_transreliquat.txt b/forge-gui/res/cardsfolder/m/mizzium_transreliquat.txt
index e86074aa2b9..c7d99e8321f 100644
--- a/forge-gui/res/cardsfolder/m/mizzium_transreliquat.txt
+++ b/forge-gui/res/cardsfolder/m/mizzium_transreliquat.txt
@@ -2,7 +2,7 @@ Name:Mizzium Transreliquat
ManaCost:3
Types:Artifact
A:AB$ Clone | Cost$ 3 | ValidTgts$ Artifact | TgtPrompt$ Select target artifact to copy until end of turn. | Duration$ UntilEndOfTurn | SpellDescription$ CARDNAME becomes a copy of target artifact until end of turn.
-A:AB$ Clone | Cost$ 1 U R | ValidTgts$ Artifact | TgtPrompt$ Select target artifact to copy. | GainThisAbility$ True | SpellDescription$ CARDNAME becomes a copy of target artifact and gains this ability.
+A:AB$ Clone | Cost$ 1 U R | ValidTgts$ Artifact | TgtPrompt$ Select target artifact to copy. | GainThisAbility$ True | SpellDescription$ CARDNAME becomes a copy of target artifact, except it has this ability.
AI:RemoveDeck:All
SVar:Picture:http://www.wizards.com/global/images/magic/general/mizzium_transreliquat.jpg
-Oracle:{3}: Mizzium Transreliquat becomes a copy of target artifact until end of turn.\n{1}{U}{R}: Mizzium Transreliquat becomes a copy of target artifact and gains this ability.
+Oracle:{3}: Mizzium Transreliquat becomes a copy of target artifact until end of turn.\n{1}{U}{R}: Mizzium Transreliquat becomes a copy of target artifact, except it has this ability.
diff --git a/forge-gui/res/cardsfolder/upcoming/mob.txt b/forge-gui/res/cardsfolder/m/mob.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/mob.txt
rename to forge-gui/res/cardsfolder/m/mob.txt
diff --git a/forge-gui/res/cardsfolder/m/mogg_salvage.txt b/forge-gui/res/cardsfolder/m/mogg_salvage.txt
index 7bdc66e80ab..debde464dd4 100644
--- a/forge-gui/res/cardsfolder/m/mogg_salvage.txt
+++ b/forge-gui/res/cardsfolder/m/mogg_salvage.txt
@@ -1,9 +1,9 @@
Name:Mogg Salvage
ManaCost:2 R
Types:Instant
-S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | References$ X,Y | Description$ If an opponent controls an Island and you control a Mountain, you may cast CARDNAME without paying its mana cost.
+S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | References$ X,Y | Description$ If an opponent controls an Island and you control a Mountain, you may cast this spell without paying its mana cost.
SVar:X:Count$Valid Island.OppCtrl
SVar:Y:Count$Valid Mountain.YouCtrl
A:SP$ Destroy | Cost$ 2 R | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Destroy target artifact.
SVar:Picture:http://www.wizards.com/global/images/magic/general/mogg_salvage.jpg
-Oracle:If an opponent controls an Island and you control a Mountain, you may cast Mogg Salvage without paying its mana cost.\nDestroy target artifact.
+Oracle:If an opponent controls an Island and you control a Mountain, you may cast this spell without paying its mana cost.\nDestroy target artifact.
diff --git a/forge-gui/res/cardsfolder/m/mold_shambler.txt b/forge-gui/res/cardsfolder/m/mold_shambler.txt
index 46bd5516fe4..20d5f704a90 100644
--- a/forge-gui/res/cardsfolder/m/mold_shambler.txt
+++ b/forge-gui/res/cardsfolder/m/mold_shambler.txt
@@ -5,5 +5,6 @@ PT:3/3
K:Kicker:1 G
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, destroy target noncreature permanent.
SVar:TrigKicker:DB$Destroy | ValidTgts$ Permanent.nonCreature | TgtPrompt$ Select target noncreature permanent.
+SVar:NeedsToPlay:Permanent.nonCreature+OppCtrl
SVar:Picture:http://www.wizards.com/global/images/magic/general/mold_shambler.jpg
Oracle:Kicker {1}{G} (You may pay an additional {1}{G} as you cast this spell.)\nWhen Mold Shambler enters the battlefield, if it was kicked, destroy target noncreature permanent.
diff --git a/forge-gui/res/cardsfolder/upcoming/moonblade_shinobi.txt b/forge-gui/res/cardsfolder/m/moonblade_shinobi.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/moonblade_shinobi.txt
rename to forge-gui/res/cardsfolder/m/moonblade_shinobi.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/morophon_the_boundless.txt b/forge-gui/res/cardsfolder/m/morophon_the_boundless.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/morophon_the_boundless.txt
rename to forge-gui/res/cardsfolder/m/morophon_the_boundless.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/mother_bear.txt b/forge-gui/res/cardsfolder/m/mother_bear.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/mother_bear.txt
rename to forge-gui/res/cardsfolder/m/mother_bear.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/mox_tantalite.txt b/forge-gui/res/cardsfolder/m/mox_tantalite.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/mox_tantalite.txt
rename to forge-gui/res/cardsfolder/m/mox_tantalite.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/munitions_expert.txt b/forge-gui/res/cardsfolder/m/munitions_expert.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/munitions_expert.txt
rename to forge-gui/res/cardsfolder/m/munitions_expert.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/murasa_behemoth.txt b/forge-gui/res/cardsfolder/m/murasa_behemoth.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/murasa_behemoth.txt
rename to forge-gui/res/cardsfolder/m/murasa_behemoth.txt
diff --git a/forge-gui/res/cardsfolder/n/narset_transcendent.txt b/forge-gui/res/cardsfolder/n/narset_transcendent.txt
index 7500018e1ec..f00e39918ae 100644
--- a/forge-gui/res/cardsfolder/n/narset_transcendent.txt
+++ b/forge-gui/res/cardsfolder/n/narset_transcendent.txt
@@ -5,11 +5,11 @@ Loyalty:6
A:AB$ PeekAndReveal | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | AILogic$ Main2 | PeekAmount$ 1 | RevealValid$ Card.nonCreature+nonLand | RevealOptional$ True | RememberRevealed$ True | SubAbility$ DBChangeZone | SpellDescription$ Look at the top card of your library. If it's a noncreature, nonland card, you may reveal it and put it into your hand.
SVar:DBChangeZone:DB$ ChangeZone | Defined$ TopOfLibrary | Origin$ Library | Destination$ Hand | ConditionDefined$ Remembered | ConditionPresent$ Card.nonCreature+nonLand | ConditionCompare$ EQ1 | SubAbility$ DBCleanupOne
SVar:DBCleanupOne:DB$ Cleanup | ClearRemembered$ True
-A:AB$Effect | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | AILogic$ NarsetRebound | Stackable$ False | Name$ Narset Transcendent effect. | Triggers$ AddRebound | SVars$ AddReboundMain,DBCleanupTwo | SpellDescription$ When you cast your next instant or sorcery spell from your hand this turn, it gains rebound.
+A:AB$Effect | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | AILogic$ NarsetRebound | Stackable$ False | Name$ Narset Transcendent effect. | Triggers$ AddRebound | SVars$ AddReboundMain,DBCleanupTwo | SpellDescription$ When you cast your next instant or sorcery spell from your hand this turn, it gains rebound. (Exile the spell as it resolves. At the beginning of your next upkeep, you may cast that card from exile without paying its mana cost.)
SVar:AddRebound:Mode$ SpellCast | ValidCard$ Instant.wasCastFromHand,Sorcery.wasCastFromHand | ValidActivatingPlayer$ You | OneOff$ True | Execute$ AddReboundMain | TriggerZones$ Command | TriggerDescription$ When you cast your next instant or sorcery spell from your hand this turn, it gains rebound.
SVar:AddReboundMain:DB$ Pump | Defined$ TriggeredCard| KW$ Rebound | PumpZone$ Stack | SubAbility$ DBCleanupTwo
SVar:DBCleanupTwo:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile
A:AB$ Effect | Cost$ SubCounter<9/LOYALTY> | Name$ Emblem - Narset Transcendent | StaticAbilities$ STNarset | Planeswalker$ True | Ultimate$ True | Stackable$ False | Duration$ Permanent | AILogic$ Always | SpellDescription$ You get an emblem with "Your opponents can't cast noncreature spells."
SVar:STNarset:Mode$ CantBeCast | ValidCard$ Card.nonCreature | Caster$ Opponent | EffectZone$ Command | Description$ Your opponents can't cast noncreature spells.
SVar:Picture:http://www.wizards.com/global/images/magic/general/narset_transcendent.jpg
-Oracle:[+1]: Look at the top card of your library. If it's a noncreature, nonland card, you may reveal it and put it into your hand.\n[-2]: When you cast your next instant or sorcery spell from your hand this turn, it gains rebound.\n[-9]: You get an emblem with "Your opponents can't cast noncreature spells."
+Oracle:[+1]: Look at the top card of your library. If it's a noncreature, nonland card, you may reveal it and put it into your hand.\n[-2]: When you cast your next instant or sorcery spell from your hand this turn, it gains rebound. (Exile the spell as it resolves. At the beginning of your next upkeep, you may cast that card from exile without paying its mana cost.)\n[-9]: You get an emblem with "Your opponents can't cast noncreature spells."
diff --git a/forge-gui/res/cardsfolder/upcoming/natures_chant.txt b/forge-gui/res/cardsfolder/n/natures_chant.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/natures_chant.txt
rename to forge-gui/res/cardsfolder/n/natures_chant.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/ninja_of_the_new_moon.txt b/forge-gui/res/cardsfolder/n/ninja_of_the_new_moon.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/ninja_of_the_new_moon.txt
rename to forge-gui/res/cardsfolder/n/ninja_of_the_new_moon.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/nurturing_peatland.txt b/forge-gui/res/cardsfolder/n/nurturing_peatland.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/nurturing_peatland.txt
rename to forge-gui/res/cardsfolder/n/nurturing_peatland.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/on_thin_ice.txt b/forge-gui/res/cardsfolder/o/on_thin_ice.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/on_thin_ice.txt
rename to forge-gui/res/cardsfolder/o/on_thin_ice.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/oneirophage.txt b/forge-gui/res/cardsfolder/o/oneirophage.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/oneirophage.txt
rename to forge-gui/res/cardsfolder/o/oneirophage.txt
diff --git a/forge-gui/res/cardsfolder/o/oran_rief_recluse.txt b/forge-gui/res/cardsfolder/o/oran_rief_recluse.txt
index 1ded78141f7..59c57282779 100644
--- a/forge-gui/res/cardsfolder/o/oran_rief_recluse.txt
+++ b/forge-gui/res/cardsfolder/o/oran_rief_recluse.txt
@@ -6,6 +6,6 @@ K:Kicker:2 G
K:Reach
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, destroy target creature with flying.
SVar:TrigDestroy:DB$Destroy | ValidTgts$ Creature.withFlying | TgtPrompt$ Select target creature with flying.
-AI:RemoveDeck:All
+SVar:NeedsToPlayKicked:Creature.withFlying+OppCtrl
SVar:Picture:http://www.wizards.com/global/images/magic/general/oran_rief_recluse.jpg
Oracle:Kicker {2}{G} (You may pay an additional {2}{G} as you cast this spell.)\nReach (This creature can block creatures with flying.)\nWhen Oran-Rief Recluse enters the battlefield, if it was kicked, destroy target creature with flying.
diff --git a/forge-gui/res/cardsfolder/upcoming/orcish_hellraiser.txt b/forge-gui/res/cardsfolder/o/orcish_hellraiser.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/orcish_hellraiser.txt
rename to forge-gui/res/cardsfolder/o/orcish_hellraiser.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/ore_scale_guardian.txt b/forge-gui/res/cardsfolder/o/ore_scale_guardian.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/ore_scale_guardian.txt
rename to forge-gui/res/cardsfolder/o/ore_scale_guardian.txt
diff --git a/forge-gui/res/cardsfolder/o/orims_chant.txt b/forge-gui/res/cardsfolder/o/orims_chant.txt
index d8d666f6fa4..bf531791bbb 100644
--- a/forge-gui/res/cardsfolder/o/orims_chant.txt
+++ b/forge-gui/res/cardsfolder/o/orims_chant.txt
@@ -6,5 +6,6 @@ A:SP$ Effect | Cost$ W | Name$ Orim's Chant Effect | IsCurse$ True | StaticAbili
SVar:CantAttackWhenKicked:DB$ Effect | Name$ Orim's Chant can't Attack Effect | IsCurse$ True | StaticAbilities$ CantAttack | Condition$ Kicked | SpellDescription$ If CARDNAME was kicked, creatures can't attack this turn.
SVar:CantBeCast:Mode$ CantBeCast | EffectZone$ Command | ValidCard$ Card | Caster$ Player.IsRemembered | Description$ Target player can't cast spells this turn.
SVar:CantAttack:Mode$ Continuous | EffectZone$ Command | Affected$ Creature | AffectedZone$ Battlefield | AddHiddenKeyword$ CARDNAME can't attack. | Description$ Creatures can't attack this turn.
+SVar:NeedsToPlayKicked:Creature.OppCtrl
SVar:Picture:http://www.wizards.com/global/images/magic/general/orims_chant.jpg
Oracle:Kicker {W} (You may pay an additional {W} as you cast this spell.)\nTarget player can't cast spells this turn.\nIf Orim's Chant was kicked, creatures can't attack this turn.
diff --git a/forge-gui/res/cardsfolder/o/orims_thunder.txt b/forge-gui/res/cardsfolder/o/orims_thunder.txt
index cb066851fa8..0cd9030d2b5 100644
--- a/forge-gui/res/cardsfolder/o/orims_thunder.txt
+++ b/forge-gui/res/cardsfolder/o/orims_thunder.txt
@@ -7,5 +7,6 @@ SVar:DBDamage:DB$DealDamage | Condition$ Kicked | ValidTgts$ Creature | TgtPromp
SVar:X:Targeted$CardManaCost
SVar:Y:Count$Kicked.1.0
DeckHints:Color$Red
+SVar:NeedsToPlay:Creature.OppCtrl
SVar:Picture:http://www.wizards.com/global/images/magic/general/orims_thunder.jpg
Oracle:Kicker {R} (You may pay an additional {R} as you cast this spell.)\nDestroy target artifact or enchantment. If Orim's Thunder was kicked, it deals damage equal to that permanent's converted mana cost to target creature.
diff --git a/forge-gui/res/cardsfolder/upcoming/pashalik_mons.txt b/forge-gui/res/cardsfolder/p/pashalik_mons.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/pashalik_mons.txt
rename to forge-gui/res/cardsfolder/p/pashalik_mons.txt
diff --git a/forge-gui/res/cardsfolder/p/patricians_scorn.txt b/forge-gui/res/cardsfolder/p/patricians_scorn.txt
index 87a39c75ab7..5931b29ad6e 100644
--- a/forge-gui/res/cardsfolder/p/patricians_scorn.txt
+++ b/forge-gui/res/cardsfolder/p/patricians_scorn.txt
@@ -2,7 +2,7 @@ Name:Patrician's Scorn
ManaCost:3 W
Types:Instant
A:SP$ DestroyAll | Cost$ 3 W | ValidCards$ Enchantment | SpellDescription$ Destroy all enchantments.
-A:SP$ DestroyAll | Cost$ 0 | ValidCards$ Enchantment | CheckSVar$ X | SVarCompare$ GE1 | References$ X | SpellDescription$ If you've cast another white spell this turn, you may cast CARDNAME without paying its mana cost. Destroy all enchantments.
+A:SP$ DestroyAll | Cost$ 0 | ValidCards$ Enchantment | CheckSVar$ X | SVarCompare$ GE1 | References$ X | SpellDescription$ If you've cast another white spell this turn, you may cast this spell without paying its mana cost. Destroy all enchantments.
SVar:X:Count$ThisTurnCast_Card.White+Other+YouCtrl
SVar:Picture:http://www.wizards.com/global/images/magic/general/patricians_scorn.jpg
-Oracle:If you've cast another white spell this turn, you may cast Patrician's Scorn without paying its mana cost.\nDestroy all enchantments.
+Oracle:If you've cast another white spell this turn, you may cast this spell without paying its mana cost.\nDestroy all enchantments.
diff --git a/forge-gui/res/cardsfolder/upcoming/phantasmal_form.txt b/forge-gui/res/cardsfolder/p/phantasmal_form.txt
similarity index 71%
rename from forge-gui/res/cardsfolder/upcoming/phantasmal_form.txt
rename to forge-gui/res/cardsfolder/p/phantasmal_form.txt
index 0b3075c873c..4b554a788c0 100644
--- a/forge-gui/res/cardsfolder/upcoming/phantasmal_form.txt
+++ b/forge-gui/res/cardsfolder/p/phantasmal_form.txt
@@ -1,7 +1,7 @@
Name:Phantasmal Form
ManaCost:2 U
Types:Instant
-A:SP$ Animate | Cost$ 2 U | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Select target creature | Power$ 3 | Toughness$ 3 | Keywords$ Flying | Colors$ Blue | Types$ Illusion | SpellDescription$ Until end of turn, up to two target creatures each have base power and toughness 3/3, gain flying, and become blue phase in addition to their other colors and types.
+A:SP$ Animate | Cost$ 2 U | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Select target creature | Power$ 3 | Toughness$ 3 | Keywords$ Flying | Colors$ Blue | Types$ Illusion | SubAbility$ DBDraw | SpellDescription$ Until end of turn, up to two target creatures each have base power and toughness 3/3, gain flying, and become blue phase in addition to their other colors and types.
AI:RemoveDeck:All
SVar:DBDraw:DB$ Draw | NumCards$ 1 | SpellDescription$ Draw a card.
Oracle:Until end of turn, up to two target creatures each have base power and toughness 3/3, gain flying, and become blue Illusions in addition to their other colors and types.\nDraw a card.
diff --git a/forge-gui/res/cardsfolder/p/phantasmal_image.txt b/forge-gui/res/cardsfolder/p/phantasmal_image.txt
index 7c110e6016e..b3a4f808c9b 100644
--- a/forge-gui/res/cardsfolder/p/phantasmal_image.txt
+++ b/forge-gui/res/cardsfolder/p/phantasmal_image.txt
@@ -4,9 +4,9 @@ Types:Creature Illusion
PT:0/0
# Make Svars for granting abilities and triggers on clones distinct to avoid SVars getting overwritten when cloning a clone
K:ETBReplacement:Copy:DBCopy:Optional
-SVar:DBCopy:DB$ Clone | Choices$ Creature.Other | AddTypes$ Illusion | AddTriggers$ PhantasmalImageTgtTrig | AddSVars$ PhantasmalImageSac,Targeting | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield, except it's an Illusion in addition to its other types and it gains "When this creature becomes the target of a spell or ability, sacrifice it."
+SVar:DBCopy:DB$ Clone | Choices$ Creature.Other | AddTypes$ Illusion | AddTriggers$ PhantasmalImageTgtTrig | AddSVars$ PhantasmalImageSac,Targeting | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield, except it's an Illusion in addition to its other types and it has "When this creature becomes the target of a spell or ability, sacrifice it."
SVar:PhantasmalImageTgtTrig:Mode$ BecomesTarget | ValidTarget$ Card.Self | Execute$ PhantasmalImageSac | TriggerDescription$ When this creature becomes the target of a spell or ability, sacrifice it.
SVar:PhantasmalImageSac:DB$Sacrifice | Defined$ Self
SVar:Targeting:Dies
SVar:Picture:http://www.wizards.com/global/images/magic/general/phantasmal_image.jpg
-Oracle:You may have Phantasmal Image enter the battlefield as a copy of any creature on the battlefield, except it's an Illusion in addition to its other types and it gains "When this creature becomes the target of a spell or ability, sacrifice it."
+Oracle:You may have Phantasmal Image enter the battlefield as a copy of any creature on the battlefield, except it's an Illusion in addition to its other types and it has "When this creature becomes the target of a spell or ability, sacrifice it."
diff --git a/forge-gui/res/cardsfolder/upcoming/phantom_ninja.txt b/forge-gui/res/cardsfolder/p/phantom_ninja.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/phantom_ninja.txt
rename to forge-gui/res/cardsfolder/p/phantom_ninja.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/plague_engineer.txt b/forge-gui/res/cardsfolder/p/plague_engineer.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/plague_engineer.txt
rename to forge-gui/res/cardsfolder/p/plague_engineer.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/planebound_accomplice.txt b/forge-gui/res/cardsfolder/p/planebound_accomplice.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/planebound_accomplice.txt
rename to forge-gui/res/cardsfolder/p/planebound_accomplice.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/pondering_mage.txt b/forge-gui/res/cardsfolder/p/pondering_mage.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/pondering_mage.txt
rename to forge-gui/res/cardsfolder/p/pondering_mage.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/prismatic_vista.txt b/forge-gui/res/cardsfolder/p/prismatic_vista.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/prismatic_vista.txt
rename to forge-gui/res/cardsfolder/p/prismatic_vista.txt
diff --git a/forge-gui/res/cardsfolder/p/probe.txt b/forge-gui/res/cardsfolder/p/probe.txt
index e64bc38112e..6314eda7efd 100644
--- a/forge-gui/res/cardsfolder/p/probe.txt
+++ b/forge-gui/res/cardsfolder/p/probe.txt
@@ -6,5 +6,7 @@ A:SP$ Draw | Cost$ 2 U | NumCards$ 3 | SubAbility$ DBDiscardYou | SpellDescripti
SVar:DBDiscardYou:DB$ Discard | Defined$ You | NumCards$ 2 | SubAbility$ DBDiscardTarget | Mode$ TgtChoose | SpellDescription$ then discard two cards.
SVar:DBDiscardTarget:DB$ Discard | Condition$ Kicked | ValidTgts$ Player | TgtPrompt$ Select target player | NumCards$ 2 | Mode$ TgtChoose | SpellDescription$ If CARDNAME was kicked, target player discards two cards.
DeckHints:Color$Black
+SVar:NeedsToPlayKickedVar:Z GE1
+SVar:Z:Count$ValidHand Card.OppCtrl
SVar:Picture:http://www.wizards.com/global/images/magic/general/probe.jpg
Oracle:Kicker {1}{B} (You may pay an additional {1}{B} as you cast this spell.)\nDraw three cards, then discard two cards.\nIf Probe was kicked, target player discards two cards.
diff --git a/forge-gui/res/cardsfolder/p/progenitor_mimic.txt b/forge-gui/res/cardsfolder/p/progenitor_mimic.txt
index 19553c0e0ed..36d8322352b 100644
--- a/forge-gui/res/cardsfolder/p/progenitor_mimic.txt
+++ b/forge-gui/res/cardsfolder/p/progenitor_mimic.txt
@@ -3,9 +3,9 @@ ManaCost:4 G U
Types:Creature Shapeshifter
PT:0/0
K:ETBReplacement:Copy:DBCopy:Optional
-SVar:DBCopy:DB$ Clone | Choices$ Creature.Other | AddTriggers$ ProgenitorTrig | AddSVars$ ProgenitorCopy,ProgenitorTrig | SpellDescription$ You may have Progenitor Mimic enter the battlefield as a copy of any creature on the battlefield, except it gains "At the beginning of your upkeep, if this creature isn't a token, create a token that's a copy of this creature."
+SVar:DBCopy:DB$ Clone | Choices$ Creature.Other | AddTriggers$ ProgenitorTrig | AddSVars$ ProgenitorCopy,ProgenitorTrig | SpellDescription$ You may have Progenitor Mimic enter the battlefield as a copy of any creature on the battlefield, except it has "At the beginning of your upkeep, if this creature isn't a token, create a token that's a copy of this creature."
SVar:ProgenitorTrig:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ ProgenitorCopy | IsPresent$ Card.Self+nonToken | TriggerDescription$ At the beginning of your upkeep, if CARDNAME isn't a token, create a token that's a copy of CARDNAME."
SVar:ProgenitorCopy:DB$ CopyPermanent | Defined$ Self | NumCopies$ 1
SVar:NeedsToPlay:Creature.inZoneBattlefield
SVar:Picture:http://www.wizards.com/global/images/magic/general/progenitor_mimic.jpg
-Oracle:You may have Progenitor Mimic enter the battlefield as a copy of any creature on the battlefield, except it gains "At the beginning of your upkeep, if this creature isn't a token, create a token that's a copy of this creature."
+Oracle:You may have Progenitor Mimic enter the battlefield as a copy of any creature on the battlefield, except it has "At the beginning of your upkeep, if this creature isn't a token, create a token that's a copy of this creature."
diff --git a/forge-gui/res/cardsfolder/upcoming/putrid_goblin.txt b/forge-gui/res/cardsfolder/p/putrid_goblin.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/putrid_goblin.txt
rename to forge-gui/res/cardsfolder/p/putrid_goblin.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/pyrophobia.txt b/forge-gui/res/cardsfolder/p/pyrophobia.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/pyrophobia.txt
rename to forge-gui/res/cardsfolder/p/pyrophobia.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/quakefoot_cyclops.txt b/forge-gui/res/cardsfolder/q/quakefoot_cyclops.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/quakefoot_cyclops.txt
rename to forge-gui/res/cardsfolder/q/quakefoot_cyclops.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/rain_of_revelation.txt b/forge-gui/res/cardsfolder/r/rain_of_revelation.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/rain_of_revelation.txt
rename to forge-gui/res/cardsfolder/r/rain_of_revelation.txt
diff --git a/forge-gui/res/cardsfolder/r/rakshasa_vizier.txt b/forge-gui/res/cardsfolder/r/rakshasa_vizier.txt
index d8d1c246e2b..41f5d8d8c85 100644
--- a/forge-gui/res/cardsfolder/r/rakshasa_vizier.txt
+++ b/forge-gui/res/cardsfolder/r/rakshasa_vizier.txt
@@ -2,7 +2,7 @@ Name:Rakshasa Vizier
ManaCost:2 B G U
Types:Creature Cat Demon
PT:4/4
-T:Mode$ ChangesZoneAll | ValidCards$ Card.YouOwn | Origin$ Graveyard | Destination$ Exile | TriggerZones$ Battlefield | Execute$ TrigPutcounter | TriggerDescription$ Whenever one or more cards are put into exile from your graveyard, put that many +1/+1 counters on Rakshasa Vizier.
+T:Mode$ ChangesZoneAll | ValidCards$ Card.YouOwn | Origin$ Graveyard | Destination$ Exile | TriggerZones$ Battlefield | Execute$ TrigPutcounter | TriggerDescription$ Whenever one or more cards are put into exile from your graveyard, put that many +1/+1 counters on CARDNAME.
SVar:TrigPutcounter:DB$ PutCounter | CounterType$ P1P1 | Defined$ Self | CounterNum$ X | References$ X
SVar:X:TriggerCount$Amount
SVar:Picture:http://www.wizards.com/global/images/magic/general/rakshasa_vizier.jpg
diff --git a/forge-gui/res/cardsfolder/upcoming/ranger_captain_of_eos.txt b/forge-gui/res/cardsfolder/r/ranger_captain_of_eos.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/ranger_captain_of_eos.txt
rename to forge-gui/res/cardsfolder/r/ranger_captain_of_eos.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/rank_officer.txt b/forge-gui/res/cardsfolder/r/rank_officer.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/rank_officer.txt
rename to forge-gui/res/cardsfolder/r/rank_officer.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/ransack_the_lab.txt b/forge-gui/res/cardsfolder/r/ransack_the_lab.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/ransack_the_lab.txt
rename to forge-gui/res/cardsfolder/r/ransack_the_lab.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/ravenous_giant.txt b/forge-gui/res/cardsfolder/r/ravenous_giant.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/ravenous_giant.txt
rename to forge-gui/res/cardsfolder/r/ravenous_giant.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/reap_the_past.txt b/forge-gui/res/cardsfolder/r/reap_the_past.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/reap_the_past.txt
rename to forge-gui/res/cardsfolder/r/reap_the_past.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/recruit_the_worthy.txt b/forge-gui/res/cardsfolder/r/recruit_the_worthy.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/recruit_the_worthy.txt
rename to forge-gui/res/cardsfolder/r/recruit_the_worthy.txt
diff --git a/forge-gui/res/cardsfolder/r/refreshing_rain.txt b/forge-gui/res/cardsfolder/r/refreshing_rain.txt
index 4855603a83d..2ce7f1d83cb 100644
--- a/forge-gui/res/cardsfolder/r/refreshing_rain.txt
+++ b/forge-gui/res/cardsfolder/r/refreshing_rain.txt
@@ -1,9 +1,9 @@
Name:Refreshing Rain
ManaCost:3 G
Types:Instant
-S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | References$ X,Y | Description$ If an opponent controls a Swamp and you control a Forest, you may cast CARDNAME without paying its mana cost.
+S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | References$ X,Y | Description$ If an opponent controls a Swamp and you control a Forest, you may cast this spell without paying its mana cost.
SVar:X:Count$Valid Swamp.OppCtrl
SVar:Y:Count$Valid Forest.YouCtrl
A:SP$ GainLife | Cost$ 3 G | LifeAmount$ 6 | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ Target player gains 6 life.
SVar:Picture:http://www.wizards.com/global/images/magic/general/refreshing_rain.jpg
-Oracle:If an opponent controls a Swamp and you control a Forest, you may cast Refreshing Rain without paying its mana cost.\nTarget player gains 6 life.
+Oracle:If an opponent controls a Swamp and you control a Forest, you may cast this spell without paying its mana cost.\nTarget player gains 6 life.
diff --git a/forge-gui/res/cardsfolder/upcoming/reprobation.txt b/forge-gui/res/cardsfolder/r/reprobation.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/reprobation.txt
rename to forge-gui/res/cardsfolder/r/reprobation.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/return_from_extinction.txt b/forge-gui/res/cardsfolder/r/return_from_extinction.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/return_from_extinction.txt
rename to forge-gui/res/cardsfolder/r/return_from_extinction.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/rhox_veteran.txt b/forge-gui/res/cardsfolder/r/rhox_veteran.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/rhox_veteran.txt
rename to forge-gui/res/cardsfolder/r/rhox_veteran.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/rime_tender.txt b/forge-gui/res/cardsfolder/r/rime_tender.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/rime_tender.txt
rename to forge-gui/res/cardsfolder/r/rime_tender.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/rotwidow_pack.txt b/forge-gui/res/cardsfolder/r/rotwidow_pack.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/rotwidow_pack.txt
rename to forge-gui/res/cardsfolder/r/rotwidow_pack.txt
diff --git a/forge-gui/res/cardsfolder/r/rowan_kenrith.txt b/forge-gui/res/cardsfolder/r/rowan_kenrith.txt
index 9868e082f06..302a8e04b57 100644
--- a/forge-gui/res/cardsfolder/r/rowan_kenrith.txt
+++ b/forge-gui/res/cardsfolder/r/rowan_kenrith.txt
@@ -4,7 +4,7 @@ Types:Legendary Planeswalker Rowan
Loyalty:4
Text:CARDNAME can be your commander.
K:Partner:Will Kenrith:Will
-A:AB$ Effect | Cost$ AddCounter<2/LOYALTY> | Planeswalker$ True | Name$ Rowan Kenrith Taunt Effect | ValidTgts$ Player | TgtPrompt$ Select target player | StaticAbilities$ MustAttack | References$ MustAttack | RememberObjects$ Targeted | IsCurse$ True | Triggers$ RemoveEffect | SVars$ ExileEffect | Duration$ Permanent | SubAbility$ DBCleanup | SpellDescription$ Creatures target player controls attack this turn if able.
+A:AB$ Effect | Cost$ AddCounter<2/LOYALTY> | Planeswalker$ True | Name$ Rowan Kenrith Taunt Effect | ValidTgts$ Player | TgtPrompt$ Select target player | StaticAbilities$ MustAttack | References$ MustAttack | RememberObjects$ Targeted | IsCurse$ True | Triggers$ RemoveEffect | SVars$ ExileEffect | Duration$ Permanent | SubAbility$ DBCleanup | SpellDescription$ During target player's next turn, each creature that player controls attacks if able.
SVar:MustAttack:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.RememberedPlayerCtrl | AddHiddenKeyword$ CARDNAME attacks each combat if able. | Description$ Creatures target opponent controls attack this turn if able.
SVar:RemoveEffect:Mode$ Phase | Phase$ Cleanup | ValidPlayer$ Player.IsRemembered | TriggerZones$ Command | Static$ True | Execute$ ExileEffect
SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile
diff --git a/forge-gui/res/cardsfolder/upcoming/ruination_rioter.txt b/forge-gui/res/cardsfolder/r/ruination_rioter.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/ruination_rioter.txt
rename to forge-gui/res/cardsfolder/r/ruination_rioter.txt
diff --git a/forge-gui/res/cardsfolder/r/rushing_river.txt b/forge-gui/res/cardsfolder/r/rushing_river.txt
index e73447c7bd3..4f83a95e0b2 100644
--- a/forge-gui/res/cardsfolder/r/rushing_river.txt
+++ b/forge-gui/res/cardsfolder/r/rushing_river.txt
@@ -4,5 +4,7 @@ Types:Instant
K:Kicker:Sac<1/Land>
A:SP$ ChangeZone | Cost$ 2 U | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent | TargetMin$ X | TargetMax$ X | References$ X | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target nonland permanent to its owner's hand. If CARDNAME was kicked, return another target nonland permanent to its owner's hand.
SVar:X:Count$Kicked.2.1
+SVar:NeedsToPlayKickedVar:Z GE2
+SVar:Z:Count$Valid Permanent.nonLand+OppCtrl
SVar:Picture:http://www.wizards.com/global/images/magic/general/rushing_river.jpg
Oracle:Kicker—Sacrifice a land. (You may sacrifice a land in addition to any other costs as you cast this spell.)\nReturn target nonland permanent to its owner's hand. If Rushing River was kicked, return another target nonland permanent to its owner's hand.
diff --git a/forge-gui/res/cardsfolder/r/rushwood_legate.txt b/forge-gui/res/cardsfolder/r/rushwood_legate.txt
index 1abba122043..2ab40f2c1f6 100644
--- a/forge-gui/res/cardsfolder/r/rushwood_legate.txt
+++ b/forge-gui/res/cardsfolder/r/rushwood_legate.txt
@@ -2,8 +2,8 @@ Name:Rushwood Legate
ManaCost:2 G
Types:Creature Dryad
PT:2/1
-S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | References$ X,Y | Description$ If an opponent controls an Island and you control a Forest, you may cast CARDNAME without paying its mana cost.
+S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | References$ X,Y | Description$ If an opponent controls an Island and you control a Forest, you may cast this spell without paying its mana cost.
SVar:X:Count$Valid Island.OppCtrl
SVar:Y:Count$Valid Forest.YouCtrl
SVar:Picture:http://www.wizards.com/global/images/magic/general/rushwood_legate.jpg
-Oracle:If an opponent controls an Island and you control a Forest, you may cast Rushwood Legate without paying its mana cost.
+Oracle:If an opponent controls an Island and you control a Forest, you may cast this spell without paying its mana cost.
diff --git a/forge-gui/res/cardsfolder/upcoming/saddled_rimestag.txt b/forge-gui/res/cardsfolder/s/saddled_rimestag.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/saddled_rimestag.txt
rename to forge-gui/res/cardsfolder/s/saddled_rimestag.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/sadistic_obsession.txt b/forge-gui/res/cardsfolder/s/sadistic_obsession.txt
similarity index 82%
rename from forge-gui/res/cardsfolder/upcoming/sadistic_obsession.txt
rename to forge-gui/res/cardsfolder/s/sadistic_obsession.txt
index 333899f8501..0cbb51c2bea 100644
--- a/forge-gui/res/cardsfolder/upcoming/sadistic_obsession.txt
+++ b/forge-gui/res/cardsfolder/s/sadistic_obsession.txt
@@ -4,7 +4,7 @@ Types:Enchantment Aura
K:Enchant creature
A:SP$ Attach | Cost$ 3 B | ValidTgts$ Creature | AILogic$ Pump
S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddAbility$ TapCounter | Description$ Enchanted creature has "{B}, {T}: Put a -1/-1 counter on target creature."
-SVar:TapCounter:AB$ PutCounter | Cost$ B T | ValidTgts$ Creature | CounterType$ M1M1 | CounterNum$ 1 | SpellDescription$ Put a -1/-1 counter on target creature.
+SVar:TapCounter:AB$ PutCounter | Cost$ B T | ValidTgts$ Creature | CounterType$ M1M1 | CounterNum$ 1 | IsCurse$ True | SpellDescription$ Put a -1/-1 counter on target creature.
SVar:NonStackingAttachEffect:True
DeckHas:Ability$Counters
Oracle:Enchant creature\nEnchanted creature has "{B}, {T}: Put a -1/-1 counter on target creature."
diff --git a/forge-gui/res/cardsfolder/s/saprazzan_legate.txt b/forge-gui/res/cardsfolder/s/saprazzan_legate.txt
index 8bfd797fd89..45609bc0703 100644
--- a/forge-gui/res/cardsfolder/s/saprazzan_legate.txt
+++ b/forge-gui/res/cardsfolder/s/saprazzan_legate.txt
@@ -3,8 +3,8 @@ ManaCost:3 U
Types:Creature Merfolk Soldier
PT:1/3
K:Flying
-S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | Description$ If an opponent controls a Mountain and you control an Island, you may cast CARDNAME without paying its mana cost.
+S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | Description$ If an opponent controls a Mountain and you control an Island, you may cast this spell without paying its mana cost.
SVar:X:Count$Valid Mountain.OppCtrl
SVar:Y:Count$Valid Island.YouCtrl
SVar:Picture:http://www.wizards.com/global/images/magic/general/saprazzan_legate.jpg
-Oracle:Flying\nIf an opponent controls a Mountain and you control an Island, you may cast Saprazzan Legate without paying its mana cost.
+Oracle:Flying\nIf an opponent controls a Mountain and you control an Island, you may cast this spell without paying its mana cost.
diff --git a/forge-gui/res/cardsfolder/upcoming/savage_swipe.txt b/forge-gui/res/cardsfolder/s/savage_swipe.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/savage_swipe.txt
rename to forge-gui/res/cardsfolder/s/savage_swipe.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/scale_up.txt b/forge-gui/res/cardsfolder/s/scale_up.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/scale_up.txt
rename to forge-gui/res/cardsfolder/s/scale_up.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/scour_all_possibilities.txt b/forge-gui/res/cardsfolder/s/scour_all_possibilities.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/scour_all_possibilities.txt
rename to forge-gui/res/cardsfolder/s/scour_all_possibilities.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/scrapyard_recombiner.txt b/forge-gui/res/cardsfolder/s/scrapyard_recombiner.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/scrapyard_recombiner.txt
rename to forge-gui/res/cardsfolder/s/scrapyard_recombiner.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/scuttling_sliver.txt b/forge-gui/res/cardsfolder/s/scuttling_sliver.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/scuttling_sliver.txt
rename to forge-gui/res/cardsfolder/s/scuttling_sliver.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/seasoned_pyromancer.txt b/forge-gui/res/cardsfolder/s/seasoned_pyromancer.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/seasoned_pyromancer.txt
rename to forge-gui/res/cardsfolder/s/seasoned_pyromancer.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/segovian_angel.txt b/forge-gui/res/cardsfolder/s/segovian_angel.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/segovian_angel.txt
rename to forge-gui/res/cardsfolder/s/segovian_angel.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/serra_the_benevolent.txt b/forge-gui/res/cardsfolder/s/serra_the_benevolent.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/serra_the_benevolent.txt
rename to forge-gui/res/cardsfolder/s/serra_the_benevolent.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/settle_beyond_reality.txt b/forge-gui/res/cardsfolder/s/settle_beyond_reality.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/settle_beyond_reality.txt
rename to forge-gui/res/cardsfolder/s/settle_beyond_reality.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/shatter_assumptions.txt b/forge-gui/res/cardsfolder/s/shatter_assumptions.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/shatter_assumptions.txt
rename to forge-gui/res/cardsfolder/s/shatter_assumptions.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/shenanigans.txt b/forge-gui/res/cardsfolder/s/shenanigans.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/shenanigans.txt
rename to forge-gui/res/cardsfolder/s/shenanigans.txt
diff --git a/forge-gui/res/cardsfolder/s/shivan_emissary.txt b/forge-gui/res/cardsfolder/s/shivan_emissary.txt
index c92ccdf7d86..db81c97f1a2 100644
--- a/forge-gui/res/cardsfolder/s/shivan_emissary.txt
+++ b/forge-gui/res/cardsfolder/s/shivan_emissary.txt
@@ -5,7 +5,7 @@ PT:1/1
K:Kicker:1 B
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, destroy target nonblack creature. It can't be regenerated.
SVar:TrigKicker:DB$Destroy | ValidTgts$ Creature.nonBlack | NoRegen$ True | TgtPrompt$ Select target nonblack creature
-AI:RemoveDeck:Random
DeckNeeds:Color$Black
+SVar:NeedsToPlayKicked:Creature.nonBlack+OppCtrl
SVar:Picture:http://www.wizards.com/global/images/magic/general/shivan_emissary.jpg
Oracle:Kicker {1}{B} (You may pay an additional {1}{B} as you cast this spell.)\nWhen Shivan Emissary enters the battlefield, if it was kicked, destroy target nonblack creature. It can't be regenerated.
diff --git a/forge-gui/res/cardsfolder/upcoming/silent_clearing.txt b/forge-gui/res/cardsfolder/s/silent_clearing.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/silent_clearing.txt
rename to forge-gui/res/cardsfolder/s/silent_clearing.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/silumgar_scavenger.txt b/forge-gui/res/cardsfolder/s/silumgar_scavenger.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/silumgar_scavenger.txt
rename to forge-gui/res/cardsfolder/s/silumgar_scavenger.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/sisay_weatherlight_captain.txt b/forge-gui/res/cardsfolder/s/sisay_weatherlight_captain.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/sisay_weatherlight_captain.txt
rename to forge-gui/res/cardsfolder/s/sisay_weatherlight_captain.txt
diff --git a/forge-gui/res/cardsfolder/s/sivvis_ruse.txt b/forge-gui/res/cardsfolder/s/sivvis_ruse.txt
index 469a657da53..2f085d4299c 100644
--- a/forge-gui/res/cardsfolder/s/sivvis_ruse.txt
+++ b/forge-gui/res/cardsfolder/s/sivvis_ruse.txt
@@ -1,11 +1,11 @@
Name:Sivvi's Ruse
ManaCost:2 W W
Types:Instant
-S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | Description$ If an opponent controls a Mountain and you control a Plains, you may cast CARDNAME without paying its mana cost.
+S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | Description$ If an opponent controls a Mountain and you control a Plains, you may cast this spell without paying its mana cost.
A:SP$ Effect | Cost$ 2 W W | Name$ Sivvi's Ruse Effect | ReplacementEffects$ RPrevent | SpellDescription$ Prevent all damage that would be dealt this turn to creatures you control.
SVar:RPrevent:Event$ DamageDone | Prevent$ True | ActiveZones$ Command | ValidTarget$ Creature.YouCtrl | Description$ Prevent all damage that would be dealt this turn to creatures you control.
SVar:X:Count$Valid Mountain.OppCtrl
SVar:Y:Count$Valid Plains.YouCtrl
AI:RemoveDeck:All
SVar:Picture:http://www.wizards.com/global/images/magic/general/sivvis_ruse.jpg
-Oracle:If an opponent controls a Mountain and you control a Plains, you may cast Sivvi's Ruse without paying its mana cost.\nPrevent all damage that would be dealt this turn to creatures you control.
+Oracle:If an opponent controls a Mountain and you control a Plains, you may cast this spell without paying its mana cost.\nPrevent all damage that would be dealt this turn to creatures you control.
diff --git a/forge-gui/res/cardsfolder/s/skizzik.txt b/forge-gui/res/cardsfolder/s/skizzik.txt
index 2505c751475..ffaeaa7048e 100644
--- a/forge-gui/res/cardsfolder/s/skizzik.txt
+++ b/forge-gui/res/cardsfolder/s/skizzik.txt
@@ -7,5 +7,9 @@ K:Trample
K:Kicker:R
T:Mode$ Phase | Phase$ End of Turn | IsPresent$ Card.Self+notkicked | Execute$ TrigNotKicked | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of the end step, sacrifice CARDNAME unless it was kicked.
SVar:TrigNotKicked:DB$Sacrifice | Defined$ Self
+# The following construct specifies that the AI always plays the spell kicked, and plays it unkicked on its own turn only if it will attack
+SVar:NeedsToPlay:WillAttack
+SVar:NeedsToPlayKickedVar:Z GE1
+SVar:Z:Number$1
SVar:Picture:http://www.wizards.com/global/images/magic/general/skizzik.jpg
Oracle:Kicker {R} (You may pay an additional {R} as you cast this spell.)\nTrample, haste\nAt the beginning of the end step, sacrifice Skizzik unless it was kicked.
diff --git a/forge-gui/res/cardsfolder/upcoming/sling_gang_lieutenant.txt b/forge-gui/res/cardsfolder/s/sling_gang_lieutenant.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/sling_gang_lieutenant.txt
rename to forge-gui/res/cardsfolder/s/sling_gang_lieutenant.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/smiting_helix.txt b/forge-gui/res/cardsfolder/s/smiting_helix.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/smiting_helix.txt
rename to forge-gui/res/cardsfolder/s/smiting_helix.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/smoke_shroud.txt b/forge-gui/res/cardsfolder/s/smoke_shroud.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/smoke_shroud.txt
rename to forge-gui/res/cardsfolder/s/smoke_shroud.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/soul_strike_technique.txt b/forge-gui/res/cardsfolder/s/soul_strike_technique.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/soul_strike_technique.txt
rename to forge-gui/res/cardsfolder/s/soul_strike_technique.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/soulherder.txt b/forge-gui/res/cardsfolder/s/soulherder.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/soulherder.txt
rename to forge-gui/res/cardsfolder/s/soulherder.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/spell_snuff.txt b/forge-gui/res/cardsfolder/s/spell_snuff.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/spell_snuff.txt
rename to forge-gui/res/cardsfolder/s/spell_snuff.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/spinehorn_minotaur.txt b/forge-gui/res/cardsfolder/s/spinehorn_minotaur.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/spinehorn_minotaur.txt
rename to forge-gui/res/cardsfolder/s/spinehorn_minotaur.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/spiteful_sliver.txt b/forge-gui/res/cardsfolder/s/spiteful_sliver.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/spiteful_sliver.txt
rename to forge-gui/res/cardsfolder/s/spiteful_sliver.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/splicers_skill.txt b/forge-gui/res/cardsfolder/s/splicers_skill.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/splicers_skill.txt
rename to forge-gui/res/cardsfolder/s/splicers_skill.txt
diff --git a/forge-gui/res/cardsfolder/s/splinter_twin.txt b/forge-gui/res/cardsfolder/s/splinter_twin.txt
index 0e4598a6087..913bbef85bf 100644
--- a/forge-gui/res/cardsfolder/s/splinter_twin.txt
+++ b/forge-gui/res/cardsfolder/s/splinter_twin.txt
@@ -3,8 +3,8 @@ ManaCost:2 R R
Types:Enchantment Aura
K:Enchant creature
A:SP$ Attach | Cost$ 2 R R | ValidTgts$ Creature | AILogic$ Pump
-S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddAbility$ ABCopy | Description$ Enchanted creature has "{T}: Create a token that's a copy of this creature. That token has haste. Exile it at the beginning of the next end step."
-SVar:ABCopy:AB$ CopyPermanent | Cost$ T | Defined$ Self | AddKeywords$ Haste | AtEOT$ Exile | SpellDescription$ Create a token that's a copy of this creature. That token has haste. Exile it at the beginning of the next end step.
+S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddAbility$ ABCopy | Description$ Enchanted creature has "{T}: Create a token that's a copy of this creature, except it has haste. Exile it at the beginning of the next end step."
+SVar:ABCopy:AB$ CopyPermanent | Cost$ T | Defined$ Self | AddKeywords$ Haste | AtEOT$ Exile | SpellDescription$ Create a token that's a copy of this creature, except it has haste. Exile it at the beginning of the next end step.
SVar:NonStackingAttachEffect:True
SVar:Picture:http://www.wizards.com/global/images/magic/general/splinter_twin.jpg
-Oracle:Enchant creature\nEnchanted creature has "{T}: Create a token that's a copy of this creature. That token has haste. Exile it at the beginning of the next end step."
+Oracle:Enchant creature\nEnchanted creature has "{T}: Create a token that's a copy of this creature, except it has haste. Exile that token at the beginning of the next end step."
diff --git a/forge-gui/res/cardsfolder/upcoming/springbloom_druid.txt b/forge-gui/res/cardsfolder/s/springbloom_druid.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/springbloom_druid.txt
rename to forge-gui/res/cardsfolder/s/springbloom_druid.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/stirring_address.txt b/forge-gui/res/cardsfolder/s/stirring_address.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/stirring_address.txt
rename to forge-gui/res/cardsfolder/s/stirring_address.txt
diff --git a/forge-gui/res/cardsfolder/s/stolen_strategy.txt b/forge-gui/res/cardsfolder/s/stolen_strategy.txt
new file mode 100644
index 00000000000..bea88f35b7a
--- /dev/null
+++ b/forge-gui/res/cardsfolder/s/stolen_strategy.txt
@@ -0,0 +1,12 @@
+Name:Stolen Strategy
+ManaCost:4 R
+Types:Enchantment
+T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigExile | TriggerDescription$ At the beginning of your upkeep, exile the top card of each opponent’s library.
+SVar:TrigExile:DB$ Mill | Defined$ Player.Opponent | NumCards$ 1 | Destination$ Exile | RememberMilled$ True | SubAbility$ DBEffect | SpellDescription$ Exile the top card of each opponent's library. Until end of turn, you may cast nonland cards and you may spend mana as though it were mana of any color to cast those spells.
+SVar:DBEffect:DB$ Effect | StaticAbilities$ STPlay | Triggers$ TriggerCastDoM | SVars$ TrigRemoveSelf | RememberObjects$ Remembered | SubAbility$ DBCleanup
+SVar:STPlay:Mode$ Continuous | MayPlay$ True | MayPlayIgnoreColor$ True | EffectZone$ Command | Affected$ Card.IsRemembered+nonLand | AffectedZone$ Exile | Description$ Until end of turn, you may cast that card and you may spend mana as though it were mana of any color to cast it.
+SVar:TriggerCastDoM:Mode$ SpellCast | ValidCard$ Card.IsRemembered | TriggerZones$ Command | Execute$ TrigRemoveSelf | Static$ True
+SVar:TrigRemoveSelf:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile
+SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
+SVar:Picture:https://img.scryfall.com/cards/large/en/bbd/64.jpg
+Oracle:At the beginning of your upkeep, exile the top card of each opponent’s library. Until end of turn, you may cast nonland cards from among those exiled cards, and you may spend mana as though it were mana of any color to cast those spells.
diff --git a/forge-gui/res/cardsfolder/upcoming/stream_of_thought.txt b/forge-gui/res/cardsfolder/s/stream_of_thought.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/stream_of_thought.txt
rename to forge-gui/res/cardsfolder/s/stream_of_thought.txt
diff --git a/forge-gui/res/cardsfolder/s/strength_of_night.txt b/forge-gui/res/cardsfolder/s/strength_of_night.txt
index 2b933f0fda3..96901d17bc2 100644
--- a/forge-gui/res/cardsfolder/s/strength_of_night.txt
+++ b/forge-gui/res/cardsfolder/s/strength_of_night.txt
@@ -4,7 +4,7 @@ Types:Instant
K:Kicker:B
A:SP$ PumpAll | Cost$ 2 G | ValidCards$ Creature.YouCtrl | NumAtt$ 1 | NumDef$ 1 | SubAbility$ DBPumpYourZombies | SpellDescription$ Creatures you control get +1/+1 until end of turn. If CARDNAME was kicked, Zombie creatures you control get an additional +2/+2 until end of turn.
SVar:DBPumpYourZombies:DB$ PumpAll | ValidCards$ Creature.Zombie+YouCtrl | NumAtt$ 2 | NumDef$ 2 | Condition$ Kicked | ConditionDescription$ If Strength of Night was kicked,
-AI:RemoveDeck:Random
DeckNeeds:Color$Black & Type$Zombie
+SVar:NeedsToPlayKicked:Creature.Zombie+YouCtrl
SVar:Picture:http://www.wizards.com/global/images/magic/general/strength_of_night.jpg
Oracle:Kicker {B} (You may pay an additional {B} as you cast this spell.)\nCreatures you control get +1/+1 until end of turn. If Strength of Night was kicked, Zombie creatures you control get an additional +2/+2 until end of turn.
diff --git a/forge-gui/res/cardsfolder/upcoming/string_of_disappearances.txt b/forge-gui/res/cardsfolder/s/string_of_disappearances.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/string_of_disappearances.txt
rename to forge-gui/res/cardsfolder/s/string_of_disappearances.txt
diff --git a/forge-gui/res/cardsfolder/s/submerge.txt b/forge-gui/res/cardsfolder/s/submerge.txt
index 45e7dd9225c..31bfd5eede7 100644
--- a/forge-gui/res/cardsfolder/s/submerge.txt
+++ b/forge-gui/res/cardsfolder/s/submerge.txt
@@ -1,9 +1,9 @@
Name:Submerge
ManaCost:4 U
Types:Instant
-S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | Description$ If an opponent controls a Forest and you control an Island, you may cast CARDNAME without paying its mana cost.
+S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | Description$ If an opponent controls a Forest and you control an Island, you may cast this spell without paying its mana cost.
SVar:X:Count$Valid Forest.OppCtrl
SVar:Y:Count$Valid Island.YouCtrl
A:SP$ ChangeZone | Cost$ 4 U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 | SpellDescription$ Put target creature on top of its owner's library.
SVar:Picture:http://www.wizards.com/global/images/magic/general/submerge.jpg
-Oracle:If an opponent controls a Forest and you control an Island, you may cast Submerge without paying its mana cost.\nPut target creature on top of its owner's library.
+Oracle:If an opponent controls a Forest and you control an Island, you may cast this spell without paying its mana cost.\nPut target creature on top of its owner's library.
diff --git a/forge-gui/res/cardsfolder/upcoming/sunbaked_canyon.txt b/forge-gui/res/cardsfolder/s/sunbaked_canyon.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/sunbaked_canyon.txt
rename to forge-gui/res/cardsfolder/s/sunbaked_canyon.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/sword_of_sinew_and_steel.txt b/forge-gui/res/cardsfolder/s/sword_of_sinew_and_steel.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/sword_of_sinew_and_steel.txt
rename to forge-gui/res/cardsfolder/s/sword_of_sinew_and_steel.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/sword_of_truth_and_justice.txt b/forge-gui/res/cardsfolder/s/sword_of_truth_and_justice.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/sword_of_truth_and_justice.txt
rename to forge-gui/res/cardsfolder/s/sword_of_truth_and_justice.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/talisman_of_conviction.txt b/forge-gui/res/cardsfolder/t/talisman_of_conviction.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/talisman_of_conviction.txt
rename to forge-gui/res/cardsfolder/t/talisman_of_conviction.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/talisman_of_creativity.txt b/forge-gui/res/cardsfolder/t/talisman_of_creativity.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/talisman_of_creativity.txt
rename to forge-gui/res/cardsfolder/t/talisman_of_creativity.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/talisman_of_curiosity.txt b/forge-gui/res/cardsfolder/t/talisman_of_curiosity.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/talisman_of_curiosity.txt
rename to forge-gui/res/cardsfolder/t/talisman_of_curiosity.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/talisman_of_hierarchy.txt b/forge-gui/res/cardsfolder/t/talisman_of_hierarchy.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/talisman_of_hierarchy.txt
rename to forge-gui/res/cardsfolder/t/talisman_of_hierarchy.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/talisman_of_resilience.txt b/forge-gui/res/cardsfolder/t/talisman_of_resilience.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/talisman_of_resilience.txt
rename to forge-gui/res/cardsfolder/t/talisman_of_resilience.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/tectonic_reformation.txt b/forge-gui/res/cardsfolder/t/tectonic_reformation.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/tectonic_reformation.txt
rename to forge-gui/res/cardsfolder/t/tectonic_reformation.txt
diff --git a/forge-gui/res/cardsfolder/t/teferi_time_raveler.txt b/forge-gui/res/cardsfolder/t/teferi_time_raveler.txt
index ecd0d2017e2..e8868aa1ba8 100644
--- a/forge-gui/res/cardsfolder/t/teferi_time_raveler.txt
+++ b/forge-gui/res/cardsfolder/t/teferi_time_raveler.txt
@@ -3,7 +3,7 @@ ManaCost:1 W U
Types:Legendary Planeswalker Teferi
Loyalty:4
S:Mode$ CantBeCast | ValidCard$ Card | Caster$ Opponent | OnlySorcerySpeed$ True | Description$ Each opponent can cast spells only any time they could cast a sorcery.
-A:AB$ Effect | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | StaticAbilities$ STPlay | Duration$ UntilYourNextTurn | SpellDescription$ Until your next turn, you may cast sorcery spells as though they had flash.
+A:AB$ Effect | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | StaticAbilities$ STPlay | Duration$ UntilYourNextTurn | AILogic$ Main2 | SpellDescription$ Until your next turn, you may cast sorcery spells as though they had flash.
SVar:STPlay:Mode$ Continuous | EffectZone$ Command | Affected$ Sorcery | AffectedZone$ Exile,Graveyard,Hand,Library,Command | WithFlash$ You | Description$ Until your next turn, you may cast sorcery spells as though they had flash.
SVar:PlayMain1:TRUE
A:AB$ ChangeZone | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | Origin$ Battlefield | Destination$ Hand | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Artifact,Creature,Enchantment | TgtPrompt$ Select target artifact, creature, or enchantment | SpellDescription$ Return up to one target artifact, creature, or enchantment to its owner's hand. Draw a card. | SubAbility$ DBDraw
diff --git a/forge-gui/res/cardsfolder/upcoming/tempered_sliver.txt b/forge-gui/res/cardsfolder/t/tempered_sliver.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/tempered_sliver.txt
rename to forge-gui/res/cardsfolder/t/tempered_sliver.txt
diff --git a/forge-gui/res/cardsfolder/t/tempt_with_immortality.txt b/forge-gui/res/cardsfolder/t/tempt_with_immortality.txt
index 17b880269e4..b1f0511d18c 100644
--- a/forge-gui/res/cardsfolder/t/tempt_with_immortality.txt
+++ b/forge-gui/res/cardsfolder/t/tempt_with_immortality.txt
@@ -1,7 +1,7 @@
Name:Tempt with Immortality
ManaCost:4 B
Types:Sorcery
-A:SP$ ChangeZone | Cost$ 4 B | Origin$ Graveyard | Destination$ Battlefield | ChangeType$ Creature.YouCtrl | ChangeNum$ 1 | Hidden$ True | SubAbility$ DBRepeat | StackDescription$ SpellDescription | SpellDescription$ Tempting offer — Return a creature card from your graveyard to the battlefield. Each opponent may return a creature card from their graveyard to the battlefield. For each player who does, return a creature card from your graveyard to the battlefield.
+A:SP$ ChangeZone | Cost$ 4 B | Origin$ Graveyard | Destination$ Battlefield | ChangeType$ Creature.YouCtrl | ChangeNum$ 1 | Hidden$ True | SubAbility$ DBRepeat | StackDescription$ SpellDescription | SpellDescription$ Tempting offer — Return a creature card from your graveyard to the battlefield. Each opponent may return a creature card from their graveyard to the battlefield. For each opponent who does, return a creature card from your graveyard to the battlefield.
SVar:DBRepeat:DB$ RepeatEach | RepeatSubAbility$ DBChangeZone | RepeatPlayers$ Player.Opponent | SubAbility$ DBReturn
SVar:DBChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ChangeType$ Creature.RememberedPlayerCtrl | DefinedPlayer$ Player.IsRemembered | Chooser$ Player.IsRemembered | ChangeNum$ 1 | Hidden$ True | RememberChanged$ True
SVar:DBReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ChangeType$ Creature.YouCtrl | ChangeNum$ X | References$ X | Hidden$ True | SubAbility$ DBCleanup
@@ -10,4 +10,4 @@ SVar:X:Remembered$Amount
SVar:NeedsToPlayVar:Y GE2
SVar:Y:Count$TypeInYourYard.Creature
SVar:Picture:http://www.wizards.com/global/images/magic/general/tempt_with_immortality.jpg
-Oracle:Tempting offer — Return a creature card from your graveyard to the battlefield. Each opponent may return a creature card from their graveyard to the battlefield. For each player who does, return a creature card from your graveyard to the battlefield.
+Oracle:Tempting offer — Return a creature card from your graveyard to the battlefield. Each opponent may return a creature card from their graveyard to the battlefield. For each opponent who does, return a creature card from your graveyard to the battlefield.
diff --git a/forge-gui/res/cardsfolder/t/tempt_with_vengeance.txt b/forge-gui/res/cardsfolder/t/tempt_with_vengeance.txt
index 45ecb52fcc8..31d7a98ec1b 100644
--- a/forge-gui/res/cardsfolder/t/tempt_with_vengeance.txt
+++ b/forge-gui/res/cardsfolder/t/tempt_with_vengeance.txt
@@ -1,7 +1,7 @@
Name:Tempt with Vengeance
ManaCost:X R
Types:Sorcery
-A:SP$ Token | Cost$ X R | TokenAmount$ X | References$ X | TokenScript$ r_1_1_elemental_haste | TokenOwner$ You | LegacyImage$ r 1 1 elemental haste c13 | SubAbility$ DBRepeat | StackDescription$ SpellDescription | SpellDescription$ Tempting offer — Create X 1/1 red Elemental creature tokens with haste. Each opponent may create X 1/1 red Elemental creature tokens with haste. For each player who does, create X 1/1 red Elemental creature tokens with haste.
+A:SP$ Token | Cost$ X R | TokenAmount$ X | References$ X | TokenScript$ r_1_1_elemental_haste | TokenOwner$ You | LegacyImage$ r 1 1 elemental haste c13 | SubAbility$ DBRepeat | StackDescription$ SpellDescription | SpellDescription$ Tempting offer — Create X 1/1 red Elemental creature tokens with haste. Each opponent may create X 1/1 red Elemental creature tokens with haste. For each opponent who does, create X 1/1 red Elemental creature tokens with haste.
SVar:DBRepeat:DB$ RepeatEach | RepeatSubAbility$ DBTokenOpp | RepeatPlayers$ Player.Opponent | RepeatOptionalForEachPlayer$ True | RepeatOptionalMessage$ Do you want to create X 1/1 red Elemental creature tokens with haste? | SubAbility$ DBToken
SVar:DBTokenOpp:DB$ Token | TokenAmount$ X | References$ X | TokenScript$ r_1_1_elemental_haste | TokenOwner$ Player.IsRemembered | LegacyImage$ r 1 1 elemental haste c13 | SubAbility$ DBCount
SVar:DBCount:DB$ StoreSVar | SVar$ Y | Type$ CountSVar | Expression$ Y/Plus.1 | References$ Y
@@ -11,4 +11,4 @@ SVar:Y:Number$0
SVar:X:Count$xPaid
SVar:Z:SVar$X/Times.Y
SVar:Picture:http://www.wizards.com/global/images/magic/general/tempt_with_vengeance.jpg
-Oracle:Tempting offer — Create X 1/1 red Elemental creature tokens with haste. Each opponent may create X 1/1 red Elemental creature tokens with haste. For each player who does, create X 1/1 red Elemental creature tokens with haste.
+Oracle:Tempting offer — Create X 1/1 red Elemental creature tokens with haste. Each opponent may create X 1/1 red Elemental creature tokens with haste. For each opponent who does, create X 1/1 red Elemental creature tokens with haste.
diff --git a/forge-gui/res/cardsfolder/t/territorial_allosaurus.txt b/forge-gui/res/cardsfolder/t/territorial_allosaurus.txt
index 7107c646f8e..c4e6911b7e2 100644
--- a/forge-gui/res/cardsfolder/t/territorial_allosaurus.txt
+++ b/forge-gui/res/cardsfolder/t/territorial_allosaurus.txt
@@ -6,4 +6,5 @@ K:Kicker:2 G
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, it fights another target creature.
SVar:TrigKicker:DB$ Fight | Defined$ TriggeredCardLKICopy | ValidTgts$ Creature.Other | TgtPrompt$ Choose another target creature
SVar:PlayMain1:TRUE
+SVar:NeedsToPlayKicked:Creature.OppCtrl+toughnessLE5
Oracle:Kicker {2}{G} (You may pay an additional {2}{G} as you cast this spell.)\nWhen Territorial Allosaurus enters the battlefield, if it was kicked, it fights another target creature.
diff --git a/forge-gui/res/cardsfolder/upcoming/the_first_sliver.txt b/forge-gui/res/cardsfolder/t/the_first_sliver.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/the_first_sliver.txt
rename to forge-gui/res/cardsfolder/t/the_first_sliver.txt
diff --git a/forge-gui/res/cardsfolder/t/thespians_stage.txt b/forge-gui/res/cardsfolder/t/thespians_stage.txt
index 276afdc26e9..12a8bbfeca5 100644
--- a/forge-gui/res/cardsfolder/t/thespians_stage.txt
+++ b/forge-gui/res/cardsfolder/t/thespians_stage.txt
@@ -2,7 +2,7 @@ Name:Thespian's Stage
ManaCost:no cost
Types:Land
A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}.
-A:AB$ Clone | Cost$ 2 T | ValidTgts$ Land | TgtPrompt$ Select target land to copy. | GainThisAbility$ True | SpellDescription$ CARDNAME becomes a copy of target land and gains this ability.
+A:AB$ Clone | Cost$ 2 T | ValidTgts$ Land | TgtPrompt$ Select target land to copy. | GainThisAbility$ True | SpellDescription$ CARDNAME becomes a copy of target land, except it has this ability.
AI:RemoveDeck:All
SVar:Picture:http://www.wizards.com/global/images/magic/general/thespians_stage.jpg
-Oracle:{T}: Add {C}.\n{2}, {T}: Thespian's Stage becomes a copy of target land and gains this ability.
+Oracle:{T}: Add {C}.\n{2}, {T}: Thespian's Stage becomes a copy of target land, except it has this ability.
diff --git a/forge-gui/res/cardsfolder/upcoming/thornado.txt b/forge-gui/res/cardsfolder/t/thornado.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/thornado.txt
rename to forge-gui/res/cardsfolder/t/thornado.txt
diff --git a/forge-gui/res/cardsfolder/t/throatseeker.txt b/forge-gui/res/cardsfolder/t/throatseeker.txt
new file mode 100644
index 00000000000..5f94f090d87
--- /dev/null
+++ b/forge-gui/res/cardsfolder/t/throatseeker.txt
@@ -0,0 +1,7 @@
+Name:Throatseeker
+ManaCost:2 B
+Types:Creature Vampire Ninja
+PT:3/2
+S:Mode$ Continuous | Affected$ Ninja.attacking+unblocked+YouCtrl | AddKeyword$ Lifelink | Description$ Unblocked attacking Ninjas you control have lifelink.
+SVar:PlayMain1:TRUE
+Oracle:Unblocked attacking Ninjas you control have lifelink.
diff --git a/forge-gui/res/cardsfolder/upcoming/throes_of_chaos.txt b/forge-gui/res/cardsfolder/t/throes_of_chaos.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/throes_of_chaos.txt
rename to forge-gui/res/cardsfolder/t/throes_of_chaos.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/thundering_djinn.txt b/forge-gui/res/cardsfolder/t/thundering_djinn.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/thundering_djinn.txt
rename to forge-gui/res/cardsfolder/t/thundering_djinn.txt
diff --git a/forge-gui/res/cardsfolder/t/time_spiral.txt b/forge-gui/res/cardsfolder/t/time_spiral.txt
index 2a5a967e054..954adfca9e0 100644
--- a/forge-gui/res/cardsfolder/t/time_spiral.txt
+++ b/forge-gui/res/cardsfolder/t/time_spiral.txt
@@ -1,9 +1,9 @@
Name:Time Spiral
ManaCost:4 U U
Types:Sorcery
-A:SP$ ChangeZoneAll | Cost$ 4 U U | ChangeType$ Card | Origin$ Hand,Graveyard | Destination$ Library | Shuffle$ True | Random$ True | SubAbility$ DBDraw | UseAllOriginZones$ True | AILogic$ Timetwister | SpellDescription$ Each player shuffles their graveyard and hand into their library, then draws seven cards. Exile CARDNAME. You untap up to six lands.
+A:SP$ ChangeZoneAll | Cost$ 4 U U | ChangeType$ Card | Origin$ Hand,Graveyard | Destination$ Library | Shuffle$ True | Random$ True | SubAbility$ DBDraw | UseAllOriginZones$ True | AILogic$ Timetwister | SpellDescription$ Each player shuffles their hand and graveyard into their library, then draws seven cards. Exile CARDNAME. You untap up to six lands.
SVar:DBDraw:DB$ Draw | NumCards$ 7 | Defined$ Player | SubAbility$ DBChange | StackDescription$ None
SVar:DBChange:DB$ ChangeZone | Origin$ Stack | Destination$ Exile | SubAbility$ DBUntap | StackDescription$ None
SVar:DBUntap:DB$ Untap | UntapUpTo$ True | UntapType$ Land | Amount$ 6 | StackDescription$ None
SVar:Picture:http://www.wizards.com/global/images/magic/general/time_spiral.jpg
-Oracle:Exile Time Spiral. Each player shuffles their graveyard and hand into their library, then draws seven cards. You untap up to six lands.
+Oracle:Exile Time Spiral. Each player shuffles their hand and graveyard into their library, then draws seven cards. You untap up to six lands.
diff --git a/forge-gui/res/cardsfolder/t/tolarian_emissary.txt b/forge-gui/res/cardsfolder/t/tolarian_emissary.txt
index c2c0e7fb6e0..fc2883ec0c2 100644
--- a/forge-gui/res/cardsfolder/t/tolarian_emissary.txt
+++ b/forge-gui/res/cardsfolder/t/tolarian_emissary.txt
@@ -7,5 +7,6 @@ K:Kicker:1 W
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, destroy target enchantment.
SVar:TrigKicker:DB$Destroy | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment
DeckHints:Color$White
+SVar:NeedsToPlayKicked:Enchantment.OppCtrl
SVar:Picture:http://www.wizards.com/global/images/magic/general/tolarian_emissary.jpg
Oracle:Kicker {1}{W} (You may pay an additional {1}{W} as you cast this spell.)\nFlying\nWhen Tolarian Emissary enters the battlefield, if it was kicked, destroy target enchantment.
diff --git a/forge-gui/res/cardsfolder/t/transguild_courier.txt b/forge-gui/res/cardsfolder/t/transguild_courier.txt
index 43ff467cc3a..eb86b048b17 100644
--- a/forge-gui/res/cardsfolder/t/transguild_courier.txt
+++ b/forge-gui/res/cardsfolder/t/transguild_courier.txt
@@ -4,4 +4,4 @@ Types:Artifact Creature Golem
S:Mode$ Continuous | EffectZone$ All | Affected$ Card.Self | CharacteristicDefining$ True | SetColor$ All | Description$ CARDNAME is all colors.
PT:3/3
SVar:Picture:http://www.wizards.com/global/images/magic/general/transguild_courier.jpg
-Oracle:Transguild Courier is all colors
+Oracle:Transguild Courier is all colors.
diff --git a/forge-gui/res/cardsfolder/upcoming/treefolk_umbra.txt b/forge-gui/res/cardsfolder/t/treefolk_umbra.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/treefolk_umbra.txt
rename to forge-gui/res/cardsfolder/t/treefolk_umbra.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/treetop_ambusher.txt b/forge-gui/res/cardsfolder/t/treetop_ambusher.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/treetop_ambusher.txt
rename to forge-gui/res/cardsfolder/t/treetop_ambusher.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/tribute_mage.txt b/forge-gui/res/cardsfolder/t/tribute_mage.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/tribute_mage.txt
rename to forge-gui/res/cardsfolder/t/tribute_mage.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/trumpeting_herd.txt b/forge-gui/res/cardsfolder/t/trumpeting_herd.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/trumpeting_herd.txt
rename to forge-gui/res/cardsfolder/t/trumpeting_herd.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/trustworthy_scout.txt b/forge-gui/res/cardsfolder/t/trustworthy_scout.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/trustworthy_scout.txt
rename to forge-gui/res/cardsfolder/t/trustworthy_scout.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/twin_silk_spider.txt b/forge-gui/res/cardsfolder/t/twin_silk_spider.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/twin_silk_spider.txt
rename to forge-gui/res/cardsfolder/t/twin_silk_spider.txt
diff --git a/forge-gui/res/cardsfolder/t/twinflame.txt b/forge-gui/res/cardsfolder/t/twinflame.txt
index cc79e0f2db9..ed5b596eb4b 100644
--- a/forge-gui/res/cardsfolder/t/twinflame.txt
+++ b/forge-gui/res/cardsfolder/t/twinflame.txt
@@ -2,7 +2,7 @@ Name:Twinflame
ManaCost:1 R
Types:Sorcery
K:Strive:2 R
-A:SP$ CopyPermanent | Cost$ 1 R | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | TargetMin$ 0 | TargetMax$ MaxTargets | AddKeywords$ Haste | AtEOT$ Exile | References$ MaxTargets | SpellDescription$ Choose any number of target creatures you control. For each of them, create a token that's a copy of that creature. Those tokens have haste. Exile them at the beginning of the next end step.
+A:SP$ CopyPermanent | Cost$ 1 R | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | TargetMin$ 0 | TargetMax$ MaxTargets | AddKeywords$ Haste | AtEOT$ Exile | References$ MaxTargets | SpellDescription$ Choose any number of target creatures you control. For each of them, create a token that's a copy of that creature, except it has haste. Exile those tokens at the beginning of the next end step.
SVar:MaxTargets:Count$Valid Creature.YouCtrl
SVar:Picture:http://www.wizards.com/global/images/magic/general/twinflame.jpg
-Oracle:Strive — Twinflame costs {2}{R} more to cast for each target beyond the first.\nChoose any number of target creatures you control. For each of them, create a token that's a copy of that creature. Those tokens have haste. Exile them at the beginning of the next end step.
+Oracle:Strive — Twinflame costs {2}{R} more to cast for each target beyond the first.\nChoose any number of target creatures you control. For each of them, create a token that's a copy of that creature, except it has haste. Exile those tokens at the beginning of the next end step.
diff --git a/forge-gui/res/cardsfolder/upcoming/twisted_reflection.txt b/forge-gui/res/cardsfolder/t/twisted_reflection.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/twisted_reflection.txt
rename to forge-gui/res/cardsfolder/t/twisted_reflection.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/umezawas_charm.txt b/forge-gui/res/cardsfolder/u/umezawas_charm.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/umezawas_charm.txt
rename to forge-gui/res/cardsfolder/u/umezawas_charm.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/unbound_flourishing.txt b/forge-gui/res/cardsfolder/u/unbound_flourishing.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/unbound_flourishing.txt
rename to forge-gui/res/cardsfolder/u/unbound_flourishing.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/undead_augur.txt b/forge-gui/res/cardsfolder/u/undead_augur.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/undead_augur.txt
rename to forge-gui/res/cardsfolder/u/undead_augur.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/universal_automaton.txt b/forge-gui/res/cardsfolder/u/universal_automaton.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/universal_automaton.txt
rename to forge-gui/res/cardsfolder/u/universal_automaton.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/unsettled_mariner.txt b/forge-gui/res/cardsfolder/u/unsettled_mariner.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/unsettled_mariner.txt
rename to forge-gui/res/cardsfolder/u/unsettled_mariner.txt
diff --git a/forge-gui/res/cardsfolder/u/unstable_shapeshifter.txt b/forge-gui/res/cardsfolder/u/unstable_shapeshifter.txt
index f78b867c0e5..7a529d1bd57 100644
--- a/forge-gui/res/cardsfolder/u/unstable_shapeshifter.txt
+++ b/forge-gui/res/cardsfolder/u/unstable_shapeshifter.txt
@@ -3,7 +3,7 @@ ManaCost:3 U
Types:Creature Shapeshifter
PT:0/1
# Make SVars for granting abilities and triggers on clones distinct to avoid SVars getting overwritten when cloning a clone
-T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Other | TriggerZones$ Battlefield | Execute$ USCopy | TriggerDescription$ Whenever another creature enters the battlefield, CARDNAME becomes a copy of that creature and gains this ability.
+T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Other | TriggerZones$ Battlefield | Execute$ USCopy | TriggerDescription$ Whenever another creature enters the battlefield, CARDNAME becomes a copy of that creature, except it has this ability.
SVar:USCopy:DB$ Clone | Defined$ TriggeredCard | GainThisAbility$ True
SVar:Picture:http://www.wizards.com/global/images/magic/general/unstable_shapeshifter.jpg
-Oracle:Whenever another creature enters the battlefield, Unstable Shapeshifter becomes a copy of that creature and gains this ability.
+Oracle:Whenever another creature enters the battlefield, Unstable Shapeshifter becomes a copy of that creature, except it has this ability.
diff --git a/forge-gui/res/cardsfolder/u/urborg_emissary.txt b/forge-gui/res/cardsfolder/u/urborg_emissary.txt
index a7ee4913ef4..519a5b00838 100644
--- a/forge-gui/res/cardsfolder/u/urborg_emissary.txt
+++ b/forge-gui/res/cardsfolder/u/urborg_emissary.txt
@@ -5,5 +5,6 @@ PT:3/1
K:Kicker:1 U
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, return target permanent to its owner's hand.
SVar:TrigKicker:DB$ChangeZone | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Origin$ Battlefield | Destination$ Hand
+SVar:NeedsToPlayKicked:Permanent.OppCtrl
SVar:Picture:http://www.wizards.com/global/images/magic/general/urborg_emissary.jpg
Oracle:Kicker {1}{U} (You may pay an additional {1}{U} as you cast this spell.)\nWhen Urborg Emissary enters the battlefield, if it was kicked, return target permanent to its owner's hand.
diff --git a/forge-gui/res/cardsfolder/upcoming/urza_lord_high_artificer.txt b/forge-gui/res/cardsfolder/u/urza_lord_high_artificer.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/urza_lord_high_artificer.txt
rename to forge-gui/res/cardsfolder/u/urza_lord_high_artificer.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/throatseeker.txt b/forge-gui/res/cardsfolder/upcoming/throatseeker.txt
deleted file mode 100644
index 4cf546ada03..00000000000
--- a/forge-gui/res/cardsfolder/upcoming/throatseeker.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-Name:Throatseeker
-ManaCost:2 B
-Types:Creature Vampire Ninja
-PT:3/2
-S:Mode$ Continuous | Affected$ Ninja.attacking+unblocked | AddKeyword$ Lifelink | Description$ Unblocked attacking Ninjas you control have lifelink.
-SVar:PlayMain1:TRUE
-Oracle:Unblocked attacking Ninjas you control have lifelink.
diff --git a/forge-gui/res/cardsfolder/upcoming/valiant_changeling.txt b/forge-gui/res/cardsfolder/v/valiant_changeling.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/valiant_changeling.txt
rename to forge-gui/res/cardsfolder/v/valiant_changeling.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/vengeful_devil.txt b/forge-gui/res/cardsfolder/v/vengeful_devil.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/vengeful_devil.txt
rename to forge-gui/res/cardsfolder/v/vengeful_devil.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/venomous_changeling.txt b/forge-gui/res/cardsfolder/v/venomous_changeling.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/venomous_changeling.txt
rename to forge-gui/res/cardsfolder/v/venomous_changeling.txt
diff --git a/forge-gui/res/cardsfolder/v/verduran_emissary.txt b/forge-gui/res/cardsfolder/v/verduran_emissary.txt
index 5a2a9a1447d..0f8a1b8df4c 100644
--- a/forge-gui/res/cardsfolder/v/verduran_emissary.txt
+++ b/forge-gui/res/cardsfolder/v/verduran_emissary.txt
@@ -6,5 +6,6 @@ K:Kicker:1 R
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, destroy target artifact. It can't be regenerated.
SVar:TrigKicker:DB$Destroy | ValidTgts$ Artifact | NoRegen$ True | TgtPrompt$ Select target artifact
DeckHints:Color$Red
+SVar:NeedsToPlayKicked:Artifact.OppCtrl
SVar:Picture:http://www.wizards.com/global/images/magic/general/verduran_emissary.jpg
Oracle:Kicker {1}{R} (You may pay an additional {1}{R} as you cast this spell.)\nWhen Verduran Emissary enters the battlefield, if it was kicked, destroy target artifact. It can't be regenerated.
diff --git a/forge-gui/res/cardsfolder/upcoming/vesperlark.txt b/forge-gui/res/cardsfolder/v/vesperlark.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/vesperlark.txt
rename to forge-gui/res/cardsfolder/v/vesperlark.txt
diff --git a/forge-gui/res/cardsfolder/v/vesuvan_doppelganger.txt b/forge-gui/res/cardsfolder/v/vesuvan_doppelganger.txt
index 2e0eac3b014..336eb8270ba 100644
--- a/forge-gui/res/cardsfolder/v/vesuvan_doppelganger.txt
+++ b/forge-gui/res/cardsfolder/v/vesuvan_doppelganger.txt
@@ -4,9 +4,9 @@ Types:Creature Shapeshifter
PT:0/0
# Make Svars for granting abilities and triggers on clones distinct to avoid SVars getting overwritten when cloning a clone
K:ETBReplacement:Copy:ChooseCreature:Optional
-SVar:ChooseCreature:DB$ ChooseCard | Defined$ You | Amount$ 1 | Choices$ Creature.Other | SubAbility$ DBCopy | RememberChosen$ True | AILogic$ Clone | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield except it doesn't copy that creature's color and it gains "At the beginning of your upkeep, you may have this creature become a copy of target creature except it doesn't copy that creature's color. If you do, this creature gains this ability."
+SVar:ChooseCreature:DB$ ChooseCard | Defined$ You | Amount$ 1 | Choices$ Creature.Other | SubAbility$ DBCopy | RememberChosen$ True | AILogic$ Clone | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield, except it doesn't copy that creature's color and it has "At the beginning of your upkeep, you may have this creature become a copy of target creature, except it doesn't copy that creature's color and it has this ability."
SVar:DBCopy:DB$ Clone | Defined$ Remembered | Colors$ Blue | OverwriteColors$ True | AddTriggers$ VesDopUpkeepTrig | AddSVars$ VesDopCopy,VesDopUpkeepTrig
-SVar:VesDopUpkeepTrig:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ VesDopCopy | TriggerDescription$ At the beginning of your upkeep, you may have this creature become a copy of target creature except it doesn't copy that creature's color. If you do, this creature gains this ability.
+SVar:VesDopUpkeepTrig:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ VesDopCopy | TriggerDescription$ At the beginning of your upkeep, you may have this creature become a copy of target creature, except it doesn't copy that creature's color and it has this ability.
SVar:VesDopCopy:DB$ Clone | ValidTgts$ Creature | TgtPrompt$ Select target creature to copy. | Optional$ True | Colors$ Blue | OverwriteColors$ True | GainThisAbility$ True | AddSVars$ VesDopCopy | AILogic$ CloneBestCreature | SubAbility$ DBCleanup
SVar:Picture:http://www.wizards.com/global/images/magic/general/vesuvan_doppelganger.jpg
-Oracle:You may have Vesuvan Doppelganger enter the battlefield as a copy of any creature on the battlefield except it doesn't copy that creature's color and it gains "At the beginning of your upkeep, you may have this creature become a copy of target creature except it doesn't copy that creature's color. If you do, this creature gains this ability."
+Oracle:You may have Vesuvan Doppelganger enter the battlefield as a copy of any creature on the battlefield, except it doesn't copy that creature's color and it has "At the beginning of your upkeep, you may have this creature become a copy of target creature, except it doesn't copy that creature's color and it has this ability."
diff --git a/forge-gui/res/cardsfolder/v/vesuvan_shapeshifter.txt b/forge-gui/res/cardsfolder/v/vesuvan_shapeshifter.txt
index c992da26df0..cfaa62f53fe 100644
--- a/forge-gui/res/cardsfolder/v/vesuvan_shapeshifter.txt
+++ b/forge-gui/res/cardsfolder/v/vesuvan_shapeshifter.txt
@@ -4,9 +4,9 @@ Types:Creature Shapeshifter
PT:0/0
K:Morph:1 U
K:ETBReplacement:Copy:DBCopy:Optional
-SVar:DBCopy:DB$ Clone | Choices$ Creature.Other | AddTriggers$ VesShapeUpkeepTrig | AddSVars$ VesShapeTurn,VesShapeUpkeepTrig | Duration$ UntilFacedown | SpellDescription$ As CARDNAME enters the battlefield or is turned face up, you may choose another creature on the battlefield. If you do, until CARDNAME is turned face down, it becomes a copy of that creature and gains "At the beginning of your upkeep, you may turn this creature face down."
+SVar:DBCopy:DB$ Clone | Choices$ Creature.Other | AddTriggers$ VesShapeUpkeepTrig | AddSVars$ VesShapeTurn,VesShapeUpkeepTrig | Duration$ UntilFacedown | SpellDescription$ As CARDNAME enters the battlefield or is turned face up, you may choose another creature on the battlefield. If you do, until CARDNAME is turned face down, it becomes a copy of that creature, except it has "At the beginning of your upkeep, you may turn this creature face down."
SVar:VesShapeUpkeepTrig:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ VesShapeTurn | OptionalDecider$ You | TriggerDescription$ At the beginning of your upkeep, you may turn CARDNAME face down.
SVar:VesShapeTurn:DB$ SetState | Defined$ Self | Mode$ TurnFace
-R:Event$ TurnFaceUp | ValidCard$ Card.Self | Optional$ True | ReplaceWith$ DBCopy | ActiveZones$ Battlefield | Secondary$ True | Description$ As CARDNAME is turned face up, you may choose another creature on the battlefield. If you do, until CARDNAME is turned face down, it becomes a copy of that creature and gains "At the beginning of your upkeep, you may turn this creature face down."
+R:Event$ TurnFaceUp | ValidCard$ Card.Self | Optional$ True | ReplaceWith$ DBCopy | ActiveZones$ Battlefield | Secondary$ True | Description$ As CARDNAME is turned face up, you may choose another creature on the battlefield. If you do, until CARDNAME is turned face down, it becomes a copy of that creature, except it has "At the beginning of your upkeep, you may turn this creature face down."
SVar:Picture:http://www.wizards.com/global/images/magic/general/vesuvan_shapeshifter.jpg
-Oracle:As Vesuvan Shapeshifter enters the battlefield or is turned face up, you may choose another creature on the battlefield. If you do, until Vesuvan Shapeshifter is turned face down, it becomes a copy of that creature and gains "At the beginning of your upkeep, you may turn this creature face down."\nMorph {1}{U} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.)
+Oracle:As Vesuvan Shapeshifter enters the battlefield or is turned face up, you may choose another creature on the battlefield. If you do, until Vesuvan Shapeshifter is turned face down, it becomes a copy of that creature, except it has "At the beginning of your upkeep, you may turn this creature face down."\nMorph {1}{U} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.)
diff --git a/forge-gui/res/cardsfolder/upcoming/viashino_sandsprinter.txt b/forge-gui/res/cardsfolder/v/viashino_sandsprinter.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/viashino_sandsprinter.txt
rename to forge-gui/res/cardsfolder/v/viashino_sandsprinter.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/volatile_claws.txt b/forge-gui/res/cardsfolder/v/volatile_claws.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/volatile_claws.txt
rename to forge-gui/res/cardsfolder/v/volatile_claws.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/wall_of_one_thousand_cuts.txt b/forge-gui/res/cardsfolder/w/wall_of_one_thousand_cuts.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/wall_of_one_thousand_cuts.txt
rename to forge-gui/res/cardsfolder/w/wall_of_one_thousand_cuts.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/warteye_witch.txt b/forge-gui/res/cardsfolder/w/warteye_witch.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/warteye_witch.txt
rename to forge-gui/res/cardsfolder/w/warteye_witch.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/watcher_for_tomorrow.txt b/forge-gui/res/cardsfolder/w/watcher_for_tomorrow.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/watcher_for_tomorrow.txt
rename to forge-gui/res/cardsfolder/w/watcher_for_tomorrow.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/waterlogged_grove.txt b/forge-gui/res/cardsfolder/w/waterlogged_grove.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/waterlogged_grove.txt
rename to forge-gui/res/cardsfolder/w/waterlogged_grove.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/weather_the_storm.txt b/forge-gui/res/cardsfolder/w/weather_the_storm.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/weather_the_storm.txt
rename to forge-gui/res/cardsfolder/w/weather_the_storm.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/webweaver_changeling.txt b/forge-gui/res/cardsfolder/w/webweaver_changeling.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/webweaver_changeling.txt
rename to forge-gui/res/cardsfolder/w/webweaver_changeling.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/windcaller_aven.txt b/forge-gui/res/cardsfolder/w/windcaller_aven.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/windcaller_aven.txt
rename to forge-gui/res/cardsfolder/w/windcaller_aven.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/winding_way.txt b/forge-gui/res/cardsfolder/w/winding_way.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/winding_way.txt
rename to forge-gui/res/cardsfolder/w/winding_way.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/winds_of_abandon.txt b/forge-gui/res/cardsfolder/w/winds_of_abandon.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/winds_of_abandon.txt
rename to forge-gui/res/cardsfolder/w/winds_of_abandon.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/winters_rest.txt b/forge-gui/res/cardsfolder/w/winters_rest.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/winters_rest.txt
rename to forge-gui/res/cardsfolder/w/winters_rest.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/wrenn_and_six.txt b/forge-gui/res/cardsfolder/w/wrenn_and_six.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/wrenn_and_six.txt
rename to forge-gui/res/cardsfolder/w/wrenn_and_six.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/yawgmoth_thran_physician.txt b/forge-gui/res/cardsfolder/y/yawgmoth_thran_physician.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/yawgmoth_thran_physician.txt
rename to forge-gui/res/cardsfolder/y/yawgmoth_thran_physician.txt
diff --git a/forge-gui/res/cardsfolder/upcoming/zhalfirin_decoy.txt b/forge-gui/res/cardsfolder/z/zhalfirin_decoy.txt
similarity index 100%
rename from forge-gui/res/cardsfolder/upcoming/zhalfirin_decoy.txt
rename to forge-gui/res/cardsfolder/z/zhalfirin_decoy.txt
diff --git a/forge-gui/res/editions/Ravnica Allegiance.txt b/forge-gui/res/editions/Ravnica Allegiance.txt
index 9ecee43ba81..bb88b427d96 100644
--- a/forge-gui/res/editions/Ravnica Allegiance.txt
+++ b/forge-gui/res/editions/Ravnica Allegiance.txt
@@ -284,7 +284,7 @@ Booster=10 Common:!fromSheet("RNA Secret Cards"), 3 Uncommon:!fromSheet("RNA Sec
273 M The Haunt of Hightower
[tokens]
-rg_4_4_beast
+rg_4_4_beast_trample
g_3_3_centaur
g_3_3_frog_lizard
r_1_1_goblin
diff --git a/forge-gui/res/formats/Casual/pauper.txt b/forge-gui/res/formats/Casual/pauper.txt
index b1d4f6fbba7..9a7d7f51d72 100644
--- a/forge-gui/res/formats/Casual/pauper.txt
+++ b/forge-gui/res/formats/Casual/pauper.txt
@@ -4,3 +4,4 @@ Order:108
Subtype:Custom
Type:Casual
Rarities:L, C
+Banned:Gush;Gitaxian Probe;Daze
diff --git a/forge-gui/res/formats/Historic/DCI/Arena Standard/2019-02-14.txt b/forge-gui/res/formats/Historic/DCI/Arena Standard/2019-02-14.txt
new file mode 100644
index 00000000000..3fc62fcfa46
--- /dev/null
+++ b/forge-gui/res/formats/Historic/DCI/Arena Standard/2019-02-14.txt
@@ -0,0 +1,7 @@
+[format]
+Name:Arena Standard, 2/14/19
+Type:Historic
+Subtype:Standard
+Effective:2019-02-14
+Sets:XLN, RIX, DOM, M19, GRN, G18, RNA
+Banned:Nexus of Fate; Rampaging Ferocidon
\ No newline at end of file
diff --git a/forge-gui/res/formats/Historic/DCI/Arena Standard/2019-05-24.txt b/forge-gui/res/formats/Historic/DCI/Arena Standard/2019-05-24.txt
new file mode 100644
index 00000000000..4d3103a4f7a
--- /dev/null
+++ b/forge-gui/res/formats/Historic/DCI/Arena Standard/2019-05-24.txt
@@ -0,0 +1,7 @@
+[format]
+Name:Arena Standard, War of the Spark
+Type:Historic
+Subtype:Standard
+Effective:2019-05-24
+Sets:XLN, RIX, DOM, M19, GRN, G18, RNA, WAR
+Banned:Nexus of Fate; Rampaging Ferocidon
\ No newline at end of file
diff --git a/forge-gui/res/formats/Historic/DCI/Arena Standard/China/2019-02-14.txt b/forge-gui/res/formats/Historic/DCI/Arena Standard/China/2019-02-14.txt
new file mode 100644
index 00000000000..ccd3417a3ef
--- /dev/null
+++ b/forge-gui/res/formats/Historic/DCI/Arena Standard/China/2019-02-14.txt
@@ -0,0 +1,7 @@
+[format]
+Name:China Arena Standard, 2/14/19
+Type:Historic
+Subtype:Standard
+Effective:2019-02-14
+Sets:XLN, RIX, DOM, GS1, M19, GRN, G18, RNA
+Banned:Nexus of Fate; Rampaging Ferocidon
\ No newline at end of file
diff --git a/forge-gui/res/formats/Historic/DCI/Arena Standard/China/2019-05-24.txt b/forge-gui/res/formats/Historic/DCI/Arena Standard/China/2019-05-24.txt
new file mode 100644
index 00000000000..b4b4283b026
--- /dev/null
+++ b/forge-gui/res/formats/Historic/DCI/Arena Standard/China/2019-05-24.txt
@@ -0,0 +1,7 @@
+[format]
+Name:China Arena Standard, War of the Spark
+Type:Historic
+Subtype:Standard
+Effective:2019-05-24
+Sets:XLN, RIX, DOM, GS1, M19, GRN, G18, RNA, WAR
+Banned:Nexus of Fate; Rampaging Ferocidon
\ No newline at end of file
diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2018-06-22.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2018-06-22.txt
new file mode 100644
index 00000000000..ee23213ddf6
--- /dev/null
+++ b/forge-gui/res/formats/Historic/DCI/Legacy/2018-06-22.txt
@@ -0,0 +1,7 @@
+[format]
+Name:Legacy, Jiang Yanggu & Mu Yanling
+Type:Historic
+Subtype:Legacy
+Effective:2018-06-22
+Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, 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, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1
+Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, 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, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will
\ No newline at end of file
diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2018-07-06.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2018-07-06.txt
index 01766a2b756..701f7dd49ff 100644
--- a/forge-gui/res/formats/Historic/DCI/Legacy/2018-07-06.txt
+++ b/forge-gui/res/formats/Historic/DCI/Legacy/2018-07-06.txt
@@ -3,5 +3,5 @@ Name:Legacy, 07/06/18
Type:Historic
Subtype:Legacy
Effective:2018-07-06
-Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, 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, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM
+Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, 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, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1
Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Deathrite Shaman, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Gitaxian Probe, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, 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, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will
\ No newline at end of file
diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2018-07-14.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2018-07-14.txt
index 7e2e6603f0d..772b6362eec 100644
--- a/forge-gui/res/formats/Historic/DCI/Legacy/2018-07-14.txt
+++ b/forge-gui/res/formats/Historic/DCI/Legacy/2018-07-14.txt
@@ -3,5 +3,5 @@ Name:Legacy, Core Set 2019
Type:Historic
Subtype:Legacy
Effective:2018-07-14
-Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, 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, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19
+Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, 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, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19
Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Deathrite Shaman, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Gitaxian Probe, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, 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, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will
\ No newline at end of file
diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2018-10-06.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2018-10-06.txt
index 551753dca8a..7e9a7f13a54 100644
--- a/forge-gui/res/formats/Historic/DCI/Legacy/2018-10-06.txt
+++ b/forge-gui/res/formats/Historic/DCI/Legacy/2018-10-06.txt
@@ -3,5 +3,5 @@ Name:Legacy, Guilds of Ravnica
Type:Historic
Subtype:Legacy
Effective:2018-10-06
-Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, 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, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19, GRN
+Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, 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, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, GRN
Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Deathrite Shaman, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Gitaxian Probe, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, 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, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will
\ No newline at end of file
diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2018-11-16.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2018-11-16.txt
new file mode 100644
index 00000000000..ede9f897a3b
--- /dev/null
+++ b/forge-gui/res/formats/Historic/DCI/Legacy/2018-11-16.txt
@@ -0,0 +1,7 @@
+[format]
+Name:Legacy, Gift Pack 2018
+Type:Historic
+Subtype:Legacy
+Effective:2018-16-16
+Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, 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, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, GRN, G18
+Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Deathrite Shaman, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Gitaxian Probe, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, 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, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will
\ No newline at end of file
diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2019-01-25.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2019-01-25.txt
new file mode 100644
index 00000000000..efacdd5ed6f
--- /dev/null
+++ b/forge-gui/res/formats/Historic/DCI/Legacy/2019-01-25.txt
@@ -0,0 +1,7 @@
+[format]
+Name:Legacy, Ravnica Allegiance
+Type:Historic
+Subtype:Legacy
+Effective:2019-01-25
+Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, 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, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, GRN, G18, RNA
+Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Deathrite Shaman, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Gitaxian Probe, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, 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, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will
\ No newline at end of file
diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2019-05-24.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2019-05-24.txt
new file mode 100644
index 00000000000..cd5c2c9382c
--- /dev/null
+++ b/forge-gui/res/formats/Historic/DCI/Legacy/2019-05-24.txt
@@ -0,0 +1,7 @@
+[format]
+Name:Legacy, War of the Spark
+Type:Historic
+Subtype:Legacy
+Effective:2019-05-24
+Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, 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, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, GRN, G18, RNA, WAR
+Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Deathrite Shaman, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Gitaxian Probe, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, 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, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will
\ No newline at end of file
diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2019-06-14.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2019-06-14.txt
new file mode 100644
index 00000000000..870516080f9
--- /dev/null
+++ b/forge-gui/res/formats/Historic/DCI/Legacy/2019-06-14.txt
@@ -0,0 +1,7 @@
+[format]
+Name:Legacy, Modern Horizons
+Type:Historic
+Subtype:Legacy
+Effective:2019-06-14
+Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, 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, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, GRN, G18, RNA, WAR, MH1
+Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Deathrite Shaman, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Gitaxian Probe, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, 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, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will
\ No newline at end of file
diff --git a/forge-gui/res/formats/Historic/DCI/Modern/2018-11-16.txt b/forge-gui/res/formats/Historic/DCI/Modern/2018-11-16.txt
new file mode 100644
index 00000000000..b90246831b6
--- /dev/null
+++ b/forge-gui/res/formats/Historic/DCI/Modern/2018-11-16.txt
@@ -0,0 +1,7 @@
+[format]
+Name:Modern, Gift Pack 2018
+Type:Historic
+Subtype:Modern
+Effective:2018-11-16
+Sets:8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, 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, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19, GRN, G18
+Banned:Ancient Den; Birthing Pod; Blazing Shoal; Chrome Mox; Cloudpost; Dark Depths; Deathrite Shaman; Dig Through Time; Dread Return; Eye of Ugin; Gitaxian Probe; Glimpse of Nature; Golgari Grave-Troll; Great Furnace; Green Sun's Zenith; Hypergenesis; Mental Misstep; Ponder; Preordain; Punishing Fire; Rite of Flame; Seat of the Synod; Second Sunrise; Seething Song; Sensei's Divining Top; Skullclamp; Splinter Twin; Stoneforge Mystic; Summer Bloom; Treasure Cruise; Tree of Tales; Umezawa's Jitte; Vault of Whispers
\ No newline at end of file
diff --git a/forge-gui/res/formats/Historic/DCI/Modern/2019-01-25.txt b/forge-gui/res/formats/Historic/DCI/Modern/2019-01-25.txt
new file mode 100644
index 00000000000..ee5e7de45ca
--- /dev/null
+++ b/forge-gui/res/formats/Historic/DCI/Modern/2019-01-25.txt
@@ -0,0 +1,7 @@
+[format]
+Name:Modern, Ravnica Allegiance
+Type:Historic
+Subtype:Modern
+Effective:2019-01-25
+Sets:8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, 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, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19, GRN, G18, RNA
+Banned:Ancient Den; Birthing Pod; Blazing Shoal; Chrome Mox; Cloudpost; Dark Depths; Deathrite Shaman; Dig Through Time; Dread Return; Eye of Ugin; Gitaxian Probe; Glimpse of Nature; Golgari Grave-Troll; Great Furnace; Green Sun's Zenith; Hypergenesis; Krark-Clan Ironworks; Mental Misstep; Ponder; Preordain; Punishing Fire; Rite of Flame; Seat of the Synod; Second Sunrise; Seething Song; Sensei's Divining Top; Skullclamp; Splinter Twin; Stoneforge Mystic; Summer Bloom; Treasure Cruise; Tree of Tales; Umezawa's Jitte; Vault of Whispers
\ No newline at end of file
diff --git a/forge-gui/res/formats/Historic/DCI/Modern/2019-05-24.txt b/forge-gui/res/formats/Historic/DCI/Modern/2019-05-24.txt
new file mode 100644
index 00000000000..c1a4bafe023
--- /dev/null
+++ b/forge-gui/res/formats/Historic/DCI/Modern/2019-05-24.txt
@@ -0,0 +1,7 @@
+[format]
+Name:Modern, War of the Spark
+Type:Historic
+Subtype:Modern
+Effective:2019-05-24
+Sets:8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, 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, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19, GRN, G18, RNA, WAR
+Banned:Ancient Den; Birthing Pod; Blazing Shoal; Chrome Mox; Cloudpost; Dark Depths; Deathrite Shaman; Dig Through Time; Dread Return; Eye of Ugin; Gitaxian Probe; Glimpse of Nature; Golgari Grave-Troll; Great Furnace; Green Sun's Zenith; Hypergenesis; Krark-Clan Ironworks; Mental Misstep; Ponder; Preordain; Punishing Fire; Rite of Flame; Seat of the Synod; Second Sunrise; Seething Song; Sensei's Divining Top; Skullclamp; Splinter Twin; Stoneforge Mystic; Summer Bloom; Treasure Cruise; Tree of Tales; Umezawa's Jitte; Vault of Whispers
\ No newline at end of file
diff --git a/forge-gui/res/formats/Historic/DCI/Modern/2019-06-14.txt b/forge-gui/res/formats/Historic/DCI/Modern/2019-06-14.txt
new file mode 100644
index 00000000000..d5722822ef8
--- /dev/null
+++ b/forge-gui/res/formats/Historic/DCI/Modern/2019-06-14.txt
@@ -0,0 +1,7 @@
+[format]
+Name:Modern, Modern Horizons
+Type:Historic
+Subtype:Modern
+Effective:2019-06-14
+Sets:8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, 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, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, MH1
+Banned:Ancient Den; Birthing Pod; Blazing Shoal; Chrome Mox; Cloudpost; Dark Depths; Deathrite Shaman; Dig Through Time; Dread Return; Eye of Ugin; Gitaxian Probe; Glimpse of Nature; Golgari Grave-Troll; Great Furnace; Green Sun's Zenith; Hypergenesis; Krark-Clan Ironworks; Mental Misstep; Ponder; Preordain; Punishing Fire; Rite of Flame; Seat of the Synod; Second Sunrise; Seething Song; Sensei's Divining Top; Skullclamp; Splinter Twin; Stoneforge Mystic; Summer Bloom; Treasure Cruise; Tree of Tales; Umezawa's Jitte; Vault of Whispers
\ No newline at end of file
diff --git a/forge-gui/res/formats/Historic/DCI/Pauper/2019-05-24.txt b/forge-gui/res/formats/Historic/DCI/Pauper/2019-05-24.txt
new file mode 100644
index 00000000000..ed5449641c2
--- /dev/null
+++ b/forge-gui/res/formats/Historic/DCI/Pauper/2019-05-24.txt
@@ -0,0 +1,7 @@
+[format]
+Name:Pauper, War of the Spark
+Type:Historic
+Subtype:Custom
+Effective:2019-05-24
+Rarities:L, C
+Banned:Gush;Gitaxian Probe;Daze
diff --git a/forge-gui/res/formats/Historic/DCI/Standard/2018-07-14.txt b/forge-gui/res/formats/Historic/DCI/Standard/2018-07-14.txt
index 1fa39763228..88dedfb8d2d 100644
--- a/forge-gui/res/formats/Historic/DCI/Standard/2018-07-14.txt
+++ b/forge-gui/res/formats/Historic/DCI/Standard/2018-07-14.txt
@@ -2,6 +2,6 @@
Name:Standard, Core Set 2019
Type:Historic
Subtype:Standard
-Effective:2018-04-27
+Effective:2018-07-14
Sets:KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19
Banned:Aetherworks Marvel; Attune with Aether; Felidar Guardian; Rampaging Ferocidon; Ramunap Ruins; Rogue Refiner; Smuggler's Copter
\ No newline at end of file
diff --git a/forge-gui/res/formats/Historic/DCI/Standard/2018-11-16.txt b/forge-gui/res/formats/Historic/DCI/Standard/2018-11-16.txt
new file mode 100644
index 00000000000..e52ee6b3beb
--- /dev/null
+++ b/forge-gui/res/formats/Historic/DCI/Standard/2018-11-16.txt
@@ -0,0 +1,7 @@
+[format]
+Name:Standard, Gift Pack 2018
+Type:Historic
+Subtype:Standard
+Effective:2018-11-16
+Sets:XLN, RIX, DOM, M19, GRN, G18
+Banned:Rampaging Ferocidon
\ No newline at end of file
diff --git a/forge-gui/res/formats/Historic/DCI/Standard/2019-01-25.txt b/forge-gui/res/formats/Historic/DCI/Standard/2019-01-25.txt
new file mode 100644
index 00000000000..458763cc7e6
--- /dev/null
+++ b/forge-gui/res/formats/Historic/DCI/Standard/2019-01-25.txt
@@ -0,0 +1,7 @@
+[format]
+Name:Standard, Ravnica Allegiance
+Type:Historic
+Subtype:Standard
+Effective:2019-01-25
+Sets:XLN, RIX, DOM, M19, GRN, G18, RNA
+Banned:Rampaging Ferocidon
\ No newline at end of file
diff --git a/forge-gui/res/formats/Historic/DCI/Standard/2019-05-24.txt b/forge-gui/res/formats/Historic/DCI/Standard/2019-05-24.txt
new file mode 100644
index 00000000000..f8cd2af1877
--- /dev/null
+++ b/forge-gui/res/formats/Historic/DCI/Standard/2019-05-24.txt
@@ -0,0 +1,7 @@
+[format]
+Name:Standard, War of the Spark
+Type:Historic
+Subtype:Standard
+Effective:2019-05-24
+Sets:XLN, RIX, DOM, M19, GRN, G18, RNA, WAR
+Banned:Rampaging Ferocidon
\ No newline at end of file
diff --git a/forge-gui/res/formats/Historic/DCI/Standard/China/2018-06-22.txt b/forge-gui/res/formats/Historic/DCI/Standard/China/2018-06-22.txt
new file mode 100644
index 00000000000..cf8d7f245c0
--- /dev/null
+++ b/forge-gui/res/formats/Historic/DCI/Standard/China/2018-06-22.txt
@@ -0,0 +1,7 @@
+[format]
+Name:China Standard, Jiang Yanggu & Mu Yanling
+Type:Historic
+Subtype:Standard
+Effective:2018-06-22
+Sets:KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1
+Banned:Aetherworks Marvel; Attune with Aether; Felidar Guardian; Rampaging Ferocidon; Ramunap Ruins; Rogue Refiner; Smuggler's Copter
\ No newline at end of file
diff --git a/forge-gui/res/formats/Historic/DCI/Standard/China/2018-07-14.txt b/forge-gui/res/formats/Historic/DCI/Standard/China/2018-07-14.txt
new file mode 100644
index 00000000000..4fc75027a0c
--- /dev/null
+++ b/forge-gui/res/formats/Historic/DCI/Standard/China/2018-07-14.txt
@@ -0,0 +1,7 @@
+[format]
+Name:China Standard, Core Set 2019
+Type:Historic
+Subtype:Standard
+Effective:2018-07-14
+Sets:KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19
+Banned:Aetherworks Marvel; Attune with Aether; Felidar Guardian; Rampaging Ferocidon; Ramunap Ruins; Rogue Refiner; Smuggler's Copter
\ No newline at end of file
diff --git a/forge-gui/res/formats/Historic/DCI/Standard/China/2018-10-06.txt b/forge-gui/res/formats/Historic/DCI/Standard/China/2018-10-06.txt
new file mode 100644
index 00000000000..9e289328925
--- /dev/null
+++ b/forge-gui/res/formats/Historic/DCI/Standard/China/2018-10-06.txt
@@ -0,0 +1,7 @@
+[format]
+Name:China Standard, Guilds of Ravnica
+Type:Historic
+Subtype:Standard
+Effective:2018-10-06
+Sets:XLN, RIX, DOM, GS1, M19, GRN
+Banned:Rampaging Ferocidon
\ No newline at end of file
diff --git a/forge-gui/res/formats/Historic/DCI/Standard/China/2018-11-16.txt b/forge-gui/res/formats/Historic/DCI/Standard/China/2018-11-16.txt
new file mode 100644
index 00000000000..1a706b8ec8c
--- /dev/null
+++ b/forge-gui/res/formats/Historic/DCI/Standard/China/2018-11-16.txt
@@ -0,0 +1,7 @@
+[format]
+Name:China Standard, Gift Pack 2018
+Type:Historic
+Subtype:Standard
+Effective:2018-11-16
+Sets:XLN, RIX, DOM, GS1, M19, GRN, G18
+Banned:Rampaging Ferocidon
\ No newline at end of file
diff --git a/forge-gui/res/formats/Historic/DCI/Standard/China/2019-01-25.txt b/forge-gui/res/formats/Historic/DCI/Standard/China/2019-01-25.txt
new file mode 100644
index 00000000000..c2b20a6f30b
--- /dev/null
+++ b/forge-gui/res/formats/Historic/DCI/Standard/China/2019-01-25.txt
@@ -0,0 +1,7 @@
+[format]
+Name:China Standard, Ravnica Allegiance
+Type:Historic
+Subtype:Standard
+Effective:2019-01-25
+Sets:XLN, RIX, DOM, GS1, M19, GRN, G18, RNA
+Banned:Rampaging Ferocidon
\ No newline at end of file
diff --git a/forge-gui/res/formats/Historic/DCI/Standard/China/2019-05-24.txt b/forge-gui/res/formats/Historic/DCI/Standard/China/2019-05-24.txt
new file mode 100644
index 00000000000..e8fcaac588f
--- /dev/null
+++ b/forge-gui/res/formats/Historic/DCI/Standard/China/2019-05-24.txt
@@ -0,0 +1,7 @@
+[format]
+Name:China Standard, War of the Spark
+Type:Historic
+Subtype:Standard
+Effective:2019-05-24
+Sets:XLN, RIX, DOM, GS1, M19, GRN, G18, RNA, WAR
+Banned:Rampaging Ferocidon
\ No newline at end of file
diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2018-06-22.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2018-06-22.txt
new file mode 100644
index 00000000000..5e0a2aeeb16
--- /dev/null
+++ b/forge-gui/res/formats/Historic/DCI/Vintage/2018-06-22.txt
@@ -0,0 +1,8 @@
+[format]
+Name:Vintage, Jiang Yanggu & Mu Yanling
+Type:Historic
+Subtype:Vintage
+Effective:2018-06-22
+Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, 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, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1
+Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Gitaxian Probe, Gush, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lodestone Golem, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Monastery Mentor, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thorn of Amethyst, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Will
+Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends
\ No newline at end of file
diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2018-07-14.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2018-07-14.txt
index 983de9d0a19..1e46ab461f3 100644
--- a/forge-gui/res/formats/Historic/DCI/Vintage/2018-07-14.txt
+++ b/forge-gui/res/formats/Historic/DCI/Vintage/2018-07-14.txt
@@ -3,6 +3,6 @@ Name:Vintage, Core Set 2019
Type:Historic
Subtype:Vintage
Effective:2018-07-06
-Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, 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, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19
+Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, 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, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19
Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Gitaxian Probe, Gush, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lodestone Golem, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Monastery Mentor, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thorn of Amethyst, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Will
Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends
\ No newline at end of file
diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2018-10-06.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2018-10-06.txt
index f4baed68ee0..335b48aab8f 100644
--- a/forge-gui/res/formats/Historic/DCI/Vintage/2018-10-06.txt
+++ b/forge-gui/res/formats/Historic/DCI/Vintage/2018-10-06.txt
@@ -3,6 +3,6 @@ Name:Vintage, Guilds of Ravnica
Type:Historic
Subtype:Vintage
Effective:2018-10-06
-Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, 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, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19
+Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, 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, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19
Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Gitaxian Probe, Gush, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lodestone Golem, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Monastery Mentor, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thorn of Amethyst, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Will
Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends
\ No newline at end of file
diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2018-11-16.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2018-11-16.txt
new file mode 100644
index 00000000000..85472a7163e
--- /dev/null
+++ b/forge-gui/res/formats/Historic/DCI/Vintage/2018-11-16.txt
@@ -0,0 +1,8 @@
+[format]
+Name:Vintage, Gift Pack 2018
+Type:Historic
+Subtype:Vintage
+Effective:2018-11-16
+Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, 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, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, G18
+Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Gitaxian Probe, Gush, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lodestone Golem, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Monastery Mentor, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thorn of Amethyst, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Will
+Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends
\ No newline at end of file
diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2019-01-25.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2019-01-25.txt
new file mode 100644
index 00000000000..abb5d3902b8
--- /dev/null
+++ b/forge-gui/res/formats/Historic/DCI/Vintage/2019-01-25.txt
@@ -0,0 +1,8 @@
+[format]
+Name:Vintage, Ravnica Allegiance
+Type:Historic
+Subtype:Vintage
+Effective:2019-01-25
+Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, 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, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, G18, RNA
+Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Gitaxian Probe, Gush, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lodestone Golem, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Monastery Mentor, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thorn of Amethyst, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Will
+Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends
\ No newline at end of file
diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2019-05-24.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2019-05-24.txt
new file mode 100644
index 00000000000..cf7a3a2b78e
--- /dev/null
+++ b/forge-gui/res/formats/Historic/DCI/Vintage/2019-05-24.txt
@@ -0,0 +1,8 @@
+[format]
+Name:Vintage, War of the Spark
+Type:Historic
+Subtype:Vintage
+Effective:2019-05-24
+Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, 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, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, G18, RNA, WAR
+Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Gitaxian Probe, Gush, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lodestone Golem, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Monastery Mentor, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thorn of Amethyst, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Will
+Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends
\ No newline at end of file
diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2019-06-14.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2019-06-14.txt
new file mode 100644
index 00000000000..1f10a6ea9e0
--- /dev/null
+++ b/forge-gui/res/formats/Historic/DCI/Vintage/2019-06-14.txt
@@ -0,0 +1,8 @@
+[format]
+Name:Vintage, Modern Horizons
+Type:Historic
+Subtype:Vintage
+Effective:2019-06-14
+Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, 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, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, G18, RNA, WAR, MH1
+Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Gitaxian Probe, Gush, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lodestone Golem, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Monastery Mentor, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thorn of Amethyst, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Will
+Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends
\ No newline at end of file
diff --git a/forge-gui/src/main/java/forge/achievement/Domain.java b/forge-gui/src/main/java/forge/achievement/Domain.java
index 2aa7c8da680..93b6a397889 100644
--- a/forge-gui/src/main/java/forge/achievement/Domain.java
+++ b/forge-gui/src/main/java/forge/achievement/Domain.java
@@ -1,19 +1,35 @@
package forge.achievement;
-import java.util.HashSet;
-import java.util.Set;
-
import forge.game.Game;
import forge.game.GameType;
import forge.game.card.Card;
import forge.game.player.Player;
import forge.game.zone.ZoneType;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Set;
+
public class Domain extends ProgressiveAchievement {
public Domain() {
super("Domain", "Domain", "Win a game with one of each basic land on the battlefield", "It's nice being able to cast anything you want.");
}
+ private HashMap basicLandMap = new HashMap() {
+ {
+ put("Plains", "Plains");
+ put("Snow-Covered Plains", "Plains");
+ put("Island", "Island");
+ put("Snow-Covered Island", "Island");
+ put("Forest", "Forest");
+ put("Snow-Covered Forest", "Forest");
+ put("Mountain", "Mountain");
+ put("Snow-Covered Mountain", "Mountain");
+ put("Swamp", "Swamp");
+ put("Snow-Covered Swamp", "Swamp");
+ }
+ };
+
@Override
protected boolean eval(Player player, Game game) {
if (game.getRules().hasAppliedVariant(GameType.MomirBasic) || game.getRules().hasAppliedVariant(GameType.MoJhoSto)) {
@@ -23,8 +39,9 @@ public class Domain extends ProgressiveAchievement {
if (player.getOutcome().hasWon()) {
Set basicLands = new HashSet();
for (Card c : player.getCardsIn(ZoneType.Battlefield)) {
- if (c.isBasicLand()) {
- basicLands.add(c.getName());
+ String name = c.getName();
+ if (c.isBasicLand() && basicLandMap.containsKey(name)) {
+ basicLands.add(basicLandMap.get(name));
}
}
return basicLands.size() == 5;
diff --git a/forge-gui/src/main/java/forge/itemmanager/ColumnDef.java b/forge-gui/src/main/java/forge/itemmanager/ColumnDef.java
index 74dc7c3b1ad..4d9087d7b8a 100644
--- a/forge-gui/src/main/java/forge/itemmanager/ColumnDef.java
+++ b/forge-gui/src/main/java/forge/itemmanager/ColumnDef.java
@@ -32,6 +32,7 @@ import forge.limited.DraftRankCache;
import forge.model.FModel;
import java.math.BigDecimal;
+import java.math.RoundingMode;
import java.util.Map.Entry;
public enum ColumnDef {
@@ -533,7 +534,7 @@ public enum ColumnDef {
Double ranking = DraftRankCache.getRanking(cp.getName(), cp.getEdition());
if (ranking != null) {
if (truncate) {
- return new BigDecimal(ranking).setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue();
+ return new BigDecimal(ranking).setScale(4, RoundingMode.HALF_UP).doubleValue();
}
return ranking;
}
diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java
index c011bccd12e..4a7a109d68d 100644
--- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java
+++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java
@@ -522,26 +522,26 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont
tempShow(delayedReveal.getCards());
}
- tempShow(optionList1);
- tempShow(optionList2);
+ tempShow(optionList1);
+ tempShow(optionList2);
if (useSelectCardsInput(optionList1) && useSelectCardsInput(optionList2)) {
final InputSelectFromTwoLists input = new InputSelectFromTwoLists(this, optional, optionList1, optionList2, sa);
input.setCancelAllowed(optional);
input.setMessage(MessageUtil.formatMessage(title, player, targetedPlayer));
input.showAndWait();
- endTempShowCards();
+ endTempShowCards();
return (List) input.getSelected();
- }
+ }
final GameEntityView result1 = getGui().chooseSingleEntityForEffect(title, GameEntityView.getEntityCollection(optionList1), null, optional);
final GameEntityView result2 = getGui().chooseSingleEntityForEffect(title, GameEntityView.getEntityCollection(optionList2), null, (result1==null)?optional:true);
endTempShowCards();
- List results = new ArrayList<>();
- GameEntity entity1 = convertToEntity(result1);
- if (entity1!=null) { results.add((T) entity1); }
- GameEntity entity2 = convertToEntity(result2);
- if (entity2!=null) { results.add((T) entity2); }
+ List results = new ArrayList<>();
+ GameEntity entity1 = convertToEntity(result1);
+ if (entity1!=null) { results.add((T) entity1); }
+ GameEntity entity2 = convertToEntity(result2);
+ if (entity2!=null) { results.add((T) entity2); }
return results;
}
@@ -1502,7 +1502,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont
game.getTracker().unfreeze();
}
final List possible = CharmEffect.makePossibleOptions(sa);
- HashMap spellViewCache = new HashMap<>();
+ LinkedHashMap spellViewCache = new LinkedHashMap<>();
for (AbilitySub spellAbility : possible) {
spellViewCache.put(spellAbility.getView(), spellAbility);
}
diff --git a/forge-gui/src/main/java/forge/quest/QuestChallengeGenerator.java b/forge-gui/src/main/java/forge/quest/QuestChallengeGenerator.java
index 73c1dea1a5a..c54958a9143 100644
--- a/forge-gui/src/main/java/forge/quest/QuestChallengeGenerator.java
+++ b/forge-gui/src/main/java/forge/quest/QuestChallengeGenerator.java
@@ -17,7 +17,7 @@ public class QuestChallengeGenerator {
int id = 0;
for (int i=0;i<5;++i) {
QuestEventChallenge qc = getFormatChallenge(FModel.getFormats().getModern());
- qc.setId(new Integer(id).toString());
+ qc.setId(Integer.valueOf(id).toString());
qc.setCreditsReward(1000);
qc.setWinsReqd(MyRandom.getRandom().nextInt(5));
qc.setDifficulty(QuestEventDifficulty.MEDIUM);
@@ -27,7 +27,7 @@ public class QuestChallengeGenerator {
}
for (int i=0;i<5;++i) {
QuestEventChallenge qc = getAIHeadstartChallenge(1);
- qc.setId(new Integer(id).toString());
+ qc.setId(Integer.valueOf(id).toString());
qc.setCreditsReward(1000);
qc.setCardReward("1 multicolor rare");
qc.setWinsReqd(MyRandom.getRandom().nextInt(5));
@@ -37,7 +37,7 @@ public class QuestChallengeGenerator {
}
for (int i=0;i<5;++i) {
QuestEventChallenge qc = getFormatChallenge(FModel.getFormats().get("Legacy"));
- qc.setId(new Integer(id).toString());
+ qc.setId(Integer.valueOf(id).toString());
qc.setCreditsReward(5000);
qc.setCardReward("2 multicolor rares");
qc.setWinsReqd(MyRandom.getRandom().nextInt(25));
@@ -47,7 +47,7 @@ public class QuestChallengeGenerator {
}
for (int i=0;i<5;++i) {
QuestEventChallenge qc = getAIHeadstartChallenge(2);
- qc.setId(new Integer(id).toString());
+ qc.setId(Integer.valueOf(id).toString());
qc.setCreditsReward(5000);
qc.setCardReward("2 multicolor rares");
qc.setWinsReqd(MyRandom.getRandom().nextInt(25));
@@ -57,7 +57,7 @@ public class QuestChallengeGenerator {
}
for (int i=0;i<5;++i) {
QuestEventChallenge qc = getFormatChallenge(FModel.getFormats().get("Vintage"));
- qc.setId(new Integer(id).toString());
+ qc.setId(Integer.valueOf(id).toString());
qc.setCreditsReward(10000);
qc.setCardReward("3 multicolor rares");
qc.setWinsReqd(MyRandom.getRandom().nextInt(50));
@@ -67,7 +67,7 @@ public class QuestChallengeGenerator {
}
for (int i=0;i<5;++i) {
QuestEventChallenge qc = getAIHeadstartChallenge(3);
- qc.setId(new Integer(id).toString());
+ qc.setId(Integer.valueOf(id).toString());
qc.setCreditsReward(10000);
qc.setCardReward("3 multicolor rares");
qc.setWinsReqd(MyRandom.getRandom().nextInt(50));
diff --git a/forge-gui/src/main/java/forge/quest/QuestEventLDADuelManager.java b/forge-gui/src/main/java/forge/quest/QuestEventLDADuelManager.java
index ba453988dbf..281cf71dfc7 100644
--- a/forge-gui/src/main/java/forge/quest/QuestEventLDADuelManager.java
+++ b/forge-gui/src/main/java/forge/quest/QuestEventLDADuelManager.java
@@ -64,11 +64,11 @@ public class QuestEventLDADuelManager implements QuestEventDuelManagerInterface
duel.setTitle(archetype.getName());
duel.setOpponentName(archetype.getName());
QuestEventDifficulty diff = QuestEventDifficulty.EASY;
- if(i <= (new Float(archetypes.size()))*.1){
+ if(i <= Float.valueOf(archetypes.size())*.1){
diff = QuestEventDifficulty.EXPERT;
- }else if(i <= (new Float(archetypes.size()))*.4){
+ }else if(i <= Float.valueOf(archetypes.size())*.4){
diff = QuestEventDifficulty.HARD;
- }else if(i <= (new Float(archetypes.size()))*.7) {
+ }else if(i <= Float.valueOf(archetypes.size())*.7) {
diff = QuestEventDifficulty.MEDIUM;
}
duel.setDifficulty(diff);
diff --git a/forge-gui/src/main/java/forge/quest/QuestUtilUnlockSets.java b/forge-gui/src/main/java/forge/quest/QuestUtilUnlockSets.java
index 2f3140de1c7..d7881334f57 100644
--- a/forge-gui/src/main/java/forge/quest/QuestUtilUnlockSets.java
+++ b/forge-gui/src/main/java/forge/quest/QuestUtilUnlockSets.java
@@ -82,7 +82,7 @@ public class QuestUtilUnlockSets {
}
int price = UNLOCK_COST;
if (mapPrices.containsKey(TextUtil.concatNoSpace(ed.getName(), " Booster Pack"))) {
- price = Math.max(new Double(30 * Math.pow(Math.sqrt(mapPrices.get(TextUtil.concatNoSpace(ed.getName(),
+ price = Math.max(Double.valueOf(30 * Math.pow(Math.sqrt(mapPrices.get(TextUtil.concatNoSpace(ed.getName(),
" Booster Pack"))), 1.70)).intValue(), UNLOCK_COST);
}
price = (int) ((double) price * multiplier);
diff --git a/forge-gui/src/main/java/forge/quest/data/QuestAssets.java b/forge-gui/src/main/java/forge/quest/data/QuestAssets.java
index 8f7b644641b..6140c1d5b64 100644
--- a/forge-gui/src/main/java/forge/quest/data/QuestAssets.java
+++ b/forge-gui/src/main/java/forge/quest/data/QuestAssets.java
@@ -17,6 +17,8 @@
*/
package forge.quest.data;
+import java.lang.reflect.InvocationTargetException;
+
import java.util.EnumMap;
import java.util.HashMap;
import java.util.Map;
@@ -99,7 +101,7 @@ public class QuestAssets {
QuestItemCondition current = this.inventoryItems.get(itemType);
if (!current.getClass().equals(itemType.getModelClass())) {
try {
- QuestItemCondition modern = itemType.getModelClass().newInstance();
+ QuestItemCondition modern = itemType.getModelClass().getDeclaredConstructor().newInstance();
modern.takeDataFrom(current);
current = modern;
inventoryItems.put(itemType, modern);
@@ -107,6 +109,10 @@ public class QuestAssets {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
+ } catch (InvocationTargetException e) {
+ e.printStackTrace();
+ } catch (NoSuchMethodException e) {
+ e.printStackTrace();
}
}
@@ -123,7 +129,7 @@ public class QuestAssets {
QuestItemCondition cond = this.inventoryItems.get(itemType);
if (null == cond) {
try { // care to set appropriate state class here
- cond = itemType.getModelClass().newInstance();
+ cond = itemType.getModelClass().getDeclaredConstructor().newInstance();
} catch (final Exception e) {
e.printStackTrace();
cond = new QuestItemCondition();
diff --git a/forge-gui/src/main/java/forge/util/AbstractGeneticAlgorithm.java b/forge-gui/src/main/java/forge/util/AbstractGeneticAlgorithm.java
index 16bfdb33025..c19d45f3eb0 100644
--- a/forge-gui/src/main/java/forge/util/AbstractGeneticAlgorithm.java
+++ b/forge-gui/src/main/java/forge/util/AbstractGeneticAlgorithm.java
@@ -18,13 +18,13 @@ public abstract class AbstractGeneticAlgorithm {
protected abstract T expandPool();
public void pruneWeakest(){
- population = population.subList(0, new Float(population.size()*pruneRatio).intValue());
+ population = population.subList(0, Float.valueOf(population.size()*pruneRatio).intValue());
}
protected void generateChildren(){
int prunedSize = population.size();
while(population.size()0.85f){
T child = mutateObject(population.get(randomIndex));
@@ -34,7 +34,7 @@ public abstract class AbstractGeneticAlgorithm {
}else if(rand>0.70f){
int secondIndex = randomIndex;
while(secondIndex != randomIndex){
- secondIndex = new Double(prunedSize*Math.pow(MyRandom.getRandom().nextDouble(), 0.25)/2d).intValue();
+ secondIndex = Double.valueOf(prunedSize*Math.pow(MyRandom.getRandom().nextDouble(), 0.25)/2d).intValue();
}
T child = createChild(population.get(randomIndex)
, population.get(secondIndex));
diff --git a/forge-gui/src/main/java/forge/util/XmlReader.java b/forge-gui/src/main/java/forge/util/XmlReader.java
index bcf544b6cbc..9b2c3eeabae 100644
--- a/forge-gui/src/main/java/forge/util/XmlReader.java
+++ b/forge-gui/src/main/java/forge/util/XmlReader.java
@@ -181,7 +181,7 @@ public class XmlReader {
final T result;
if (collectionToLoad == null) {
try {
- result = collectionType.newInstance();
+ result = collectionType.getDeclaredConstructor().newInstance();
}
catch (Exception e) {
e.printStackTrace();
diff --git a/pom.xml b/pom.xml
index 9c0b3538532..c3d837508c5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
forge
pom
Forge Parent
- 1.6.26-SNAPSHOT
+ 1.6.27-SNAPSHOT
Forge lets you play the card game Magic: The Gathering against a computer opponent using all of the rules.