diff --git a/forge-game/src/main/java/forge/game/Game.java b/forge-game/src/main/java/forge/game/Game.java
index 47997c1b8bc..ec4f8aa927d 100644
--- a/forge-game/src/main/java/forge/game/Game.java
+++ b/forge-game/src/main/java/forge/game/Game.java
@@ -20,9 +20,12 @@ package forge.game;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.HashBasedTable;
import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Multimap;
+import com.google.common.collect.Table;
import com.google.common.eventbus.EventBus;
import forge.card.CardRarity;
import forge.card.CardStateName;
@@ -53,6 +56,8 @@ import forge.util.Visitor;
import java.util.*;
+import org.apache.commons.lang3.tuple.Pair;
+
/**
* Represents the state of a single game, a new instance is created for each game.
*/
@@ -86,6 +91,8 @@ public class Game {
private Map attackedThisTurn = Maps.newHashMap();
private Map attackedLastTurn = Maps.newHashMap();
+ private Table>> countersAddedThisTurn = HashBasedTable.create();
+
private Player monarch = null;
private Player monarchBeginTurn = null;
@@ -939,4 +946,46 @@ public class Game {
}
return result;
}
+
+ public void onCleanupPhase() {
+ clearCounterAddedThisTurn();
+ for (Player player : getPlayers()) {
+ player.onCleanupPhase();
+ }
+ }
+
+ public void addCounterAddedThisTurn(Player putter, CounterType cType, Card card, Integer value) {
+ if (putter == null || card == null || value <= 0) {
+ return;
+ }
+ List> result = countersAddedThisTurn.get(cType, putter);
+ if (result == null) {
+ result = Lists.newArrayList();
+ }
+ result.add(Pair.of(CardUtil.getLKICopy(card), value));
+ if (!countersAddedThisTurn.contains(cType, putter)) {
+ countersAddedThisTurn.put(cType, putter, result);
+ }
+ }
+
+ public int getCounterAddedThisTurn(CounterType cType, String validPlayer, String validCard, Card source, Player sourceController, SpellAbility spellAbility) {
+ int result = 0;
+ if (!countersAddedThisTurn.containsRow(cType)) {
+ return result;
+ }
+ for (Map.Entry>> e : countersAddedThisTurn.row(cType).entrySet()) {
+ if (e.getKey().isValid(validPlayer.split(","), sourceController, source, spellAbility)) {
+ for (Pair p : e.getValue()) {
+ if (p.getKey().isValid(validCard.split(","), sourceController, source, spellAbility)) {
+ result += p.getValue();
+ }
+ }
+ }
+ }
+ return result;
+ }
+
+ public void clearCounterAddedThisTurn() {
+ countersAddedThisTurn.clear();
+ }
}
diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java
index 939d23a9e35..3cba6e96b75 100644
--- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java
+++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java
@@ -1593,6 +1593,8 @@ public class AbilityUtils {
final String[] sq;
sq = l[0].split("\\.");
+ final Game game = c.getGame();
+
if (ctb != null) {
// Count$Compare ..
if (sq[0].startsWith("Compare")) {
@@ -1776,6 +1778,13 @@ public class AbilityUtils {
}
}
}
+
+ if (l[0].startsWith("CountersAddedThisTurn")) {
+ final String[] parts = l[0].split(" ");
+ CounterType cType = CounterType.getType(parts[1]);
+
+ return CardFactoryUtil.doXMath(game.getCounterAddedThisTurn(cType, parts[2], parts[3], c, sa.getActivatingPlayer(), sa), expr, c);
+ }
}
}
return CardFactoryUtil.xCount(c, s2);
diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java
index 2238fabfdca..58cafdaa90b 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java
@@ -201,6 +201,26 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
}
}
sb.append(" Then shuffle that library.");
+ } else if (origin.equals("Sideboard")) {
+ sb.append(chooserNames);
+ //currently Reveal is always True in ChangeZone
+ if (sa.hasParam("Reveal")) {
+ sb.append(" may reveal ").append(num).append(" ").append(type).append(" from outside the game and put ");
+ if (num == 1) {
+ sb.append("it ");
+ } else {
+ sb.append("them ");
+ }
+ sb.append("into their ").append(destination.toLowerCase()).append(".");
+ } else {
+ if (sa.hasParam("Mandatory")) {
+ sb.append(" puts ");
+ } else {
+ sb.append(" may put ");
+ }
+ sb.append(num).append(" ").append(type).append(" from outside the game into their ");
+ sb.append(destination.toLowerCase()).append(".");
+ }
} else if (origin.equals("Hand")) {
sb.append(chooserNames);
if (!chooserNames.equals(fetcherNames)) {
diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java
index d26f2fc876f..53513d27e4d 100644
--- a/forge-game/src/main/java/forge/game/card/Card.java
+++ b/forge-game/src/main/java/forge/game/card/Card.java
@@ -1239,7 +1239,7 @@ public class Card extends GameEntity implements Comparable {
final int loyaltyBefore = getCurrentLoyalty();
setCounters(counterType, newValue);
- getController().addCounterToPermThisTurn(counterType, addAmount);
+ getGame().addCounterAddedThisTurn(source, counterType, this, addAmount);
view.updateCounters(this);
//fire card stats changed event if p/t bonuses or loyalty changed from added counters
@@ -1267,7 +1267,8 @@ public class Card extends GameEntity implements Comparable {
}
} else {
setCounters(counterType, newValue);
- getController().addCounterToPermThisTurn(counterType, addAmount);
+
+ getGame().addCounterAddedThisTurn(source, counterType, this, addAmount);
view.updateCounters(this);
}
if (newValue <= 0) {
diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java
index d1f5edd6eef..02ceebfc0d1 100644
--- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java
+++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java
@@ -841,14 +841,6 @@ public class CardFactoryUtil {
return doXMath(maxNum, m, c);
}
- // Count$CountersAddedToPermYouCtrl
- if (l[0].startsWith("CountersAddedToPermYouCtrl")) {
- final String[] components = l[0].split(" ", 2);
- final CounterType counterType = CounterType.getType(components[1]);
- int n = cc.getCounterToPermThisTurn(counterType);
- return doXMath(n, m, c);
- }
-
if (l[0].startsWith("CommanderCastFromCommandZone")) {
// only used by Opal Palace, and it does add the trigger to the card
return doXMath(cc.getCommanderCast(c), m, c);
diff --git a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java
index 85d5c500d95..42a01547121 100644
--- a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java
+++ b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java
@@ -501,9 +501,7 @@ public class PhaseHandler implements java.io.Serializable {
bPreventCombatDamageThisTurn = false;
if (!bRepeatCleanup) {
// only call onCleanupPhase when Cleanup is not repeated
- for (Player player : game.getPlayers()) {
- player.onCleanupPhase();
- }
+ game.onCleanupPhase();
setPlayerTurn(handleNextTurn());
// "Trigger" for begin turn to get around a phase skipping
final Map runParams = AbilityKey.newMap();
diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java
index 3637fc98ca2..322c564b284 100644
--- a/forge-game/src/main/java/forge/game/player/Player.java
+++ b/forge-game/src/main/java/forge/game/player/Player.java
@@ -114,8 +114,6 @@ public class Player extends GameEntity implements Comparable {
private CardCollection sacrificedThisTurn = new CardCollection();
- private Map countersAddedtoPermThisTurn = Maps.newHashMap();
-
/** A list of tokens not in play, but on their way.
* This list is kept in order to not break ETB-replacement
* on tokens. */
@@ -2289,20 +2287,6 @@ public class Player extends GameEntity implements Comparable {
sacrificedThisTurn.clear();
}
- public final void addCounterToPermThisTurn(final CounterType type, final int x) {
- countersAddedtoPermThisTurn.put(type, getCounterToPermThisTurn(type) + x);
- }
-
- public final Integer getCounterToPermThisTurn(final CounterType type) {
- if (countersAddedtoPermThisTurn.containsKey(type))
- return countersAddedtoPermThisTurn.get(type);
- return 0;
- }
-
- public final void resetCounterToPermThisTurn() {
- countersAddedtoPermThisTurn.clear();
- }
-
public final int getSpellsCastThisTurn() {
return spellsCastThisTurn;
}
@@ -2521,7 +2505,6 @@ public class Player extends GameEntity implements Comparable {
resetSurveilThisTurn();
resetCycledThisTurn();
resetSacrificedThisTurn();
- resetCounterToPermThisTurn();
clearAssignedDamage();
resetAttackersDeclaredThisTurn();
resetAttackedOpponentsThisTurn();
diff --git a/forge-gui-mobile/src/forge/Forge.java b/forge-gui-mobile/src/forge/Forge.java
index 5fd62b0e4c0..4f3bf3c0acd 100644
--- a/forge-gui-mobile/src/forge/Forge.java
+++ b/forge-gui-mobile/src/forge/Forge.java
@@ -37,7 +37,6 @@ import forge.util.Localizer;
import forge.util.Utils;
import java.io.File;
-import java.io.FileFilter;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
@@ -160,25 +159,17 @@ public class Forge implements ApplicationListener {
private void preloadExtendedArt() {
if (!enablePreloadExtendedArt)
return;
- List keys = new ArrayList<>();
- File[] directories = new File(ForgeConstants.CACHE_CARD_PICS_DIR).listFiles(new FileFilter() {
- @Override
- public boolean accept(File file) {
- if (!file.getName().startsWith("MPS_"))
- return false;
- return file.isDirectory();
- }
- });
- for (File folder : directories) {
- File[] files = new File(folder.toString()).listFiles();
- for (File file : files) {
- if (file.isFile()) {
- keys.add(folder.getName() + "/" +file.getName().replace(".jpg","").replace(".png",""));
- }
- }
+ List BorderlessCardlistkeys = FileUtil.readFile(ForgeConstants.BORDERLESS_CARD_LIST_FILE);
+ if(BorderlessCardlistkeys.isEmpty())
+ return;
+ List filteredkeys = new ArrayList<>();
+ for (String cardname : BorderlessCardlistkeys){
+ File image = new File(ForgeConstants.CACHE_CARD_PICS_DIR+"/"+cardname+".jpg");
+ if (image.exists())
+ filteredkeys.add(cardname);
}
- if (!keys.isEmpty())
- ImageCache.preloadCache((Iterable)keys);
+ if (!filteredkeys.isEmpty())
+ ImageCache.preloadCache(filteredkeys);
}
private void afterDbLoaded() {
diff --git a/forge-gui-mobile/src/forge/assets/ImageCache.java b/forge-gui-mobile/src/forge/assets/ImageCache.java
index bf85d66b8fb..b9eeef19029 100644
--- a/forge-gui-mobile/src/forge/assets/ImageCache.java
+++ b/forge-gui-mobile/src/forge/assets/ImageCache.java
@@ -27,6 +27,7 @@ import com.google.common.cache.LoadingCache;
import com.google.common.cache.RemovalCause;
import com.google.common.cache.RemovalListener;
import com.google.common.cache.RemovalNotification;
+import forge.Forge;
import forge.ImageKeys;
import forge.card.CardEdition;
import forge.card.CardRenderer;
@@ -106,6 +107,8 @@ public class ImageCache {
}
public static void disposeTexture(){
+ if (Forge.enablePreloadExtendedArt)
+ return;
for (Texture t: cache.asMap().values()) {
if (!t.toString().contains("pics/icons")) //fixes quest avatars black texture. todo: filter textures that are safe to dispose...
t.dispose();
diff --git a/forge-gui-mobile/src/forge/assets/ImageLoader.java b/forge-gui-mobile/src/forge/assets/ImageLoader.java
index 064300ae635..06a111f9d49 100644
--- a/forge-gui-mobile/src/forge/assets/ImageLoader.java
+++ b/forge-gui-mobile/src/forge/assets/ImageLoader.java
@@ -1,7 +1,7 @@
package forge.assets;
import java.io.File;
-import java.util.ArrayList;
+import java.util.List;
import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.graphics.Color;
@@ -14,142 +14,14 @@ import forge.FThreads;
import forge.Forge;
import forge.ImageKeys;
+import forge.properties.ForgeConstants;
+import forge.util.FileUtil;
import forge.util.TextUtil;
import static forge.assets.ImageCache.croppedBorderImage;
final class ImageLoader extends CacheLoader {
- private static ArrayList borderlessCardlistKey = new ArrayList() {
- {//TODO: load the values from text list instead of hardcoded
- add("2XM/Academy Ruins2.fullborder");
- add("2XM/Atraxa, Praetors' Voice2.fullborder");
- add("2XM/Avacyn, Angel of Hope2.fullborder");
- add("2XM/Batterskull2.fullborder");
- add("2XM/Blightsteel Colossus2.fullborder");
- add("2XM/Blood Moon2.fullborder");
- add("2XM/Brainstorm2.fullborder");
- add("2XM/Chrome Mox2.fullborder");
- add("2XM/Council's Judgment2.fullborder");
- add("2XM/Crop Rotation2.fullborder");
- add("2XM/Cyclonic Rift2.fullborder");
- add("2XM/Dark Confidant2.fullborder");
- add("2XM/Doubling Season2.fullborder");
- add("2XM/Expedition Map2.fullborder");
- add("2XM/Exploration2.fullborder");
- add("2XM/Fatal Push2.fullborder");
- add("2XM/Force of Will2.fullborder");
- add("2XM/Goblin Guide2.fullborder");
- add("2XM/Jace, the Mind Sculptor2.fullborder");
- add("2XM/Kaalia of the Vast2.fullborder");
- add("2XM/Karn Liberated2.fullborder");
- add("2XM/Lightning Greaves2.fullborder");
- add("2XM/Mana Crypt2.fullborder");
- add("2XM/Meddling Mage2.fullborder");
- add("2XM/Mox Opal2.fullborder");
- add("2XM/Noble Hierarch2.fullborder");
- add("2XM/Phyrexian Metamorph2.fullborder");
- add("2XM/Sneak Attack2.fullborder");
- add("2XM/Stoneforge Mystic2.fullborder");
- add("2XM/Sword of Body and Mind2.fullborder");
- add("2XM/Sword of Feast and Famine2.fullborder");
- add("2XM/Sword of Fire and Ice2.fullborder");
- add("2XM/Sword of Light and Shadow2.fullborder");
- add("2XM/Sword of War and Peace2.fullborder");
- add("2XM/Thoughtseize2.fullborder");
- add("2XM/Toxic Deluge2.fullborder");
- add("2XM/Urza's Mine2.fullborder");
- add("2XM/Urza's Power Plant2.fullborder");
- add("2XM/Urza's Tower2.fullborder");
- add("2XM/Wurmcoil Engine2.fullborder");
- add("ELD/Garruk, Cursed Huntsman2.fullborder");
- add("ELD/Oko, Thief of Crowns2.fullborder");
- add("ELD/The Royal Scions2.fullborder");
- add("IKO/Brokkos, Apex of Forever2.fullborder");
- add("IKO/Brokkos, Apex of Forever3.fullborder");
- add("IKO/Crystalline Giant3.fullborder");
- add("IKO/Cubwarden2.fullborder");
- add("IKO/Dirge Bat2.fullborder");
- add("IKO/Dirge Bat3.fullborder");
- add("IKO/Everquill Phoenix2.fullborder");
- add("IKO/Everquill Phoenix3.fullborder");
- add("IKO/Gemrazer2.fullborder");
- add("IKO/Gemrazer3.fullborder");
- add("IKO/Gyruda, Doom of Depths3.fullborder");
- add("IKO/Huntmaster Liger2.fullborder");
- add("IKO/Huntmaster Liger3.fullborder");
- add("IKO/Illuna, Apex of Wishes2.fullborder");
- add("IKO/Illuna, Apex of Wishes3.fullborder");
- add("IKO/Indatha Triome2.fullborder");
- add("IKO/Ketria Triome2.fullborder");
- add("IKO/Lukka, Coppercoat Outcast2.fullborder");
- add("IKO/Luminous Broodmoth3.fullborder");
- add("IKO/Mysterious Egg2.fullborder");
- add("IKO/Narset of the Ancient Way2.fullborder");
- add("IKO/Nethroi, Apex of Death2.fullborder");
- add("IKO/Nethroi, Apex of Death3.fullborder");
- add("IKO/Pollywog Symbiote2.fullborder");
- add("IKO/Raugrin Triome2.fullborder");
- add("IKO/Savai Triome2.fullborder");
- add("IKO/Sea-Dasher Octopus2.fullborder");
- add("IKO/Snapdax, Apex of the Hunt2.fullborder");
- add("IKO/Snapdax, Apex of the Hunt3.fullborder");
- add("IKO/Sprite Dragon3.fullborder");
- add("IKO/Titanoth Rex2.fullborder");
- add("IKO/Vadrok, Apex of Thunder2.fullborder");
- add("IKO/Vadrok, Apex of Thunder3.fullborder");
- add("IKO/Vivien, Monsters' Advocate2.fullborder");
- add("IKO/Void Beckoner2.fullborder");
- add("IKO/Yidaro, Wandering Monster3.fullborder");
- add("IKO/Zagoth Triome2.fullborder");
- add("IKO/Zilortha, Strength Incarnate.fullborder");
- add("M21/Basri Ket2.fullborder");
- add("M21/Chandra, Heart of Fire2.fullborder");
- add("M21/Containment Priest2.fullborder");
- add("M21/Cultivate2.fullborder");
- add("M21/Garruk, Unleashed2.fullborder");
- add("M21/Grim Tutor2.fullborder");
- add("M21/Liliana, Waker of the Dead2.fullborder");
- add("M21/Massacre Wurm2.fullborder");
- add("M21/Scavenging Ooze2.fullborder");
- add("M21/Solemn Simulacrum2.fullborder");
- add("M21/Teferi, Master of Time2.fullborder");
- add("M21/Ugin, the Spirit Dragon2.fullborder");
- add("M21/Ugin, the Spirit Dragon3.fullborder");
- add("PLGS/Hangarback Walker.fullborder");
- add("SLD/Acidic Slime.fullborder");
- add("SLD/Captain Sisay.fullborder");
- add("SLD/Meren of Clan Nel Toth.fullborder");
- add("SLD/Narset, Enlightened Master.fullborder");
- add("SLD/Necrotic Ooze.fullborder");
- add("SLD/Oona, Queen of the Fae.fullborder");
- add("SLD/Saskia the Unyielding.fullborder");
- add("SLD/The Mimeoplasm.fullborder");
- add("SLD/Voidslime.fullborder");
- add("THB/Ashiok, Nightmare Muse2.fullborder");
- add("THB/Calix, Destiny's Hand2.fullborder");
- add("THB/Elspeth, Sun's Nemesis2.fullborder");
- add("UST/Forest.fullborder");
- add("UST/Island.fullborder");
- add("UST/Mountain.fullborder");
- add("UST/Plains.fullborder");
- add("UST/Swamp.fullborder");
- add("ZNR/Boulderloft Pathway2.fullborder");
- add("ZNR/Branchloft Pathway2.fullborder");
- add("ZNR/Brightclimb Pathway2.fullborder");
- add("ZNR/Clearwater Pathway2.fullborder");
- add("ZNR/Cragcrown Pathway2.fullborder");
- add("ZNR/Grimclimb Pathway2.fullborder");
- add("ZNR/Jace, Mirror Mage2.fullborder");
- add("ZNR/Lavaglide Pathway2.fullborder");
- add("ZNR/Murkwater Pathway2.fullborder");
- add("ZNR/Nahiri, Heir of the Ancients2.fullborder");
- add("ZNR/Needleverge Pathway2.fullborder");
- add("ZNR/Nissa of Shadowed Boughs2.fullborder");
- add("ZNR/Pillarverge Pathway2.fullborder");
- add("ZNR/Riverglide Pathway2.fullborder");
- add("ZNR/Timbercrown Pathway2.fullborder");
- }
- };
+ private static List borderlessCardlistKey = FileUtil.readFile(ForgeConstants.BORDERLESS_CARD_LIST_FILE);
Texture n;
@Override
@@ -240,6 +112,8 @@ final class ImageLoader extends CacheLoader {
}
public boolean isBorderless(String imagekey) {
+ if(borderlessCardlistKey.isEmpty())
+ return false;
if (imagekey.length() > 7) {
if ((!imagekey.substring(0, 7).contains("MPS_KLD"))&&(imagekey.substring(0, 4).contains("MPS_"))) //MPS_ sets except MPD_KLD
return true;
@@ -248,6 +122,8 @@ final class ImageLoader extends CacheLoader {
}
public static boolean isBorderless(Texture t) {
+ if(borderlessCardlistKey.isEmpty())
+ return false;
//generated texture/pixmap?
if (t.toString().contains("com.badlogic.gdx.graphics.Texture@"))
return true;
diff --git a/forge-gui/res/cardsfolder/b/burning_wish.txt b/forge-gui/res/cardsfolder/b/burning_wish.txt
index a6fe901792b..385441aebf9 100644
--- a/forge-gui/res/cardsfolder/b/burning_wish.txt
+++ b/forge-gui/res/cardsfolder/b/burning_wish.txt
@@ -1,8 +1,7 @@
Name:Burning Wish
ManaCost:1 R
Types:Sorcery
-A:SP$ ChangeZone | Cost$ 1 R | Origin$ Sideboard | Destination$ Hand | ChangeType$ Sorcery.YouOwn | ChangeNum$ 1 | SubAbility$ DBChange | SpellDescription$ You may choose a sorcery card you own from outside the game, reveal that card, and put it into your hand. Exile CARDNAME.
+A:SP$ ChangeZone | Cost$ 1 R | Reveal$ True | Origin$ Sideboard | Destination$ Hand | ChangeType$ Sorcery.YouOwn | ChangeTypeDesc$ sorcery card they own | ChangeNum$ 1 | SubAbility$ DBChange | Hidden$ True | SpellDescription$ You may reveal a sorcery card you own from outside the game and put it into your hand. Exile CARDNAME.
SVar:DBChange:DB$ ChangeZone | Origin$ Stack | Destination$ Exile
AI:RemoveDeck:Random
-SVar:Picture:http://www.wizards.com/global/images/magic/general/burning_wish.jpg
-Oracle:You may choose a sorcery card you own from outside the game, reveal that card, and put it into your hand. Exile Burning Wish.
+Oracle:You may reveal a sorcery card you own from outside the game and put it into your hand. Exile Burning Wish.
diff --git a/forge-gui/res/cardsfolder/c/coax_from_the_blind_eternities.txt b/forge-gui/res/cardsfolder/c/coax_from_the_blind_eternities.txt
index a624eab00b3..31311802bc4 100644
--- a/forge-gui/res/cardsfolder/c/coax_from_the_blind_eternities.txt
+++ b/forge-gui/res/cardsfolder/c/coax_from_the_blind_eternities.txt
@@ -1,7 +1,6 @@
Name:Coax from the Blind Eternities
ManaCost:2 U
Types:Sorcery
-A:SP$ ChangeZone | Cost$ 2 U | Origin$ Sideboard,Exile | Destination$ Hand | ChangeType$ Card.Eldrazi+YouOwn | ChangeNum$ 1 | SpellDescription$ You may choose an Eldrazi card you own from outside the game or in exile, reveal that card, and put it into your hand.
+A:SP$ ChangeZone | Cost$ 2 U | Origin$ Sideboard,Exile | Destination$ Hand | ChangeType$ Card.Eldrazi+YouOwn | ChangeNum$ 1 | Hidden$ True | Reveal$ True | StackDescription$ {p:You} may reveal an Eldrazi card they own from outside the game or in exile and put it into their hand. | SpellDescription$ You may reveal an Eldrazi card you own from outside the game or in exile and put it into your hand.
AI:RemoveDeck:Random
-SVar:Picture:http://www.wizards.com/global/images/magic/general/coax_from_the_blind_eternities.jpg
-Oracle:You may choose an Eldrazi card you own from outside the game or in exile, reveal that card, and put it into your hand.
\ No newline at end of file
+Oracle:You may reveal an Eldrazi card you own from outside the game or in exile and put it into your hand.
diff --git a/forge-gui/res/cardsfolder/c/cunning_wish.txt b/forge-gui/res/cardsfolder/c/cunning_wish.txt
index 489db144b0e..be2fc159cab 100644
--- a/forge-gui/res/cardsfolder/c/cunning_wish.txt
+++ b/forge-gui/res/cardsfolder/c/cunning_wish.txt
@@ -1,8 +1,7 @@
Name:Cunning Wish
ManaCost:2 U
Types:Instant
-A:SP$ ChangeZone | Cost$ 2 U | Origin$ Sideboard | Destination$ Hand | ChangeType$ Instant.YouOwn | ChangeNum$ 1 | SubAbility$ DBChange | SpellDescription$ You may choose an instant card you own from outside the game, reveal that card, and put it into your hand. Exile CARDNAME.
+A:SP$ ChangeZone | Cost$ 2 U | Reveal$ True | Origin$ Sideboard | Destination$ Hand | ChangeType$ Instant.YouOwn | ChangeTypeDesc$ instant card they own | ChangeNum$ 1 | SubAbility$ DBChange | Hidden$ True | SpellDescription$ You may reveal an instant card you own from outside the game and put it into your hand. Exile CARDNAME.
SVar:DBChange:DB$ ChangeZone | Origin$ Stack | Destination$ Exile
AI:RemoveDeck:Random
-SVar:Picture:http://www.wizards.com/global/images/magic/general/cunning_wish.jpg
-Oracle:You may choose an instant card you own from outside the game, reveal that card, and put it into your hand. Exile Cunning Wish.
+Oracle:You may reveal an instant card you own from outside the game and put it into your hand. Exile Cunning Wish.
diff --git a/forge-gui/res/cardsfolder/d/death_wish.txt b/forge-gui/res/cardsfolder/d/death_wish.txt
index 3cae9ac46a4..c6399d065df 100644
--- a/forge-gui/res/cardsfolder/d/death_wish.txt
+++ b/forge-gui/res/cardsfolder/d/death_wish.txt
@@ -1,10 +1,9 @@
Name:Death Wish
ManaCost:1 B B
Types:Sorcery
-A:SP$ ChangeZone | Cost$ 1 B B | Origin$ Sideboard | Destination$ Hand | ChangeType$ Card.YouOwn | ChangeNum$ 1 | SubAbility$ DBLoseLife | SpellDescription$ You may choose a card you own from outside the game and put it into your hand. You lose half your life, rounded up. Exile CARDNAME.
+A:SP$ ChangeZone | Cost$ 1 B B | Origin$ Sideboard | Destination$ Hand | ChangeType$ Card.YouOwn | ChangeTypeDesc$ card they own | ChangeNum$ 1 | SubAbility$ DBLoseLife | Hidden$ True | SpellDescription$ You may put a card you own from outside the game into your hand. You lose half your life, rounded up. Exile CARDNAME.
SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ X | References$ X | SubAbility$ DBChange
SVar:DBChange:DB$ ChangeZone | Origin$ Stack | Destination$ Exile
SVar:X:Count$YourLifeTotal/HalfUp
AI:RemoveDeck:Random
-SVar:Picture:http://www.wizards.com/global/images/magic/general/death_wish.jpg
-Oracle:You may choose a card you own from outside the game and put it into your hand. You lose half your life, rounded up. Exile Death Wish.
+Oracle:You may put a card you own from outside the game into your hand. You lose half your life, rounded up. Exile Death Wish.
diff --git a/forge-gui/res/cardsfolder/f/fae_of_wishes_granted.txt b/forge-gui/res/cardsfolder/f/fae_of_wishes_granted.txt
index 9745ecee112..a51df6109d5 100644
--- a/forge-gui/res/cardsfolder/f/fae_of_wishes_granted.txt
+++ b/forge-gui/res/cardsfolder/f/fae_of_wishes_granted.txt
@@ -12,5 +12,5 @@ ALTERNATE
Name:Granted
ManaCost:3 U
Types:Sorcery Adventure
-A:SP$ ChangeZone | Cost$ 3 U | Origin$ Sideboard | Destination$ Hand | ChangeType$ Card.nonCreature+YouOwn | ChangeNum$ 1 | SpellDescription$ You may choose a noncreature card you own from outside the game, reveal it, and put it into your hand.
-Oracle:You may choose a noncreature card you own from outside the game, reveal it, and put it into your hand.
+A:SP$ ChangeZone | Cost$ 3 U | Origin$ Sideboard | Destination$ Hand | ChangeType$ Card.nonCreature+YouOwn | ChangeTypeDesc$ noncreature card they own | ChangeNum$ 1 | Reveal$ True | Hidden$ True | SpellDescription$ You may reveal a noncreature card you own from outside the game and put it into your hand.
+Oracle:You may reveal a noncreature card you own from outside the game and put it into your hand.
diff --git a/forge-gui/res/cardsfolder/f/fairgrounds_trumpeter.txt b/forge-gui/res/cardsfolder/f/fairgrounds_trumpeter.txt
index b555b2fd221..d2c27378cd3 100644
--- a/forge-gui/res/cardsfolder/f/fairgrounds_trumpeter.txt
+++ b/forge-gui/res/cardsfolder/f/fairgrounds_trumpeter.txt
@@ -5,6 +5,6 @@ PT:2/2
T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | CheckSVar$ X | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of each end step, if a +1/+1 counter was put on a permanent under your control this turn, put a +1/+1 counter on CARDNAME.
SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1
DeckHints:Ability$Counters
-SVar:X:Count$CountersAddedToPermYouCtrl P1P1
-SVar:Picture:http://www.wizards.com/global/images/magic/general/fairgrounds_trumpeter.jpg
+DeckHas:Ability$Counters
+SVar:X:Count$CountersAddedThisTurn P1P1 Player Permanent.YouCtrl
Oracle:At the beginning of each end step, if a +1/+1 counter was put on a permanent under your control this turn, put a +1/+1 counter on Fairgrounds Trumpeter.
diff --git a/forge-gui/res/cardsfolder/g/glittering_wish.txt b/forge-gui/res/cardsfolder/g/glittering_wish.txt
index 15fa5e5aa3d..fc47efc83d9 100644
--- a/forge-gui/res/cardsfolder/g/glittering_wish.txt
+++ b/forge-gui/res/cardsfolder/g/glittering_wish.txt
@@ -1,8 +1,7 @@
Name:Glittering Wish
ManaCost:G W
Types:Sorcery
-A:SP$ ChangeZone | Cost$ G W | Origin$ Sideboard | Destination$ Hand | ChangeType$ Card.MultiColor+YouOwn | ChangeNum$ 1 | SubAbility$ DBChange | SpellDescription$ You may choose a multicolored card you own from outside the game, reveal that card, and put it into your hand. Exile CARDNAME.
+A:SP$ ChangeZone | Cost$ G W | Origin$ Sideboard | Destination$ Hand | ChangeType$ Card.MultiColor+YouOwn | ChangeTypeDesc$ multicolored card they own | ChangeNum$ 1 | Hidden$ True | Reveal$ True | SubAbility$ DBChange | SpellDescription$ You may reveal a multicolored card you own from outside the game and put it into your hand. Exile CARDNAME.
SVar:DBChange:DB$ ChangeZone | Origin$ Stack | Destination$ Exile
AI:RemoveDeck:Random
-SVar:Picture:http://www.wizards.com/global/images/magic/general/glittering_wish.jpg
-Oracle:You may choose a multicolored card you own from outside the game, reveal that card, and put it into your hand. Exile Glittering Wish.
+Oracle:You may reveal a multicolored card you own from outside the game and put it into your hand. Exile Glittering Wish.
diff --git a/forge-gui/res/cardsfolder/g/golden_wish.txt b/forge-gui/res/cardsfolder/g/golden_wish.txt
index 0452d57d10f..1cdfcb22f6d 100644
--- a/forge-gui/res/cardsfolder/g/golden_wish.txt
+++ b/forge-gui/res/cardsfolder/g/golden_wish.txt
@@ -1,8 +1,7 @@
Name:Golden Wish
ManaCost:3 W W
Types:Sorcery
-A:SP$ ChangeZone | Cost$ 3 W W | Origin$ Sideboard | Destination$ Hand | ChangeType$ Artifact.YouOwn,Enchantment.YouOwn | ChangeNum$ 1 | SubAbility$ DBChange | SpellDescription$ You may choose an artifact or enchantment card you own from outside the game, reveal that card, and put it into your hand. Exile CARDNAME.
+A:SP$ ChangeZone | Cost$ 3 W W | Origin$ Sideboard | Destination$ Hand | ChangeType$ Artifact.YouOwn,Enchantment.YouOwn | ChangeTypeDesc$ artifact or enchantment they own | ChangeNum$ 1 | SubAbility$ DBChange | Hidden$ True | Reveal$ True | SpellDescription$ You may reveal an artifact or enchantment card you own from outside the game and put it into your hand. Exile CARDNAME.
SVar:DBChange:DB$ ChangeZone | Origin$ Stack | Destination$ Exile
AI:RemoveDeck:Random
-SVar:Picture:http://www.wizards.com/global/images/magic/general/golden_wish.jpg
-Oracle:You may choose an artifact or enchantment card you own from outside the game, reveal that card, and put it into your hand. Exile Golden Wish.
+Oracle:You may reveal an artifact or enchantment card you own from outside the game and put it into your hand. Exile Golden Wish.
diff --git a/forge-gui/res/cardsfolder/i/iridescent_hornbeetle.txt b/forge-gui/res/cardsfolder/i/iridescent_hornbeetle.txt
new file mode 100644
index 00000000000..9f93bfe7635
--- /dev/null
+++ b/forge-gui/res/cardsfolder/i/iridescent_hornbeetle.txt
@@ -0,0 +1,11 @@
+Name:Iridescent Hornbeetle
+ManaCost:4 G
+Types:Creature Insect
+PT:3/4
+T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ At the beginning of your end step, create a 1/1 green Insect creature token for each +1/+1 counter you've put on creatures under your control this turn.
+SVar:TrigToken:DB$ Token | TokenAmount$ X | References$ X | TokenOwner$ You | TokenScript$ g_1_1_insect
+SVar:X:Count$CountersAddedThisTurn P1P1 You Creature.YouCtrl
+DeckNeeds:Ability$Counters
+DeckHas:Ability$Counters
+Oracle:At the beginning of your end step, create a 1/1 green Insect creature token for each +1/+1 counter you've put on creatures under your control this turn.
+
diff --git a/forge-gui/res/cardsfolder/k/karn_the_great_creator.txt b/forge-gui/res/cardsfolder/k/karn_the_great_creator.txt
index ecfa34f2385..a265961052c 100644
--- a/forge-gui/res/cardsfolder/k/karn_the_great_creator.txt
+++ b/forge-gui/res/cardsfolder/k/karn_the_great_creator.txt
@@ -6,6 +6,6 @@ S:Mode$ Continuous | Affected$ Artifact.OppCtrl | AddHiddenKeyword$ CARDNAME's a
SVar:NonStackingEffect:True
A:AB$ Animate | Cost$ AddCounter<1/LOYALTY> | TargetMin$ 0 | TargetMax$ 1 | Planeswalker$ True | ValidTgts$ Artifact.nonCreature | TgtPrompt$ Select target noncreature artifact | Power$ X | Toughness$ X | Types$ Artifact,Creature | References$ X | UntilYourNextTurn$ True | AILogic$ PTByCMC | SpellDescription$ Until your next turn, up to one target noncreature artifact becomes an artifact creature with power and toughness equal to its converted mana cost.
SVar:X:Targeted$CardManaCost
-A:AB$ ChangeZone | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | Origin$ Sideboard,Exile | Destination$ Hand | ChangeType$ Artifact.YouOwn | ChangeNum$ 1 | SpellDescription$ You may choose an artifact card you own from outside the game or in exile, reveal that card, and put it into your hand.
+A:AB$ ChangeZone | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | Origin$ Sideboard,Exile | Destination$ Hand | ChangeType$ Artifact.YouOwn | ChangeTypeDesc$ artifact they own | ChangeNum$ 1 | Hidden$ True | Reveal$ True | StackDescription$ {p:You} may reveal an artifact card they own from outside the game or in exile and put it into their hand. | SpellDescription$ You may reveal an artifact card you own from outside the game or in exile and put it into your hand.
AI:RemoveDeck:Random
-Oracle:Activated abilities of artifacts your opponents control can't be activated.\n[+1]: Until your next turn, up to one target noncreature artifact becomes an artifact creature with power and toughness equal to its converted mana cost.\n[-2]: You may choose an artifact card you own from outside the game or in exile, reveal that card, and put it into your hand.
+Oracle:Activated abilities of artifacts your opponents control can't be activated.\n[+1]: Until your next turn, up to one target noncreature artifact becomes an artifact creature with power and toughness equal to its converted mana cost.\n[-2]: You may reveal an artifact card you own from outside the game or in exile and put it into your hand.
diff --git a/forge-gui/res/cardsfolder/l/living_wish.txt b/forge-gui/res/cardsfolder/l/living_wish.txt
index 729a86aa84e..2344e43c060 100644
--- a/forge-gui/res/cardsfolder/l/living_wish.txt
+++ b/forge-gui/res/cardsfolder/l/living_wish.txt
@@ -1,8 +1,7 @@
Name:Living Wish
ManaCost:1 G
Types:Sorcery
-A:SP$ ChangeZone | Cost$ 1 G | Origin$ Sideboard | Destination$ Hand | ChangeType$ Creature.YouOwn,Land.YouOwn | ChangeNum$ 1 | SubAbility$ DBChange | SpellDescription$ You may choose a creature or land card you own from outside the game, reveal that card, and put it into your hand. Exile CARDNAME.
+A:SP$ ChangeZone | Cost$ 1 G | Origin$ Sideboard | Destination$ Hand | ChangeType$ Creature.YouOwn,Land.YouOwn | ChangeTypeDesc$ creature or land card they own | ChangeNum$ 1 | Reveal$ True | Hidden$ True | SubAbility$ DBChange | SpellDescription$ You may reveal a creature or land card you own from outside the game and put it into your hand. Exile CARDNAME.
SVar:DBChange:DB$ ChangeZone | Origin$ Stack | Destination$ Exile
AI:RemoveDeck:Random
-SVar:Picture:http://www.wizards.com/global/images/magic/general/living_wish.jpg
-Oracle:You may choose a creature or land card you own from outside the game, reveal that card, and put it into your hand. Exile Living Wish.
+Oracle:You may reveal a creature or land card you own from outside the game and put it into your hand. Exile Living Wish.
diff --git a/forge-gui/res/cardsfolder/m/masterminds_acquisition.txt b/forge-gui/res/cardsfolder/m/masterminds_acquisition.txt
index e65089aff08..7b52ff4a5e6 100644
--- a/forge-gui/res/cardsfolder/m/masterminds_acquisition.txt
+++ b/forge-gui/res/cardsfolder/m/masterminds_acquisition.txt
@@ -3,6 +3,5 @@ ManaCost:2 B B
Types:Sorcery
A:SP$ Charm | Cost$ 2 B B | Choices$ DBSearch,DBWish
SVar:DBSearch:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Card | ChangeNum$ 1 | Mandatory$ True | SpellDescription$ Search your library for a card, put it into your hand, then shuffle your library.
-SVar:DBWish:DB$ ChangeZone | Origin$ Sideboard | Destination$ Hand | ChangeType$ Card.YouOwn | ChangeNum$ 1 | Mandatory$ True | SpellDescription$ Choose a card you own from outside the game and put it into your hand.
-SVar:Picture:http://www.wizards.com/global/images/magic/general/masterminds_acquisition.jpg
-Oracle:Choose one —\n• Search your library for a card, put it into your hand, then shuffle your library.\n• Choose a card you own from outside the game and put it into your hand.
+SVar:DBWish:DB$ ChangeZone | Origin$ Sideboard | Destination$ Hand | ChangeType$ Card.YouOwn | ChangeNum$ 1 | Mandatory$ True | Hidden$ True | SpellDescription$ Put a card you own from outside the game into your hand.
+Oracle:Choose one —\n• Search your library for a card, put it into your hand, then shuffle your library.\n• Put a card you own from outside the game into your hand.
diff --git a/forge-gui/res/cardsfolder/m/muldrotha_the_gravetide.txt b/forge-gui/res/cardsfolder/m/muldrotha_the_gravetide.txt
index 8f6f434bd20..7cdd05608e9 100644
--- a/forge-gui/res/cardsfolder/m/muldrotha_the_gravetide.txt
+++ b/forge-gui/res/cardsfolder/m/muldrotha_the_gravetide.txt
@@ -2,9 +2,9 @@ Name:Muldrotha, the Gravetide
ManaCost: 3 B G U
Types:Legendary Creature Elemental Avatar
PT:6/6
-S:Mode$ Continuous | Affected$ Land.YouCtrl | Condition$ PlayerTurn | MayPlay$ True | MayPlayLimit$ 1 | MayPlayText$ Land | EffectZone$ Battlefield | AffectedZone$ Graveyard | Description$ During each of your turns, you may play up to one permanent card of each permanent type from your graveyard. (If a card has multiple permanent types, choose one as you play it.)
+S:Mode$ Continuous | Affected$ Land.YouCtrl | Condition$ PlayerTurn | MayPlay$ True | MayPlayLimit$ 1 | MayPlayText$ Land | EffectZone$ Battlefield | AffectedZone$ Graveyard | Description$ During each of your turns, you may play a land and cast a permanent spell of each permanent type from your graveyard. (If a card has multiple permanent types, choose one as you play it.)
S:Mode$ Continuous | Affected$ Creature.YouCtrl | Condition$ PlayerTurn | MayPlay$ True | MayPlayLimit$ 1 | MayPlayText$ Creature | EffectZone$ Battlefield | AffectedZone$ Graveyard
S:Mode$ Continuous | Affected$ Planeswalker.YouCtrl | Condition$ PlayerTurn | MayPlay$ True | MayPlayLimit$ 1 | MayPlayText$ Planeswalker | EffectZone$ Battlefield | AffectedZone$ Graveyard
S:Mode$ Continuous | Affected$ Artifact.YouCtrl | Condition$ PlayerTurn | MayPlay$ True | MayPlayLimit$ 1 | MayPlayText$ Artifact | EffectZone$ Battlefield | AffectedZone$ Graveyard
S:Mode$ Continuous | Affected$ Enchantment.YouCtrl | Condition$ PlayerTurn | MayPlay$ True | MayPlayLimit$ 1 | MayPlayText$ Enchantment | EffectZone$ Battlefield | AffectedZone$ Graveyard
-Oracle:During each of your turns, you may play up to one permanent card of each permanent type from your graveyard. (If a card has multiple permanent types, choose one as you play it.)
+Oracle:During each of your turns, you may play a land and cast a permanent spell of each permanent type from your graveyard. (If a card has multiple permanent types, choose one as you play it.)
diff --git a/forge-gui/res/cardsfolder/r/research_development.txt b/forge-gui/res/cardsfolder/r/research_development.txt
index d08db5cd8b8..58e5fd69ca8 100644
--- a/forge-gui/res/cardsfolder/r/research_development.txt
+++ b/forge-gui/res/cardsfolder/r/research_development.txt
@@ -2,10 +2,9 @@ Name:Research
ManaCost:G U
AlternateMode: Split
Types:Instant
-A:SP$ ChangeZone | Cost$ G U | Origin$ Sideboard | Destination$ Library | Shuffle$ True | ChangeType$ Card.YouOwn | ChangeNum$ 4 | SpellDescription$ Choose up to four cards you own from outside the game and shuffle them into your library.
+A:SP$ ChangeZone | Cost$ G U | Origin$ Sideboard | Destination$ Library | Shuffle$ True | ChangeType$ Card.YouOwn | ChangeNum$ 4 | Hidden$ True | StackDescription$ {p:You} shuffles up to four cards they own from outside the game into their library. | SpellDescription$ Shuffle up to four cards you own from outside the game into your library.
AI:RemoveDeck:Random
-SVar:Picture:http://www.wizards.com/global/images/magic/general/researchdevelopment.jpg
-Oracle:Choose up to four cards you own from outside the game and shuffle them into your library.
+Oracle:Shuffle up to four cards you own from outside the game into your library.
ALTERNATE
diff --git a/forge-gui/res/cardsfolder/r/ring_of_maruf.txt b/forge-gui/res/cardsfolder/r/ring_of_maruf.txt
index baef9a0593c..25d7fb2d790 100644
--- a/forge-gui/res/cardsfolder/r/ring_of_maruf.txt
+++ b/forge-gui/res/cardsfolder/r/ring_of_maruf.txt
@@ -1,11 +1,10 @@
Name:Ring of Ma'ruf
ManaCost:5
Types:Artifact
-A:AB$ Effect | Cost$ 5 T Exile<1/CARDNAME> | Name$ Ring of Ma'ruf Effect | ReplacementEffects$ DrawReplace | SVars$ ExileEffect,TutorSideboard | SpellDescription$ The next time you would draw a card this turn, instead choose a card you own from outside the game and put it into your hand.
-SVar:DrawReplace:Event$ Draw | ValidPlayer$ You | ReplaceWith$ TutorSideboard | Description$ The next time you would draw a card this turn, instead choose a card you own from outside the game and put it into your hand.
-SVar:TutorSideboard:DB$ ChangeZone | Origin$ Sideboard | Destination$ Hand | ChangeType$ Card.YouOwn | ChangeNum$ 1 | Hidden$ True | SubAbility$ ExileEffect
+A:AB$ Effect | Cost$ 5 T Exile<1/CARDNAME> | Name$ Ring of Ma'ruf Effect | ReplacementEffects$ DrawReplace | SVars$ ExileEffect,TutorSideboard | SpellDescription$ The next time you would draw a card this turn, instead put a card you own from outside the game into your hand.
+SVar:DrawReplace:Event$ Draw | ValidPlayer$ You | ReplaceWith$ TutorSideboard | Description$ The next time you would draw a card this turn, instead put a card you own from outside the game into your hand.
+SVar:TutorSideboard:DB$ ChangeZone | Origin$ Sideboard | Destination$ Hand | ChangeType$ Card.YouOwn | ChangeNum$ 1 | Hidden$ True | Mandatory$ True | SubAbility$ ExileEffect
SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile
AI:RemoveDeck:All
AI:RemoveDeck:Random
-SVar:Picture:http://www.wizards.com/global/images/magic/general/ring_of_maruf.jpg
-Oracle:{5}, {T}, Exile Ring of Ma'ruf: The next time you would draw a card this turn, instead choose a card you own from outside the game and put it into your hand.
+Oracle:{5}, {T}, Exile Ring of Ma'ruf: The next time you would draw a card this turn, instead put a card you own from outside the game into your hand.
diff --git a/forge-gui/res/cardsfolder/s/spawnsire_of_ulamog.txt b/forge-gui/res/cardsfolder/s/spawnsire_of_ulamog.txt
index 55b16fb43b5..d06aa0b16d6 100644
--- a/forge-gui/res/cardsfolder/s/spawnsire_of_ulamog.txt
+++ b/forge-gui/res/cardsfolder/s/spawnsire_of_ulamog.txt
@@ -3,10 +3,9 @@ ManaCost:10
Types:Creature Eldrazi
PT:7/11
K:Annihilator:1
-A:AB$ Token | Cost$ 4 | TokenAmount$ 2 | TokenScript$ c_0_1_eldrazi_spawn_sac | TokenOwner$ You | LegacyImage$ c 0 1 eldrazi spawn sac roe | SpellDescription$ Create two 0/1 colorless Eldrazi Spawn creature tokens. They have "Sacrifice this creature: Add {C}."
-A:AB$ Play | Cost$ 20 | Valid$ Card.Eldrazi+YouOwn | ValidZone$ Sideboard | WithoutManaCost$ True | Amount$ SpawnsireX | Controller$ You | Optional$ True | References$ SpawnsireX | SpellDescription$ Cast any number of Eldrazi cards you own from outside the game without paying their mana costs.
+A:AB$ Token | Cost$ 4 | TokenAmount$ 2 | TokenScript$ c_0_1_eldrazi_spawn_sac | TokenOwner$ You | SpellDescription$ Create two 0/1 colorless Eldrazi Spawn creature tokens. They have "Sacrifice this creature: Add {C}."
+A:AB$ Play | Cost$ 20 | Valid$ Card.Eldrazi+YouOwn | ValidZone$ Sideboard | WithoutManaCost$ True | Amount$ SpawnsireX | Controller$ You | Optional$ True | References$ SpawnsireX | SpellDescription$ Cast any number of Eldrazi spells you own from outside the game without paying their mana costs.
SVar:SpawnsireX:Count$TypeInYourSideboard.Eldrazi
DeckHints:Type$Eldrazi
DeckHas:Ability$Mana.Colorless & Ability$Token
-SVar:Picture:http://www.wizards.com/global/images/magic/general/spawnsire_of_ulamog.jpg
-Oracle:Annihilator 1 (Whenever this creature attacks, defending player sacrifices a permanent.)\n{4}: Create two 0/1 colorless Eldrazi Spawn creature tokens. They have "Sacrifice this creature: Add {C}."\n{20}: Cast any number of Eldrazi cards you own from outside the game without paying their mana costs.
+Oracle:Annihilator 1 (Whenever this creature attacks, defending player sacrifices a permanent.)\n{4}: Create two 0/1 colorless Eldrazi Spawn creature tokens. They have "Sacrifice this creature: Add {C}."\n{20}: Cast any number of Eldrazi spells you own from outside the game without paying their mana costs.
diff --git a/forge-gui/res/cardsfolder/v/vivien_arkbow_ranger.txt b/forge-gui/res/cardsfolder/v/vivien_arkbow_ranger.txt
index 950bc622fe7..a581e010550 100644
--- a/forge-gui/res/cardsfolder/v/vivien_arkbow_ranger.txt
+++ b/forge-gui/res/cardsfolder/v/vivien_arkbow_ranger.txt
@@ -7,6 +7,6 @@ SVar:DBPumpAll:DB$ Pump | KW$ Trample | Defined$ Targeted
A:AB$ Pump | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | SubAbility$ SoulsDamage | AILogic$ Fight | StackDescription$ None | SpellDescription$ Target creature you control deals damage equal to its power to target creature or planeswalker.
SVar:SoulsDamage:DB$ DealDamage | ValidTgts$ Creature,Planeswalker | AILogic$ PowerDmg | TgtPrompt$ Select target creature or planeswalker | NumDmg$ X | References$ X | DamageSource$ ParentTarget
SVar:X:ParentTargeted$CardPower
-A:AB$ ChangeZone | Cost$ SubCounter<5/LOYALTY> | Planeswalker$ True | Ultimate$ True | Origin$ Sideboard | Destination$ Hand | ChangeType$ Creature.YouOwn | ChangeNum$ 1 | SpellDescription$ You may choose a creature card you own from outside the game, reveal it, and put it into your hand.
+A:AB$ ChangeZone | Cost$ SubCounter<5/LOYALTY> | Planeswalker$ True | Ultimate$ True | Origin$ Sideboard | Destination$ Hand | ChangeType$ Creature.YouOwn | ChangeTypeDesc$ creature card they own | ChangeNum$ 1 | Reveal$ True | Hidden$ True | SpellDescription$ You may reveal a creature card you own from outside the game and put it into your hand.
DeckHas:Ability$Counters
-Oracle:[+1]: Distribute two +1/+1 counters among up to two target creatures. They gain trample until end of turn.\n[−3]: Target creature you control deals damage equal to its power to target creature or planeswalker.\n[−5]: You may choose a creature card you own from outside the game, reveal it, and put it into your hand.
+Oracle:[+1]: Distribute two +1/+1 counters among up to two target creatures. They gain trample until end of turn.\n[−3]: Target creature you control deals damage equal to its power to target creature or planeswalker.\n[−5]: You may reveal a creature card you own from outside the game and put it into your hand.
diff --git a/forge-gui/res/cardsfolder/w/wildfire_cerberus.txt b/forge-gui/res/cardsfolder/w/wildfire_cerberus.txt
index 994005e62b5..764d0ab654c 100644
--- a/forge-gui/res/cardsfolder/w/wildfire_cerberus.txt
+++ b/forge-gui/res/cardsfolder/w/wildfire_cerberus.txt
@@ -3,8 +3,7 @@ ManaCost:4 R
Types:Creature Dog
PT:4/3
K:Monstrosity:1:5 R R
-T:Mode$ BecomeMonstrous | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigDamageAll | TriggerDescription$ When CARDNAME becomes monstrous, it deals 2 damage to each opponent and each creature your opponents control.
-SVar:TrigDamageAll:DB$ DamageAll | ValidCards$ Creature.OppCtrl | ValidPlayers$ Player.Opponent | NumDmg$ 2 | ValidDescription$ each opponent and each creature your opponents control.
+T:Mode$ BecomeMonstrous | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigDamageAll | TriggerDescription$ When CARDNAME becomes monstrous, it deals 2 damage to each opponent and each creature they control.
+SVar:TrigDamageAll:DB$ DamageAll | ValidCards$ Creature.OppCtrl | ValidPlayers$ Player.Opponent | NumDmg$ 2 | ValidDescription$ each opponent and each creature they control.
DeckHas:Ability$Counters
-SVar:Picture:http://www.wizards.com/global/images/magic/general/wildfire_cerberus.jpg
-Oracle:{5}{R}{R}: Monstrosity 1. (If this creature isn't monstrous, put a +1/+1 counter on it and it becomes monstrous.)\nWhen Wildfire Cerberus becomes monstrous, it deals 2 damage to each opponent and each creature your opponents control.
+Oracle:{5}{R}{R}: Monstrosity 1. (If this creature isn't monstrous, put a +1/+1 counter on it and it becomes monstrous.)\nWhen Wildfire Cerberus becomes monstrous, it deals 2 damage to each opponent and each creature they control.
diff --git a/forge-gui/res/editions/Zendikar Rising Commander.txt b/forge-gui/res/editions/Zendikar Rising Commander.txt
index 555e14d0cf8..c968d4dd6d2 100644
--- a/forge-gui/res/editions/Zendikar Rising Commander.txt
+++ b/forge-gui/res/editions/Zendikar Rising Commander.txt
@@ -11,3 +11,140 @@ Type=Other
4 R Enigma Thief
5 R Whispersteel Dagger
6 R Geode Rager
+7 M Anowon, the Ruin Thief
+8 M Obuun, Mul Daya Ancestor
+9 U Abzan Falconer
+10 M Admonition Angel
+11 U Banishing Light
+12 U Condemn
+13 U Crush Contraband
+14 U Elite Scaleguard
+15 R Emeria Angel
+16 R Emeria Shepherd
+17 R Hour of Revelation
+18 C Kor Cartographer
+19 R Planar Outburst
+20 U Retreat to Emeria
+21 M Sun Titan
+22 R Together Forever
+23 U Aetherize
+24 C Distant Melody
+25 U Fact or Fiction
+26 U Faerie Vandal
+27 U Invisible Stalker
+28 C Latchkey Faerie
+29 U Marang River Prowler
+30 U Master Thief
+31 U Military Intelligence
+32 U Nightveil Sprite
+33 R Notorious Throng
+34 U Open into Wonder
+35 R Scourge of Fleets
+36 C Slither Blade
+37 R Stolen Identity
+38 C Triton Shorestalker
+39 U Whirler Rogue
+40 C Changeling Outcast
+41 U Endless Obedience
+42 R Fated Return
+43 C Frogtosser Banneret
+44 R Gonti, Lord of Luxury
+45 R In Garruk's Wake
+46 U Marsh Flitter
+47 C Murder
+48 R Necromantic Selection
+49 R Nighthowler
+50 R Ogre Slumlord
+51 U Oona's Blackguard
+52 U Price of Fame
+53 U Rise from the Grave
+54 R Sepulchral Primordial
+55 U Stinkdrinker Bandit
+56 U Syr Konrad, the Grim
+57 U Zulaport Cutthroat
+58 R Abundance
+59 U Acidic Slime
+60 U Armorcraft Judge
+61 U Beanstalk Giant
+62 U Circuitous Route
+63 C Elvish Rejuvenator
+64 U Embodiment of Insight
+65 U Evolution Sage
+66 C Far Wanderings
+67 C Fertilid
+68 U Harmonize
+69 C Harrow
+70 U Inspiring Call
+71 U Keeper of Fables
+72 C Khalni Heart Expedition
+73 C Kodama's Reach
+74 R The Mending of Dominaria
+75 M Multani, Yavimaya's Avatar
+76 R Nissa's Renewal
+77 R Rampaging Baloths
+78 U Retreat to Kazandu
+79 R Return of the Wildspeaker
+80 R Rites of Flourishing
+81 C Satyr Wayfinder
+82 C Sporemound
+83 C Springbloom Druid
+84 R Sylvan Advocate
+85 U Tuskguard Captain
+86 R Waker of the Wilds
+87 C Yavimaya Elder
+88 U Zendikar's Roil
+89 R Consuming Aberration
+90 U Extract from Darkness
+91 U Ground Assault
+92 M Lazav, Dimir Mastermind
+93 R Living Twister
+94 R Mina and Denn, Wildborn
+95 U Naya Charm
+96 R Notion Thief
+97 M Omnath, Locus of Rage
+98 R Oona, Queen of the Fae
+99 R Silumgar's Command
+100 U Soul Manipulation
+101 R Spinal Embrace
+102 U Struggle // Survive
+103 R Sygg, River Cutthroat
+104 U Sylvan Reclamation
+105 U Treacherous Terrain
+106 C Arcane Signet
+107 R Blackblade Reforged
+108 R Bonehoard
+109 C Commander's Sphere
+110 U Dimir Keyrune
+111 C Dimir Locket
+112 U Dimir Signet
+113 U Heirloom Blade
+114 C Mind Stone
+115 R Obelisk of Urd
+116 U Sandstone Oracle
+117 C Scaretiller
+118 R Scytheclaw
+119 R Seer's Sundial
+120 U Sol Ring
+121 U Blighted Woodland
+122 C Boros Garrison
+123 C Boros Guildgate
+124 C Command Tower
+125 U Cryptic Caves
+126 U Dimir Aqueduct
+127 C Dimir Guildgate
+128 C Dismal Backwater
+129 C Evolving Wilds
+130 C Gruul Guildgate
+131 U Gruul Turf
+132 U Jungle Shrine
+133 U Jwar Isle Refuge
+134 U Krosan Verge
+135 U Myriad Landscape
+136 C Naya Panorama
+137 R Needle Spires
+138 U Rogue's Passage
+139 C Selesnya Guildgate
+140 C Selesnya Sanctuary
+141 U Submerged Boneyard
+142 C Terramorphic Expanse
+
diff --git a/forge-gui/res/formats/Sanctioned/Standard.txt b/forge-gui/res/formats/Sanctioned/Standard.txt
index 496a3967104..f9eb4b75357 100644
--- a/forge-gui/res/formats/Sanctioned/Standard.txt
+++ b/forge-gui/res/formats/Sanctioned/Standard.txt
@@ -4,4 +4,4 @@ Order:101
Subtype:Standard
Type:Sanctioned
Sets:ELD, THB, IKO, M21, ZNR
-Banned:Cauldron Familiar; Fires of Invention; Oko, Thief of Crowns; Once Upon a Time; Veil of Summer
+Banned:Cauldron Familiar; Fires of Invention; Oko, Thief of Crowns; Once Upon a Time; Uro, Titan of Nature's Wrath; Veil of Summer
diff --git a/forge-gui/res/languages/de-DE.properties b/forge-gui/res/languages/de-DE.properties
index e5e3e3dbdd1..e3fa8207430 100644
--- a/forge-gui/res/languages/de-DE.properties
+++ b/forge-gui/res/languages/de-DE.properties
@@ -981,7 +981,7 @@ nlVibrateWhenLosingLife=Aktiviert Vibration bei Lebenspunktverlust.
lblEnableRoundBorder=Aktiviere Maske mit runden Ränder
nlEnableRoundBorder=Wenn aktiviert, werden Kartenecken abgerundet. Vorzugsweise bei Karten mit vollem Rand.
lblPreloadExtendedArtCards=Erw. Kartenbilder bei Start laden
-nlPreloadExtendedArtCards=Wenn aktiviert, werden erweiterte Kartenbilder bereits beim Start in den Speicher geladen.
+nlPreloadExtendedArtCards=Wenn aktiviert, werden erweiterte Kartenbilder bereits beim Start in den Speicher geladen (Hohe RAM-Auslastung).
lblShowFPSDisplay=FPS-Anzeige
nlShowFPSDisplay=Aktiviert die Frames-per-second-Anzeige (Experimentell).
lblEnableUnknownCards=Erlaube unbekannte Karten
diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties
index 90d59578556..458070f8a55 100644
--- a/forge-gui/res/languages/en-US.properties
+++ b/forge-gui/res/languages/en-US.properties
@@ -981,7 +981,7 @@ nlVibrateWhenLosingLife=Enable vibration when your player loses life or takes da
lblEnableRoundBorder=Enable Round Border Mask
nlEnableRoundBorder=When enabled, the card corners are rounded (Preferably Card with Full Borders).
lblPreloadExtendedArtCards=Preload Extended Art Cards
-nlPreloadExtendedArtCards=When enabled, Preloads Extended Art Cards to Cache on Startup.
+nlPreloadExtendedArtCards=When enabled, Preloads Extended Art Cards to Cache on Startup (High RAM usage).
lblShowFPSDisplay=Show FPS Display
nlShowFPSDisplay=When enabled, show the FPS Display (Experimental).
lblEnableUnknownCards=Enable Unknown Cards
diff --git a/forge-gui/res/languages/es-ES.properties b/forge-gui/res/languages/es-ES.properties
index 296284bf716..05f2462797f 100644
--- a/forge-gui/res/languages/es-ES.properties
+++ b/forge-gui/res/languages/es-ES.properties
@@ -981,7 +981,7 @@ nlVibrateWhenLosingLife=Habilita la vibración cuando tu jugador pierde vida o s
lblEnableRoundBorder=Habilitar máscara de bordes redondeados
nlEnableRoundBorder=Cuando está habilitado, las esquinas de las cartas se redondean (Preferiblemente Cartas con bordes completos).
lblPreloadExtendedArtCards=Precargar Cartas de Arte Extendido
-nlPreloadExtendedArtCards=Cuando está habilitado, carga previamente las cartas de arte ampliadas en la caché al iniciar el programa.
+nlPreloadExtendedArtCards=Cuando está habilitado, carga previamente las cartas de arte ampliadas en la caché al iniciar el programa (Alto uso de RAM).
lblShowFPSDisplay=Mostrar FPS
nlShowFPSDisplay=Cuando está habilitado, muestra los FPS (Experimental).
lblEnableUnknownCards=Enable Unknown Cards
diff --git a/forge-gui/res/languages/it-IT.properties b/forge-gui/res/languages/it-IT.properties
index 3f1e61e6639..f4d2e2f1a89 100644
--- a/forge-gui/res/languages/it-IT.properties
+++ b/forge-gui/res/languages/it-IT.properties
@@ -981,7 +981,7 @@ nlVibrateWhenLosingLife=Attiva le vibrazioni quando il giocatore perde punti vit
lblEnableRoundBorder=Abilita maschera bordo arrotondato
nlEnableRoundBorder=Se abilitato, gli angoli delle carte sono arrotondati (preferibilmente Carta con bordi pieni).
lblPreloadExtendedArtCards=Carte d''arte estese precaricate
-nlPreloadExtendedArtCards=Se abilitato, precarica le carte artistiche estese nella cache all''avvio.
+nlPreloadExtendedArtCards=Se abilitato, precarica le carte artistiche estese nella cache all''avvio (Utilizzo elevato della RAM).
lblShowFPSDisplay=Mostra display FPS
nlShowFPSDisplay=Se abilitato, mostra il display FPS (sperimentale).
lblEnableUnknownCards=Enable Unknown Cards
diff --git a/forge-gui/res/languages/zh-CN.properties b/forge-gui/res/languages/zh-CN.properties
index 40339a9f4ce..9f3f3203536 100644
--- a/forge-gui/res/languages/zh-CN.properties
+++ b/forge-gui/res/languages/zh-CN.properties
@@ -981,7 +981,7 @@ nlVibrateWhenLosingLife=启用当玩家在游戏中失去生命或收到伤害
lblEnableRoundBorder=启用圆角边框掩码
nlEnableRoundBorder=启用后,卡牌边框会变成圆角(带有完整边框的卡牌图片效果最好)。
lblPreloadExtendedArtCards=预加载拉伸卡图
-nlPreloadExtendedArtCards=启用后,拉伸卡图将在启动时加载到缓存。
+nlPreloadExtendedArtCards=启用后,拉伸卡图将在启动时加载到缓存(使用高内存)。
lblShowFPSDisplay=显示当前的FPS值
nlShowFPSDisplay=启用后,将在画面左上角显示当前Forge的FPS(实验性特性)。
lblEnableUnknownCards=启用未知卡牌
diff --git a/forge-gui/res/lists/borderlessCardList.txt b/forge-gui/res/lists/borderlessCardList.txt
new file mode 100644
index 00000000000..c2b3cbba747
--- /dev/null
+++ b/forge-gui/res/lists/borderlessCardList.txt
@@ -0,0 +1,127 @@
+2XM/Academy Ruins2.fullborder
+2XM/Atraxa, Praetors' Voice2.fullborder
+2XM/Avacyn, Angel of Hope2.fullborder
+2XM/Batterskull2.fullborder
+2XM/Blightsteel Colossus2.fullborder
+2XM/Blood Moon2.fullborder
+2XM/Brainstorm2.fullborder
+2XM/Chrome Mox2.fullborder
+2XM/Council's Judgment2.fullborder
+2XM/Crop Rotation2.fullborder
+2XM/Cyclonic Rift2.fullborder
+2XM/Dark Confidant2.fullborder
+2XM/Doubling Season2.fullborder
+2XM/Expedition Map2.fullborder
+2XM/Exploration2.fullborder
+2XM/Fatal Push2.fullborder
+2XM/Force of Will2.fullborder
+2XM/Goblin Guide2.fullborder
+2XM/Jace, the Mind Sculptor2.fullborder
+2XM/Kaalia of the Vast2.fullborder
+2XM/Karn Liberated2.fullborder
+2XM/Lightning Greaves2.fullborder
+2XM/Mana Crypt2.fullborder
+2XM/Meddling Mage2.fullborder
+2XM/Mox Opal2.fullborder
+2XM/Noble Hierarch2.fullborder
+2XM/Phyrexian Metamorph2.fullborder
+2XM/Sneak Attack2.fullborder
+2XM/Stoneforge Mystic2.fullborder
+2XM/Sword of Body and Mind2.fullborder
+2XM/Sword of Feast and Famine2.fullborder
+2XM/Sword of Fire and Ice2.fullborder
+2XM/Sword of Light and Shadow2.fullborder
+2XM/Sword of War and Peace2.fullborder
+2XM/Thoughtseize2.fullborder
+2XM/Toxic Deluge2.fullborder
+2XM/Urza's Mine2.fullborder
+2XM/Urza's Power Plant2.fullborder
+2XM/Urza's Tower2.fullborder
+2XM/Wurmcoil Engine2.fullborder
+ELD/Garruk, Cursed Huntsman2.fullborder
+ELD/Oko, Thief of Crowns2.fullborder
+ELD/The Royal Scions2.fullborder
+IKO/Brokkos, Apex of Forever2.fullborder
+IKO/Brokkos, Apex of Forever3.fullborder
+IKO/Crystalline Giant3.fullborder
+IKO/Cubwarden2.fullborder
+IKO/Dirge Bat2.fullborder
+IKO/Dirge Bat3.fullborder
+IKO/Everquill Phoenix2.fullborder
+IKO/Everquill Phoenix3.fullborder
+IKO/Gemrazer2.fullborder
+IKO/Gemrazer3.fullborder
+IKO/Gyruda, Doom of Depths3.fullborder
+IKO/Huntmaster Liger2.fullborder
+IKO/Huntmaster Liger3.fullborder
+IKO/Illuna, Apex of Wishes2.fullborder
+IKO/Illuna, Apex of Wishes3.fullborder
+IKO/Indatha Triome2.fullborder
+IKO/Ketria Triome2.fullborder
+IKO/Lukka, Coppercoat Outcast2.fullborder
+IKO/Luminous Broodmoth3.fullborder
+IKO/Mysterious Egg2.fullborder
+IKO/Narset of the Ancient Way2.fullborder
+IKO/Nethroi, Apex of Death2.fullborder
+IKO/Nethroi, Apex of Death3.fullborder
+IKO/Pollywog Symbiote2.fullborder
+IKO/Raugrin Triome2.fullborder
+IKO/Savai Triome2.fullborder
+IKO/Sea-Dasher Octopus2.fullborder
+IKO/Snapdax, Apex of the Hunt2.fullborder
+IKO/Snapdax, Apex of the Hunt3.fullborder
+IKO/Sprite Dragon3.fullborder
+IKO/Titanoth Rex2.fullborder
+IKO/Vadrok, Apex of Thunder2.fullborder
+IKO/Vadrok, Apex of Thunder3.fullborder
+IKO/Vivien, Monsters' Advocate2.fullborder
+IKO/Void Beckoner2.fullborder
+IKO/Yidaro, Wandering Monster3.fullborder
+IKO/Zagoth Triome2.fullborder
+IKO/Zilortha, Strength Incarnate.fullborder
+M21/Basri Ket2.fullborder
+M21/Chandra, Heart of Fire2.fullborder
+M21/Containment Priest2.fullborder
+M21/Cultivate2.fullborder
+M21/Garruk, Unleashed2.fullborder
+M21/Grim Tutor2.fullborder
+M21/Liliana, Waker of the Dead2.fullborder
+M21/Massacre Wurm2.fullborder
+M21/Scavenging Ooze2.fullborder
+M21/Solemn Simulacrum2.fullborder
+M21/Teferi, Master of Time2.fullborder
+M21/Ugin, the Spirit Dragon2.fullborder
+M21/Ugin, the Spirit Dragon3.fullborder
+PLGS/Hangarback Walker.fullborder
+SLD/Acidic Slime.fullborder
+SLD/Captain Sisay.fullborder
+SLD/Meren of Clan Nel Toth.fullborder
+SLD/Narset, Enlightened Master.fullborder
+SLD/Necrotic Ooze.fullborder
+SLD/Oona, Queen of the Fae.fullborder
+SLD/Saskia the Unyielding.fullborder
+SLD/The Mimeoplasm.fullborder
+SLD/Voidslime.fullborder
+THB/Ashiok, Nightmare Muse2.fullborder
+THB/Calix, Destiny's Hand2.fullborder
+THB/Elspeth, Sun's Nemesis2.fullborder
+UST/Forest.fullborder
+UST/Island.fullborder
+UST/Mountain.fullborder
+UST/Plains.fullborder
+UST/Swamp.fullborder
+ZNR/Boulderloft Pathway2.fullborder
+ZNR/Branchloft Pathway2.fullborder
+ZNR/Brightclimb Pathway2.fullborder
+ZNR/Clearwater Pathway2.fullborder
+ZNR/Cragcrown Pathway2.fullborder
+ZNR/Grimclimb Pathway2.fullborder
+ZNR/Jace, Mirror Mage2.fullborder
+ZNR/Lavaglide Pathway2.fullborder
+ZNR/Murkwater Pathway2.fullborder
+ZNR/Nahiri, Heir of the Ancients2.fullborder
+ZNR/Needleverge Pathway2.fullborder
+ZNR/Nissa of Shadowed Boughs2.fullborder
+ZNR/Pillarverge Pathway2.fullborder
+ZNR/Riverglide Pathway2.fullborder
+ZNR/Timbercrown Pathway2.fullborder
\ No newline at end of file
diff --git a/forge-gui/src/main/java/forge/properties/ForgeConstants.java b/forge-gui/src/main/java/forge/properties/ForgeConstants.java
index 00c2bb02ecd..bf1de97acb9 100644
--- a/forge-gui/src/main/java/forge/properties/ForgeConstants.java
+++ b/forge-gui/src/main/java/forge/properties/ForgeConstants.java
@@ -48,6 +48,7 @@ public final class ForgeConstants {
public static final String NET_DECKS_LIST_FILE = LISTS_DIR + "net-decks.txt";
public static final String NET_DECKS_COMMANDER_LIST_FILE = LISTS_DIR + "net-decks-commander.txt";
public static final String NET_DECKS_BRAWL_LIST_FILE = LISTS_DIR + "net-decks-brawl.txt";
+ public static final String BORDERLESS_CARD_LIST_FILE = LISTS_DIR + "borderlessCardList.txt";
public static final String CHANGES_FILE = ASSETS_DIR + "README.txt";