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";